デバイスの特性と記述子の操作
特性または記述子を操作する前に、Bluetooth® Low Energy 周辺デバイスをスキャンして接続を作成します。詳細と手順については、Bluetooth Low Energy 周辺デバイスの検索を参照してください。デバイスに接続した後、デバイスの特性と記述子の読み取りや書き込みによってインターフェイスを取ることができます。
b = ble("DemoDev");
デバイス特性へのアクセス
ble
オブジェクトの Characteristics
プロパティを調べてデバイスの特性を表示します。
b.Characteristics
ans=11×5 table ServiceName ServiceUUID CharacteristicName CharacteristicUUID Attributes ___________________ ______________________________________ ____________________________________________ ______________________________________ ______________ "Generic Access" "1800" "Device Name" "2A00" {1×2 string } "Generic Access" "1800" "Appearance" "2A01" {["Read" ]} "Generic Access" "1800" "Peripheral Preferred Connection Parameters" "2A04" {["Read" ]} "Generic Access" "1800" "Central Address Resolution" "2AA6" {["Read" ]} "Generic Attribute" "1801" "Service Changed" "2A05" {["Indicate"]} "Heart Rate" "180D" "Heart Rate Measurement" "2A37" {["Notify" ]} "Heart Rate" "180D" "Body Sensor Location" "2A38" {["Read" ]} "Battery Service" "180F" "Battery Level" "2A19" {["Read" ]} "User Data" "181C" "Gender" "2A8C" {1×2 string } "Custom" "03B80E5A-EDE8-4B33-A751-6CE34EC4C700" "Custom" "7772E5DB-3868-4112-A1A9-F2669D106BF3" {1×6 string } "Custom" "03B80E5A-EDE8-4B33-A751-6CE34EC4C700" "Custom" "7772E5DC-3868-4112-A1A9-F2669D106BF3" {1×3 string }
この table には、それぞれの特性と、それに関連付けられたサービスがリストされています。table が示すように、それぞれのサービスには複数の特性を含めることができます。複数の特性が同じ名前を持つ場合は、UUID を使用して区別します。この例では、デバイスに標準とカスタムの両方の特性があります。標準特性は Bluetooth SIG によって定義され、カスタム特性は通常、デバイスまたはデバイス メーカーに固有のものです。
この table の Attributes
フィールドには、各特性の読み取り権限と書き込み権限が記されています。関心のある特性を選択し、characteristic
を使用してそのプロパティを表示します。たとえば、サービス名と特性名を使用して "Gender"
特性にアクセスします。
c = characteristic(b,"User Data","Gender")
c = Characteristic with properties: Name: "Gender" UUID: "2A8C" Attributes: "Read" "Write" Descriptors: []
この特性は読み取りと書き込みの両方が可能です。
特性データの読み取りと書き込み
"Gender"
特性は読み取り可能かつ書き込み可能であるため、そこにデータを書き込んで値の変化を確認することができます。
read
を使用して現在のデータを取得します。characteristicData
で説明されているように、特性に対する read
の完全な動作は Attributes
プロパティに依存します。
data = read(c)
data = 0
Bluetooth SIG Web サイトにあるこの特性の仕様を参照して、データを解釈します。0
は男性を、1
は女性を表します。write
を使用して、女性を示すよう特性に 1
と書き込みます。
write(c,1)
特性から再度読み取って、データの変化を確認することができます。
data = read(c)
data = 1
特性のサブスクライブ
特性をサブスクライブして、特性についての通知や表示を有効にすることもできます。"Notify"
、"Indicate"
、またはその両方を Attributes
プロパティに含む特性のみをサブスクライブできます。特性の通知または表示を有効にした後、read
を使用して、更新されたデータを取得します。Attributes
に基づく read
の完全な動作の説明は、characteristicData
を参照してください。
この例では、"Heart Rate Measurement"
特性を表す characteristic オブジェクトを作成します。
c = characteristic(b,"Heart Rate","Heart Rate Measurement")
c = Characteristic with properties: Name: "Heart Rate Measurement" UUID: "2A37" Attributes: "Notify" Descriptors: [1x3 table] DataAvailableFcn: [] Show descriptors
この特性は "Notify"
をサポートします。
subscribe
を使用して通知の受信を開始します。Attributes
に基づく subscribe
の完全な動作の説明は、type
を参照してください。
subscribe(c)
特性からの読み取りで、データを受信していることを確認します。
read(c)
ans = 1×19
23 14 1 187 1 186 1 185 1 184 1 183 1 182 1 181 1 180 1
Bluetooth SIG Web サイトの Heart Rate Service にあるこの特性の仕様を参照して、データを解釈します。
特性の操作が終了したら、unsubscribe
を使用して通知を無効にします。
unsubscribe(c)
コールバック関数を使用した特性データの読み取り
コールバック関数を作成して、特性データを、デバイスからの新たなデータで更新される際に読み取ることもできます。
"Heart Rate Measurement"
特性は "Notify"
をサポートするため、displayCharacteristicData
というコールバック関数を作成することができます。読み取りモードを 'latest'
ではなく 'oldest'
として指定します。'latest'
データを呼び出すと、前のデータのフラッシュが原因でコールバック関数にエラーが発生する可能性があります。
function displayCharacteristicData(src,evt) [data,timestamp] = read(src,'oldest'); disp(data); disp(timestamp); end
@
演算子を使用して、関数ハンドルを特性の DataAvailableFcn
プロパティに割り当てます。新しい通知が利用できるときには、コールバックが呼び出されます。
c.DataAvailableFcn = @displayCharacteristicData
c = Characteristic with properties: Name: "Heart Rate Measurement" UUID: "2A37" Attributes: "Notify" Descriptors: [1x3 table] DataAvailableFcn: displayCharacteristicData Show descriptors
特性の操作が終了したら、unsubscribe
を使用して通知を無効にし、コールバックをリセットします。
unsubscribe(c) c.DataAvailableFcn = [];
デバイス記述子へのアクセス
特性に記述子がある場合は、その記述子にアクセスして読み取りや書き込みができます。characteristic
オブジェクトの Descriptors
プロパティを調べて、特性の記述子を表示します。
この例では、"Heart Rate Measurement"
特性の Descriptors
を表示します。
c.Descriptors
ans=1×3 table DescriptorName DescriptorUUID Attributes _____________________________________ ______________ ____________ "Client Characteristic Configuration" "2902" {1×2 string}
"Client Characteristic Configuration"
記述子にアクセスします。
d = descriptor(c,"Client Characteristic Configuration")
d = Descriptor with properties: Name: "Client Characteristic Configuration" UUID: "2902" Attributes: ["Read" "Write"]
この記述子は読み取りと書き込みの両方が可能です。
記述子データの読み取りと書き込み
"Client Characteristic Configuration"
記述子には、通知または表示が有効か無効かについての情報が含まれています。read
を使用して現在のデータを取得できます。
data = read(d)
data = 1×2 0 0
Bluetooth SIG Web サイトの Bluetooth Core Specification にあるこの記述子の仕様を参照して、このデータを解釈します。
通知または表示のステータスが変更されると、この値は変化します。たとえば、write
を使用して、"Heart Rate Measurement"
特性の通知を有効にするようこの値に書き込みます。次に、記述子を再び読み取って、値の変化を確認します。
write(d,[1 0]) data = read(d)
data = 1×2 1 0
参考
characteristic
| descriptor
| read
| write
| subscribe
| unsubscribe