0

Ich entwickle eine Android-Anwendung mit BLE. Die Anforderung dieser Anwendung besteht darin, die Spannungsänderung in einer bestimmten Hardware mit verschiedenen Eingängen zu aktualisieren.Android BLE: Nachrichtenlänge Problem

Also schreibe ich die Zeichen an die BLE als 8-Bit-Eingang. Jeder Bitwert enthält eigene Darstellungen. Basierend auf jeder Anfrage antwortet die Hardware und stellt verschiedene Ausgangskombinationen bereit. Die Ausgabe enthält 24 Informationsbytes. Jede Byte-Position repräsentiert einen anderen Wert. zB: Position 1 & 2 repräsentieren Strom, 3 & 4 stellen Spannung usw. dar. Mein Problem hier ist, ich bekomme die Ausgabe als 4 Teile. Jede Nachricht enthält 6 Bytes. Ist es möglich, dasselbe in einer einzigen Nachricht zu erhalten?

Implementierung

public void writeCharacteristic(BluetoothGattCharacteristic characteristic) { 
     if (mBluetoothAdapter == null || mBluetoothGatt == null) {      //Check that we have access to a Bluetooth radio 
      Log.w(TAG, "BluetoothAdapter not initialized"); 
      return; 
     } 
     int test = characteristic.getProperties();          //Get the properties of the characteristic 
     if ((test & BluetoothGattCharacteristic.PROPERTY_WRITE) == 0 && (test & BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) == 0) { //Check that the property is writable 
      return; 
     } 
     DebugLogs.writeToFile("BLE MODULE Before Write " + characteristic); 
     if (mBluetoothGatt.writeCharacteristic(characteristic)) {      //Request the BluetoothGatt to do the Write 
      Log.v(TAG, "****************WRITE CHARACTERISTIC SUCCESSFULL**" + characteristic);        //The request was accepted, this does not mean the write completed 
      DebugLogs.writeToFile("BLE MODULE AFTER Write SUCCESS " + characteristic); 
     } else { 
      Log.d(TAG, "writeCharacteristic failed");         //Write request was not accepted by the BluetoothGatt 
      DebugLogs.writeToFile("BLE MODULE AFTER Write FAIL " + characteristic); 
     } 
    } 

Und die Antwort wird in der Callback-Gatt bekommen

@Override 
     public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { 
      Log.w(TAG, "**ACTION_DATA_AVAILABLE**" + characteristic.getUuid());//Indication or notification was received 
      broadcastUpdate(BLEConstants.ACTION_DATA_AVAILABLE, characteristic);      //Go broadc 

ast der Absicht, mit den charakteristischen Daten }

Antwort

1

Leider nicht. Während Sie die Anzahl der Übertragungen reduzieren können, wenn Sie der Autor des Codes in der BLE-Peripherie sind, können Sie 24 Bites in einem einzelnen Merkmal nicht anpassen, da BLE die Breite eines Merkmals auf 20 Byte beschränkt. Wenn Sie der BLE-Peripherie-Autor sind, könnten Sie ihn vielleicht ändern, um 2 12-Byte-Pakete zu senden.

Wenn nicht, versuchen Sie wahrscheinlich, alle Daten vor dem Senden zu sammeln. Ein einfacher Weg, dies zu tun, wäre ein Byte-Array der Länge 24 zu erstellen, wenn onCharacteristicWrite aufgerufen wird. Fügen Sie dann jedes Mal, wenn onCharacteristicChanged aufgerufen wird, die Daten dem Array hinzu. Sobald Sie alle 24 Bytes zum Array hinzugefügt haben, senden Sie es.

Hoffe, das hilft!

+0

Ok, Danke für Ihre Antwort. – Nithinjith

+0

Ich denke, die BLE-Spezifikation erlaubt maximal 512 Bytes für ein Merkmal, können Sie mich auf die Spezifikation Abschnitt verweisen, die erwähnt, gibt es eine 20-Byte-Beschränkung oder ist es eine Android-spezifische Einschränkung? –

+0

Ich glaube, dass Sie möglicherweise Pakete so groß erhalten, wenn Sie die MTU-Größe ändern, aber nur wenn beide beteiligten Geräte dies unterstützen können. Außerdem denke ich, dass die Erhöhung der MTU nur dazu führt, dass sie hinter den Kulissen in mehr Pakete aufgeteilt wird. [Hier finden Sie weitere Informationen,] (https://community.nxp.com/thread/332030) und [hier ist die Android-Spezifikation zum Ändern der MTU.] (Https://developer.android.com/reference/android/ bluetooth/BluetoothGatt.html # requestMtu% 28int% 29) – Seth