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);
  1. Вам не следует пытаться записывать какие-либо данные в характеристику, пока не получите подтверждение о том, что дескриптор был написан. Это означает, что вам нужно подождать, пока вы не получите обратный вызов onDescriptorWrite в вашей реализации BluetoothGattCallback.