Устройство BLE не отвечает на команду - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть какое-то конкретное устройство BLE, которое имитирует сокетное соединение по двум характеристикам - запись и чтение. Поэтому, если вы напишете какую-либо команду для характеристики «запись», характеристика «чтение» даст вам ответ посредством уведомления.

Это работает правильно, когда я использую Bluetooth-терминал nRF Connect. Но когда я пытаюсь повторить это с помощью Android API, устройство не отвечает на команду.

Я создаю BluetoothGattCallback объект и начинаю соединяться с моим устройством:

BluetoothGattCallback callback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        if (newState == BluetoothProfile.STATE_CONNECTED) {
            gatt.discoverServices();
        }
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {
        BluetoothGattService cccdService = gatt.getService(UUID.fromString("00001801-0000-1000-8000-00805f9b34fb"));
        BluetoothGattCharacteristic cccdCharacteristic = cccdService.getCharacteristic(UUID.fromString("00002a05-0000-1000-8000-00805f9b34fb"));
        BluetoothGattService deviceService = gatt.getService(UUID.fromString("569a1101-b87f-490c-92cb-11ba5ea5167c"));
        BluetoothGattCharacteristic writeCharacteristic = deviceService.getCharacteristic(UUID.fromString("569a2001-b87f-490c-92cb-11ba5ea5167c"));
        BluetoothGattCharacteristic readCharacteristic = deviceService.getCharacteristic(UUID.fromString("569a2000-b87f-490c-92cb-11ba5ea5167c"));
        BluetoothGattCharacteristic c2002 = deviceService.getCharacteristic(UUID.fromString("569a2002-b87f-490c-92cb-11ba5ea5167c"));

        gatt.setCharacteristicNotification(cccdCharacteristic, true);
        gatt.setCharacteristicNotification(readCharacteristic, true);
        gatt.setCharacteristicNotification(c2002, true);
        gatt.requestConnectionPriority(BluetoothGatt.CONNECTION_PRIORITY_HIGH);

        // makeHeader is method that create byte request
        writeCharacteristic.setValue(makeHeader((byte) 1, (byte) 1, MemoConstDdin.DATA, (short) 1000));
        gatt.writeCharacteristic(writeCharacteristic);
    }

    @Override
    public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
        super.onCharacteristicChanged(gatt, characteristic);
        displayResponse(characteristic);
    }
};
gatt = device.connectGatt(this, false, callback);

Соединение установлено успешно. Услуги найдены. Уведомления включены. Напишите характеристику успешно. Но. Метод onCharacteristicChanged никогда не вызывается для характеристики «чтения».

Что не так с этим кодом или со мной? Любая идея. Спасибо!

1 Ответ

3 голосов
/ 04 апреля 2019

Вам также следует включить значение индикации или уведомления.

Найдите соответствующий дескриптор для вашей характеристики.Тогда

adescriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
gatt.writeDescriptor(adescriptor);
...