BLE 4.0 получает широковещательные данные с устройства на телефон
![enter image description here]()
У меня есть два устройства. один Android-телефон с уровнем API более 18, а другой - устройство с голубым зубом 4.0.
Устройства успешно подключены друг к другу.
Теперь поток команды следующий:
а. Отправьте текст "привет" на устройство с синим зубом.
UUID uuid = UUID.fromString("18cda784-4bd3-4370-85bb-bfed91ec86af");
BluetoothGattCharacteristic selectedChar = selectedGattService.getCharacteristic(uuid);
mBluetoothLeService.setCharacteristicNotification(selectedChar, true);
boolean flag = selectedChar.setValue("");
mBluetoothLeService.writeCharacteristic(selectedChar);
В этом случае я получаю привет через ресивера GATT. что это значит.
registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());
private static IntentFilter makeGattUpdateIntentFilter() {
final IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BluetoothLeService.ACTION_GATT_CONNECTED);
intentFilter.addAction(BluetoothLeService.ACTION_GATT_DISCONNECTED);
intentFilter.addAction(BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED);
intentFilter.addAction(BluetoothLeService.ACTION_DATA_AVAILABLE);
intentFilter.addAction(BluetoothLeService.EXTRA_DATA);
return intentFilter;
}
б. устройство Bluetooth будет выполнять некоторые операции
авто, сделанное устройством Bluetooth.
с. Результат операции отправляется на Android-телефон
Бродировано устройством.
Для этого я использовал уведомление.
public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic,
boolean enabled) {
if (mBluetoothAdapter == null || mBluetoothGatt == null) {
return;
}
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID
.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
System.out.println("nov7 descriptordescriptor " + descriptor);
if (descriptor != null) {
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
mBluetoothGatt.writeDescriptor(descriptor);
}
}
Я не получаю никаких данных. Любая идея, пожалуйста.
Ответы
Ответ 1
увидел вашу электронную почту, я думаю, что вы каким-то образом связаны через Bluetooth classic, но затем пытаетесь "поболтать" по протоколу BTLE.
Это проблема.
Устройство Android 4.0 практически не работает.
Даже если у него есть чип BTLE (появились некоторые ранние телефоны Motorola с BTLE - вам пришлось импортировать .jar из Motorola Inc.), он не будет использовать API Android BTLE, который вы, похоже, используете.
Чтобы сделать длинную историю коротким, вы должны либо использовать Bluetooth Classic (SPP) с обычным BluetoothSocket или использовать два устройства Android BTLE.
Вот как проверить, имеют ли устройства BTLE:\
Если вы хотите объявить, что ваше приложение доступно только для устройств с поддержкой BLE, включите в манифест приложения следующее:
Однако, если вы хотите сделать свое приложение доступным для устройств, которые не поддерживают BLE, вы должны > включить этот элемент в свой манифест приложения, но установите обязательный = "false". Затем во время выполнения вы можете определить доступность BLE с помощью PackageManager.hasSystemFeature():
// Use this check to determine whether BLE is supported on the device.
// Then you can selectively disable BLE-related features.
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
finish();
}
Ответ 2
Две вещи, которые я вижу, вы должны делать.
- BluetoothGatt имеет свой собственный метод setCharacteristicNotification. В дополнение к написанию дескриптора признаков для включения уведомлений вам необходимо вызвать этот метод для включения уведомлений. Подумайте об этом, поскольку запись дескриптора позволяет получать уведомления на устройстве BLE, а setCharacteristicNotification позволяет использовать его на устройстве Android.
Итак, в методе setCharacteristicNotification выше я бы добавил следующее:
// I'm assuming you have access to the BluetoothGatt object in your BluetoothGattService object
gatt.setCharacteristicNotification(characteristic, true);
- Вам не следует пытаться записывать какие-либо данные в характеристику, пока не получите подтверждение о том, что дескриптор был написан. Это означает, что вам нужно подождать, пока вы не получите обратный вызов onDescriptorWrite в вашей реализации BluetoothGattCallback.