메뉴 건너뛰기

모바일앱


GATT 신호를 잘 감지하고 블루투스 디바이스도 잘 찾아내었지만,  디바이스에 연결하고자 했더니 곧바로 연결이 되지 않는 현상이 생기더군요.

(이때의 디바이스는 라즈베리파이 입니다)


당시 코드는 아래와 같았습니다,

즉,  Advertising 중인 디바이스를 UUID를 이용해 찾아낸 후 해당 디바이스(_device)에 연결을 시도하는 코드입니다.


:
private BluetoothGatt bleGatt_;

:

GattClientCallback gattClientCb = new GattClientCallback();

bleGatt_= _device.connectGatt( this, false, gattClientCb); //연결시도
         


그랬더니 자꾸만  아래의 콜백에서 _newstate 에 STATE_DISCONNECTED 값이 담겨오는 문제가 있었습니다.

_status는 뜬금없는 '133'이라는 값을 담고 있었습니다. 


@Override
        public void onConnectionStateChange( BluetoothGatt _gatt, int _status, int _newstate ) {
            super.onConnectionStateChange( _gatt, _status, _newstate );
            if( _new_state == BluetoothProfile.STATE_CONNECTED ) {
                :
            } else if ( _newstate == BluetoothProfile.STATE_DISCONNECTED ) {
                :
            }
        }


이에, 구글신을 열심히 뒤졌더니 여러가지 제안들이 있었고 그들중에 저의 문제를 해결한 방법들을 아래와 같이 정리해 보았습니다.


1. 디바이스를 찾았으면 GATT 스캐닝을 종료하고 약 100ms 이후에 찾아낸 디바이스와 연결을 시도하라.

2.  connectGatt 함수의 사용을 아래와 같이 하라.

bleGatt_= _device.connectGatt( this, false, gattClientCb, BluetoothDevice.TRANSPORT_LE);


네, 저는 두번째 방법으로 시원하게 해결이 되더군요. 하지만, 이 함수는 SDK 버전이 23이상에서 지원이 됩니다. 이에, 아래와 같이 SDK 버전을 확인 한 후 호출을 해야 합니다.


:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            bleGatt_= _device.connectGatt( this, false, gattClientCb, BluetoothDevice.TRANSPORT_LE);
        }
        else {
            bleGatt_= _device.connectGatt( this, false, gattClientCb);
        }

SDK가 23미만 버전에서는 인자 수가 3개인 함수를 사용할 수 밖에 없습니다. 이때는 1번과 같은 방법으로 디바이스가 잘 연결되길 바라는 수 밖에 없는 것 같습니다. >.<


건투를 빕니다!


 




위로