DJI mobile SDK 가지고 개발을 할때 드론을 못찾는 현상 해결하기

DJI 드론을 가지고 앱 개발을 할때 M600이나 팬텀4 같은 USB로 연결하는 방식에서는 문제가 생기지 않지만 팬텀3처럼 wifi 망 하나로 핸폰이랑 드론이랑 둘다 연결하는 경우에 발생하는 문제입니다.

아래는 SDK 문서에 나오는 처음 등록하는 소스 부분인데요.

private DJISDKManager.SDKManagerCallback mDJISDKManagerCallback = new DJISDKManager.SDKManagerCallback() {
    //Listens to the SDK registration result
    @Override
    public void onRegister(DJIError error) {
        if(error == DJISDKError.REGISTRATION_SUCCESS) {
            Handler handler = new Handler(Looper.getMainLooper());
            handler.post(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getApplicationContext(), "Register Success", Toast.LENGTH_LONG).show();
                }
            });
            DJISDKManager.getInstance().startConnectionToProduct();
        } else {
            Handler handler = new Handler(Looper.getMainLooper());
            handler.post(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getApplicationContext(), "Register sdk fails, check network is available", Toast.LENGTH_LONG).show();
                }
            });
        }
        Log.e("TAG", error.toString());
    }
    //Listens to the connected product changing, including two parts, component changing or product connection changing.
    @Override
    public void onProductChange(BaseProduct oldProduct, BaseProduct newProduct) {
        mProduct = newProduct;
        if(mProduct != null) {
            mProduct.setBaseProductListener(mDJIBaseProductListener);
        }
        notifyStatusChange();
    }
};

startConnectionToProduct()를 호출하고 콜백 onProductChange가 호출될때까지 발가락 빨면서 마냥 기다려야 했습니다.

근데 이게 안오면 30분이 넘어도 호출되지 않기 때문에 안온다 싶으면 핸드폰 와이파이를 껐다 켠다던지 드론을 껐다켠다던지 이런 짓을 해서 호출 되길 빌었죠.
다시 말하지만 USB랑 핸폰이랑 직결하는 M600PRO 같은 경우엔 그런 일 없이 바로 신호옴

M600pro용 카메라가 아직 도착하지 않은 관계로 영상 받아서 처리 할 일 있으면 팬텀3에 연결해서 사용하는데 이게 연결이 안되니 작업하는데 짜증이 솟구침. (음성으로 욕나옴)

오늘도 작업하다 너무 빡쳐서 “이 XX들은 대체 내부를 어떻게 해놓았길래 안되는거야” 라는 심정으로 SDK 디컴파일 돌려봤습니다 그리고 하나하나 살펴보면서( feat. 음성으로 욕하면서) 방법을 찾아냈습니다.

결론만 말하자면 startConnectionToProduct() 함수호출 뒤에 아래 함수를 호출해주면 됩니다.

DJISDKManager.getInstance().onEvent3MainThread(null);

솔직히 이게 뭐하는 함수인지 감도 안잡히지만 내부를 열어보면

public void onEvent3MainThread(dji.sdksharedlib.hardware.a.a var1) {
	DJILog.d(TAG, "onEvent3MainThread DJISDKManager pushing type: " + var1);
	this.updateValue();
}

이렇게 되어 있지요.
함수가 호출되면 인자값은 그저 로그에 출력해주고 그 밑에 this.updateValue()가 호출되면서 팬텀3가 직빵으로 인식되버리더군요.

으아.. 진짜 이 인식 잘 안되는 문제 때문에 거진 한달동안 이런 저런 삽질은 한거 같은데 젠장.
거기다가 이 함수는 공식 레퍼런스에도 안나옵니다! 버럭!!

출처: http://developer.dji.com/api-reference/android-api/Components/SDKManager/DJISDKManager.html

덤으로 적자면 기본 제공해주는 DJIUI 라이브러리도 뭔가 제대로 작동 안되서 이렇게 뜯어보니 함수는 있는데 내부 구현이 안되어 있거나 혹은 인자값으로 바꾸는거 처럼 해놓고 실제는 인자값은 안쓰는 경우도 있습니다.
그러니 저처럼 DJI SDK 써서 뭔가 플젝 하시는분들은 반드시 SDK Lib 디컴파일 해서 내부 봐 가면서 작업 하세요.

 

ps. 그냥 한달간 DJI SDK 만져본 느낌으로는 이거 개발자가 시간 부족해서 그냥 되는데로 막 올리는거 같음. UI 라이브러리도 사용할려면 내부 SDK는 4.01이던가 구버전을 내장해버렸고 ( 현재 SDK 버전은 4.2)


Comments

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다