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번과 같은 방법으로 디바이스가 잘 연결되길 바라는 수 밖에 없는 것 같습니다. >.<
건투를 빕니다!
이 게시물이 | |
AiRPAGE가 |
저도 같은 문제로 고생을 했고 같은 방법으로 해결을 하기는 했는데 혹시 저렇게 했을 때 해결된 이유라던지 왜 처음에는 연결이 되자마자 끊겼는지 이유에 대해서 알고 계신것이 있나요 ?