#android #bluetooth-lowenergy #gatt
#Android #bluetooth — низкое энергопотребление #gatt
Вопрос:
Я пытаюсь создать соединение между планшетом и моим микроконтроллером, которое подключается как к BLE, так и к характеристикам отправки / получения через GATT. MCU — это сервер GATT, а планшет — мой клиент GATT.
Что работает до сих пор: оба устройства подключаются друг к другу. Я могу отправлять уведомления с моего сервера GATT, чтобы мой клиент GATT считывал выбранную характеристику в onCharacterChanged для дальнейших задач.
Но у меня какое-то странное поведение при записи характеристик с моего клиента Gatt на сервер. Я запускаю процесс отправки с помощью функции onClick:
buttonOne.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
byte[] testByte = new byte[1];
testByte[0] = 3;
characteristic.setValue(testByte);
bluetoothGatt.writeCharacteristic(characteristic);
}
});
И это работает до сих пор (я заполняю характеристический объект перед onClick).
Теперь у меня есть другой OnClickListener, чтобы просто изменить значение характеристики и отправить его снова.
buttonTwo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
byte[] testByte = new byte[1];
testByte[0] = 7;
characteristic.setValue(testByte);
bluetoothGatt.writeCharacteristic(characteristic);
}
});
Итак, как только моя характеристика на сервере GATT должна иметь значение 3 и один раз 7. И это работает только один раз, пока мое соединение не разорвется и не откроется снова, тогда я смогу повторно отправить характеристику. Характеристика записи взята из класса BluetoothGatt и выглядит следующим образом:
public boolean writeCharacteristic(BluetoothGattCharacteristic characteristic) {
if ((characteristic.getProperties() amp; BluetoothGattCharacteristic.PROPERTY_WRITE) == 0
amp;amp; (characteristic.getProperties() amp;
BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) == 0) return false;
if (VDBG) Log.d(TAG, "writeCharacteristic() - uuid: " characteristic.getUuid());
if (mService == null || mClientIf == 0 || characteristic.getValue() == null) return false;
BluetoothGattService service = characteristic.getService();
if (service == null) return false;
BluetoothDevice device = service.getDevice();
if (device == null) return false;
synchronized(mDeviceBusy) {
if (mDeviceBusy) return false;
mDeviceBusy = true;
}
try {
mService.writeCharacteristic(mClientIf, device.getAddress(),
service.getType(), service.getInstanceId(),
new ParcelUuid(service.getUuid()), characteristic.getInstanceId(),
new ParcelUuid(characteristic.getUuid()),
characteristic.getWriteType(), AUTHENTICATION_NONE,
characteristic.getValue());
} catch (RemoteException e) {
Log.e(TAG,"",e);
mDeviceBusy = false;
return false;
}
return true;
}
Я обнаружил, что процесс застрял в
synchronized(mDeviceBusy) {
if (mDeviceBusy) return false;
mDeviceBusy = true;
}
но я пока понятия не имею, почему. Есть ли какой-либо бит, который я должен установить, чтобы сообщить моему серверу GATT, что я «перепишу» эту характеристику? Нужно ли мне использовать поток или что-то в этом роде и перевести его в спящий режим?
Комментарии:
1. Что вы подразумеваете под «работает только один раз»? Сначала вы нажимаете
buttonOne
, а затем нажимаетеbuttonTwo
, верно? Оба значения записаны на сервер GATT правильно или нет? И почему / когда ваше соединение прерывается? Пожалуйста, уточните и предоставьте более подробную информацию о точной последовательности действий.2. Да, вы правы. Это выглядит так: 1. Нажмите buttonOne -> значения записываются на сервере GATT 2. Разрыв соединения -> требуется повторное подключение со стороны MCU 3. повторно подключен 4. нажмите buttonTwo -> новое значение записывается на сервере GATT 5. как 2. продолжается, кажется, что что-то происходитотсутствует в процессе подтверждения, но я отправляю ответ с моего сервера gatt о том, что новое значение было записано моему клиенту.
3. хорошо, проблема в синхронизированной части, которая теперь точно работает, потому что каждый раз, когда она достигает mService.writeCharacteristic в блоке try, мои значения отправляются на сервер. но до сих пор не знаю, почему