web-dev-qa-db-ja.com

setCharacteristicNotification()が実際に通知を有効にしないのはなぜですか?

BluetoothLeGatt Android BLEの例には、次のコードが含まれています。

_public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic,
                                          boolean enabled) {
    if (mBluetoothAdapter == null || mBluetoothGatt == null) {
        Log.w(TAG, "BluetoothAdapter not initialized");
        return;
    }
    mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);

    // This is specific to Heart Rate Measurement.
    if (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) {
        BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
                UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
        descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
        mBluetoothGatt.writeDescriptor(descriptor);
    }
}
_

私の質問は基本的に、マークされたコードが心拍数測定に固有なのはなぜですか? Client Characteristic Config Descriptor(CCCD)特性を持つことは、特性通知を制御するための標準的な方法のようですが、なぜsetCharacteristicNotification()はそれに書き込みを行わないのですか?そして、それはそれをしないので、setCharacteristicNotification()は実際に何をしますか?

私はBLEを初めて使用しますが、インターネット上には、すでにすべてを理解していることを前提としない説明はありません。だから私がCCCDか何かを知っていると思い込まないでください! CCCDが何を意味するのかを見つけるのは十分に困難でした!

編集:CCCDの理解をサポートするこの回答も参照してください(そして、に見える関数があるのにAndroidで手動でCCCDに書き込む必要があるのはなぜか疑問に思い続けますそれがあなたのためにそれをするべきであるように): https://devzone.nordicsemi.com/index.php/what-does-cccd-mean

15
Timmmm

答えるのは少し遅いと思いますが、今日も同じ疑問があり、明確な答えを見つけました。 setCharacteristicNotification()を使用して、通知をローカルで有効にし(Androidデバイス)、CCC記述子を_ENABLE_NOTIFICATION_VALUE_に設定します)、bleペリフェラルで通知を有効にします。リモートデバイスに特性(この場合は特性記述子)を書き込むために使用されるメソッドであるsetValue()writeDescriptor()を使用する必要があります。これは次の場所で見つかりました: http:// processors .wiki.ti.com/index.php/SensorTag_User_Guide

8

これは、O'Reillyの本「GettingStarted With BluetoothLowEnergy」からの抜粋です。

Androidで通知を有効にするには、通常、関心のある特定の特性の通知をローカルで有効にする必要があります。

それが完了したら、デバイスのクライアント特性構成記述子(CCCD)に書き込んで、ピアデバイスで通知を有効にする必要もあります。

これがあなたの質問に答えると思います。

そう

mBluetoothGatt.setCharacteristicNotification(characteristic, enabled); 

最初の部分を指します

そして

mBluetoothGatt.writeDescriptor(descriptor); 

2番目を指します。

7
Tomi

これに出くわす将来の人々のために、これが私が見つけることができる最良の答えです:

Client Characteristic Config記述子に書き込むことにより、クライアントであるあなたはBLEサーバーに構成を切り替えるように指示しています。 (これは最初は私にも意味がありませんでしたが、英語で:)

これにより、BLEデバイスはモード(構成)を切り替えて、変更して要求された場合にのみレポートするのではなく、この特性への変更をアクティブに収集してレポートするように指示されます。

名前は適切ではありませんが、ドキュメントを調べると、これはクライアントが要求する可能性のある他の可能な特性変更にも使用されるようです。したがって、紛らわしい名前です。

https://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.client_characteristic_configuration.xml

これは疑問を投げかけます、記述子を変更することによって私たちの努力を複製するだけの場合、なぜBluetoothGatt.setCharacteristicNotification()を呼び出すのですか?! BluetoothGattソースを掘り下げると、setCharacteristicNotificationはローカルサービスをreceive通知のみに準備し、永続的な更新を有効にしないことがわかります。

4
Michael Powell

ばかげているように見えることは知っていますが、CCCD値を設定することが、通知または表示をオンにするかどうかをAPIに伝える唯一の方法です。

現在、setCharacteristicIndicationはありません。表示を有効にするには、通知を有効にする場合と同様に、setCharacteristicNotification(紛らわしい)を呼び出してから、BluetoothGattDescriptor.ENABLE_INDICATION_VALUEをCCCDに書き込む必要があります。

0
reTs