2015-06-24 4 views
1

Есть что-то, что я не совсем понимаю, используя gatt для связи с устройством. в соответствии с этим: https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#connectGatt(android.content.Context, логический, android.bluetooth.BluetoothGattCallback)Низкая энергия Bluetooth Bluetooth Получение ответа на конкретный запрос

BluetoothGatt gatt = device.connectGatt(context,true,new BluetoothGattCallback(){....}) 

я могу подключиться к BLE устройство и дать ему объект через обратные вызовы, чтобы получать уведомления о вещи, как onCharacteristicRead и onCharacteristicWrite

, что я не получаю, как это сделать, что соответствует чтению обратного вызова?

этот метод подписи:

public void onCharacteristicRead (BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) 
public void onCharacteristicWrite (BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) 

так, если я делаю:

BluetoothGattCharacteristic char = gatt.getService(UART_SERVICE_UUID).getCharacteristic(UART_TX_CHARACTERISTIC_UUID); 
char1.setValue("command1"); 
gatt.writeCharacteristic(char); 
char1.setValue("command2"); 
gatt.writeCharacteristic(char); 

в обратный вызов onCharacteristicRead, как я знаю, если characteristic.getStringValue() для command1 или команды команда2?

Спасибо!

ответ

0

В этой реализации вы должны дождаться onCharacteristicWrite после первой записи перед выдачей следующей операции записи. Но это выполняется, если вы не изменили тип записи с setWriteType (int writeType) по умолчанию WRITE_TYPE_DEFAULT, который перезванивает на операции записи. Возможно, вам нужно сохранить состояние для этих операций.

Другой вариант - иметь в ответ код команды (например, 1 байт), чтобы вы могли сопоставить его с командой.

1

Есть несколько важных вещей, которые нужно знать при использовании BluetoothGatt.writeCharacteristic() и связанных с ними методов BluetoothGatt.

  1. Пожалуйста, обратите внимание, что writeCharacteristic() (и многие другие методы BluetoothGatt) возвращают логическое значение. Когда результат является ложным, это означает, что операция не была успешно инициирована. Когда это происходит? См. Следующий пункт.

  2. Используя объект BluetoothGatt, невозможно одновременно инициировать две операции. Вызов инициировать второй не будет выполнен и возвращает false. После вызова writeCharacteristic() код должен дождаться ответа обратного вызова (onCharacteristicWrite) перед выдачей другой записи. В примере кода для этого вопроса второй вызов writeCharacteristic() почти наверняка вернет false по этой причине.

Таким образом, если каждая операция BluetoothGatt ждет обратного вызова по ранее выданной команде, вы можете успешно пару команд посвящений и обратные вызовы - на самом деле вы вынуждены.

0
private String heartRate; 

private String temperature; 

... 

char.setValue("command1"); 

gatt.writeCharacteristic(char); 

... 

Затем в onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) проверки, если переменная heartRate равна нулю. Если это так, получите значение признака и назначьте его переменной heartRate. Затем выполните characteristic.setValue("command2");

gatt.writeCharacteristic(characteristic); и он перезвонит onCharacteristicWrite(...).

Если переменная heartRate не равна нулю, получите значение и присвойте его переменной температуры. Вы также можете использовать UUID переданного признака, чтобы различать то, для чего это значение.

Бонус: одна характеристика может содержать несколько дескрипторов. Вы можете иметь два дескриптора со своим UUID для этого признака. Затем вы можете позвонить characteristic.getDescriptor(UUIDDescriptor).getValue().

Смежные вопросы