2017-11-29 2 views
0

Folgendes ist meine zuverlässige Gatt-Eigenschaft zuverlässige Schreibfunktion und Byte-Array byte1 hat Wert mehr als 20 Bytes.Bluetooth BLE zuverlässig schreiben funktioniert nicht wie erwartet

private void beginReliableWriteToGattServer(BluetoothDevice device, UUID serviceUUID,UUID charUUID, byte[] byte1){ 

     if(mGatt != null){ 
      BluetoothGattService service = mGatt.getService(serviceUUID); 
      if(service != null){ 
       BluetoothGattCharacteristic gattCharacteristic = service.getCharacteristic(charUUID); 
       if(gattCharacteristic != null){ 
        Logger.d(TAG, "BeginReliable Write="+mGatt.beginReliableWrite()); 
        gattCharacteristic.setValue(byte1); 
        mGatt.writeCharacteristic(gattCharacteristic); 
        Logger.d(TAG, "ExecuteReliable Write="+mGatt.executeReliableWrite()); 

       } 
      } 
     } 
    } 

Below are write Gatt characteristic logs 
BeginReliable Write=true 
ExecuteReliable Write=false 
D/Bluetooth_GATTCallBack: onCharacteristicWrite 17 

Antwort

0

Erstens können Sie nicht mehrere GATT-Anforderungen gleichzeitig ausstehen. Da es sich bei writeCharacteristic und executeReliableWrite um Anfragen an das Peer-Gerät handelt (beginReliableWrite ist keine Anfrage, sondern nur ein Flag im Android-BLE-Stack, dass die folgenden Schreibvorgänge "zuverlässige Schreibvorgänge" sind), müssen Sie erst auf das onCharacteristicWrite warten sende executeReliableWrite.

Nun, in Bezug auf Fehlercode 17, nehme ich an, dies entspricht dem ATT-Fehlercode Unzureichende Ressourcen 0x11. Dazu müssen Sie überprüfen, warum das Peripheriegerät diesen Fehlercode sendet.

Sie sollten auch wissen, dass Android einen Designfehler hat, dass zuverlässige Schreibvorgänge nicht wirklich zuverlässig sind. Das Protokoll besteht darin, dass die Daten zuerst an den Server gesendet werden, woraufhin der Server dieselben Daten an den Client zurücksendet. Gemäß der GATT-Spezifikation muss der Client dann überprüfen, dass die empfangenen Daten den gesendeten Daten entsprechen, andernfalls muss er abgebrochen werden. Unglücklicherweise geht diese Information zwischen dem C- und Java-Layer in Androids Bluetooth-Stack verloren, so dass es keine Möglichkeit gibt, dies zu überprüfen.

Verwandte Themen