1

私はグーグルのネクサス6&9でBLEの読み書きに取り組んできました。

リモートデバイスに特性を書き込み、書き込んだらリモートデバイスに通知したい。

次のコードは特性を書き込みます

if ((charaProp & BluetoothGattCharacteristic.PROPERTY_WRITE) > 0) {
    byte[] test = hexStringToByteArray("3132333435363738393031323334353637383930");
    //byte[] value = new byte[1];
    //value[0] = (byte) (21 & 0xFF);
    Log.d("text",characteristic.getDescriptors().size()+"");
    BluetoothGattDescriptor descriptor1 =  characteristic.getDescriptor(UUID.fromString(serviceOneCharUuid));
    descriptor1.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
    characteristic.setValue(test);
    if(mBluetoothGatt.writeDescriptor(descriptor1)){Log.d("text","writedescriptor");}
    if(mBluetoothGatt.writeCharacteristic(characteristic)){Log.d("text","setValue");}}

最初に記述子を書くように言った投稿を見たことがありますが、うまくいきません。

BLE USB デバイスに書き込みを試みたところ、書き込み機能が期待どおりに機能していることがわかります。また、ローカル デバイスのコールバック関数も同様に機能します。

ただし、リモート deviced の oncharacteristicchanged 関数は呼び出されません BluetoothLeService という名前のクラスに記述されたすべてのコールバック関数のコードを次に示します。

    @Override
    public void onCharacteristicWrite(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic, int status){
        Log.d("text",new String(characteristic.getValue()));
    }
    @Override
    public void onCharacteristicRead(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic, int status) {
        if (status == BluetoothGatt.GATT_SUCCESS) {
            broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
            Log.d("text","on read");
        }
    }

    @Override
    public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
        Log.d("text", new String(characteristic.getValue()));
    }

これらのコードのどこが間違っているのか、または私が何か見逃していることを知っている人はいますか?

4

1 に答える 1

0

onCharacteristicChanged を呼び出して同様の問題が発生しました。私がそれを機能させる方法は、BLE デバイスに特性を書き込む前に onDescriptorWrite が呼び出されるまで待機することです。

于 2015-07-17T08:32:48.803 に答える