2014-03-27 6 views
3

블루투스 LE를 통해 상태 장치에 연결하는 Android 애플리케이션을 작성하는 중입니다. 그러나 마치 GATT 서버에 제대로 연결되어 있지 않은 것처럼 보입니다. 몇 초마다 내 로그 파일에 다음과 같이 표시됩니다.Android 블루투스 LE 오류 : 콜백을 등록하지 못했습니다.

03-27 11:33:39.821: D/BluetoothAdapter(26644): onScanResult() - Device=0C:F3:EE:AA:33:35 RSSI=-53 
03-27 11:33:39.821: I/BluetoothGattActivity(26644): New LE Device: BT-001 @ -53 
03-27 11:33:39.821: I/BluetoothGattActivity(26644): New LE Device matches !!! 
03-27 11:33:39.831: I/BluetoothGattActivity(26644): In the fish function. 
03-27 11:33:39.831: D/BluetoothGatt(26644): connect() - device: 0C:F3:EE:AA:33:35, auto: false 
03-27 11:33:39.831: D/BluetoothGatt(26644): registerApp() 
03-27 11:33:39.831: D/BluetoothGatt(26644): registerApp() - UUID=7155a6e0-5432-42cc-8b05-a080c86aaccb 
03-27 11:33:39.841: I/BluetoothGatt(26644): Client registered, waiting for callback 
03-27 11:33:49.840: E/BluetoothGatt(26644): Failed to register callback 
03-27 11:33:49.840: I/BluetoothGattActivity(26644): myBluetoothGatt is null 

누군가 내 문제가 무엇인지, 어떤 일이 벌어지고 있는지를 알면 도움을받을 수 있습니다. 나는 갤럭시 s4를 사용하고있다. 내 관련 코드가 모두 아래에 있다고 생각합니다.

private void broadcastUpdate(final String action) { 
    final Intent intent = new Intent(action); 
    sendBroadcast(intent); 
} 

private void fish(final BluetoothDevice device) {  
    Log.i(TAG, "In the fish function."); 
    myBluetoothGatt = device.connectGatt(this, false, myGattCallback); 
    Log.i(TAG, "myBluetoothGatt is " + myBluetoothGatt); 
} 

private BluetoothAdapter.LeScanCallback callbackFunction = new BluetoothAdapter.LeScanCallback() { 
    @Override 
    public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { 
     Log.i(TAG, "New LE Device: " + device.getName() + " @ " + rssi); 
     if (DEVICE_NAME.equals(device.getName())) { 
      Log.i(TAG, "New LE Device matches !!!"); 
      fish (device); 
      } 
    } 
}; 

private final BluetoothGattCallback myGattCallback = new BluetoothGattCallback() { 
    @Override 
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
     String intentAction; 
     Log.i(TAG, "We are in the ConnectionStateChanged()."); 
     if (newState == BluetoothProfile.STATE_CONNECTED) { 
      intentAction = ACTION_GATT_CONNECTED; 
      mConnectionState = STATE_CONNECTED; 
      broadcastUpdate(intentAction); 
      Log.i(TAG, "Connected to GATT server."); 
      Log.i(TAG, "Attempting to start service discovery:" + 
        myBluetoothGatt.discoverServices()); 

     } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { 
      intentAction = ACTION_GATT_DISCONNECTED; 
      mConnectionState = STATE_DISCONNECTED; 
      Log.i(TAG, "Disconnected from GATT server."); 
      broadcastUpdate(intentAction); 
     } 
    } 

    @Override 
    public void onServicesDiscovered(BluetoothGatt gatt, int status) { 
     Log.i(TAG, "In area 1"); 
     if (status == BluetoothGatt.GATT_SUCCESS) { 
      broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED); 
      System.out.println("--onServicesDiscovered"); 
     } else { 
      Log.w(TAG, "onServicesDiscovered received: " + status); 
     } 
    } 

    @Override 
    public void onCharacteristicRead(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic,int status) { 
     Log.i(TAG, "In area 2"); 
     if (status == BluetoothGatt.GATT_SUCCESS) { 
      broadcastUpdate(ACTION_DATA_AVAILABLE); 
      Log.i(TAG, "--onCharacteristicRead GATT_SUCCESS"); 
     } 
    } 

    @Override 
    public void onCharacteristicChanged(BluetoothGatt gatt, 
             BluetoothGattCharacteristic characteristic) { 
     Log.i(TAG, "In area 3"); 
     broadcastUpdate(ACTION_DATA_AVAILABLE); 
     System.out.println("--onCharacteristicChanged"); 
    } 
}; 

답변

2

이 특정 형태의 오류에 대한 부분적인 수정이 있습니다. 이 질문에 GATT callback fails to register에서 삼성 기기가 UI 스레드에서 Gatt 발견 시도가 필요하다는 것을 알았습니다.

나를위한 까다로운 부분은 내가 내가 생각한 실에 있지 않다는 것을 깨닫고 있었다. onLeScan 콜백은 UI 스레드에서 반환되는 것이 아니라 Binder 스레드 (적어도 디버거에 따라)에서 반환되었습니다. 나는 내 서비스 발견 코드를 시작한 Runnable을 게시하기 위해 Handler를 사용해야하는 것을 끝내었다.

이유는이 부분 수정이 GATT 연결이 아직 해결하는 방법을 알아 냈하지 않은

04-04 14:21:15.115 9616-9616/BluetoothApp I/BluetoothGatt﹕ Client registered, waiting for callback 
04-04 14:21:15.115 9616-9627/BluetoothApp D/BluetoothGatt﹕ onClientRegistered() - status=0 clientIf=5 

이 행 다음에 널 (null)이 아니라 중지 곳에 지금은 상태에있어 것입니다입니다 이 마지막 문제는, 그러나 이것은 한 걸음 더 나아가 야합니다.

4

device.connectGatt (this, false, myGattCallback) 호출은 주 UIThread에서 수행되어야합니다. 바인드 서비스 내부와 더 통신 사용 방송 수신기에 대한

private void fish(final BluetoothDevice device) { 
     Log.i(TAG, "In the fish function."); 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       myBluetoothGatt = device.connectGatt(this, false, myGattCallback); 
      } 
     }); 
} 
0

등록 모두 콜백 및 device.connectGatt (이, 거짓, myGattCallback) : 는 그래서는 다음과 같이해야한다.

이벤트 나 데이터를받은 후에는 다시 브로드 캐스팅하고 수신자로부터 수신하십시오 (단 하나의 활동 만 사용하고 나머지는 모두 조각 인 경우 별도의 내부 활동으로 작성되어야합니다) .

관련 문제