デバイスの特性と記述子の操作
特性または記述子を操作する前に、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 0Bluetooth 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