0

Я разрабатываю приложение для Android с BLE. Требование этого приложения заключается в обновлении изменения напряжения в конкретном оборудовании с различными входами.Android BLE: проблема с длиной сообщения

Поэтому я пишу символы в BLE как 8-битный вход. Каждое битовое значение содержит свои собственные представления. На основе каждого запроса аппаратное обеспечение будет реагировать и предоставлять различные комбинации выходных данных. Вывод содержит 24 байта информации. Каждая позиция байта представляет собой различное значение. например: позиция 1 & 2 представляют ток, 3 & 4 представляют напряжение и т. д. Моя проблема здесь, я получаю вывод как 4 части. Каждое сообщение содержит 6 байтов. Можно ли получить одно и то же в одном сообщении?

Реализация

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); 
     } 
    } 

И ответ получает в обратный вызов Гатт

@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 

аст намерения с характерными данными }

ответ

1

К сожалению, нет. Хотя вы можете уменьшить количество передач, если вы являетесь автором кода в периферийном устройстве BLE, вы не можете вместить 24 укуса в одну характеристику, потому что BLE ограничивает ширину характеристики до 20 байтов. Если вы являетесь сторонним автором BLE, вы можете изменить его для отправки 2 12-байтовых пакетов.

Если вы этого не сделаете, вы, вероятно, попытаетесь собрать все данные перед отправкой. Простым способом сделать это будет создание байтового массива длиной 24, когда вызывается onCharacteristicWrite. Затем, каждый раз, когда вызывается onCharacteristicChanged, добавьте данные в массив. Как только вы добавили все 24 байта в массив, передайте его.

Надеюсь, это поможет!

+0

Хорошо, спасибо за ваш ответ. – Nithinjith

+0

Я думаю, что спецификация BLE допускает максимум 512 байтов для характеристики, можете ли вы указать мне раздел спецификации, в котором указано, что ограничение на 20 байтов или ограничение на андроид? –

+0

Я считаю, что вы можете получить большие пакеты, если вы измените размер MTU, но только если оба устройства могут это поддержать. Кроме того, я думаю, что увеличение MTU просто заставляет его разбивать его на несколько пакетов за кулисами. [Вот еще информация] (https://community.nxp.com/thread/332030) и [здесь спецификация Android для изменения MTU.] (Https://developer.android.com/reference/android/ bluetooth/BluetoothGatt.html # requestMtu% 28int% 29) – Seth