BLE基礎 (10)
2024/08/21
DevAcademyのBluetooth Low Energy Fundamentalsをやっているところである。
前回 SMP は GAP としかアクセスしないことがわかったので図を更新しておこう。
Lesson 4 – Data exchange in Bluetooth LE
今まで Advertising, Connection とやってきたが、サービスは実装された LBS を使うだけだった。 この Lesson では GATT/ATT や Characteristic の詳細を見ていく。
といっても、完全に自作の Service にすると Central 側も用意しないといけなくなるので、そこまではやらず、一から LBS を作ろう、というもののようだ。 NUS(Nordic UART Service)もやるようだ。
- GATT operations
- Service discovery
- Client-initiated operations
- Read
- Write
- Write without response
- Server-initiated operations
- Notify
- Indicate
- コア仕様書 V5.1, Vol 3, Part G: General Attribute Profile(GATT)
- “3.3.1.1 Characteristic Properties”
- bit表現
- “Broadcast”というのもあった。使われないのかな?
- 4.8~4.11 あたり
- Notify と Indicate は Client Characteristic Configuration Descriptor(CCCD) への設定が必要になってくる
- “3.3.1.1 Characteristic Properties”
- Services and characteristics
- entities (services and characteristics)という表現があるのでデータベースのようなイメージなのか
- ATTレイヤーがそうのようだ。ATT table という呼び名も単に表形式だからというだけでなく DB の table に名前を寄せていたのだろうか。
- コア仕様書 V5.1, Vol 3, Part F: Attribute Protocol(ATT)
- Part F と G の違いが今ひとつ分かってない。。。
- F は “protocol”、G は “profile”
- “ATT” は “Attribute Protocol”、”GATT” は “Generic Attribute Profile” なので、Part F が “ATT” で Part G が “GATT” になるのか?
- GATT が Profile ということは、HRS profile なども GATT の範疇?
- Part F と G の違いが今ひとつ分かってない。。。
- Attribute 1 つ分の構成
- Handle: ATTテーブル内でユニークな16bit値。ATT tableの行番号に相当(連番ではないが)
- stackによって割り当てられるので、外部で使う値ではないのかな?
- Type(UUID): この Attribute を指す UUID。
- Permissions: 符号化、認証、読込み可、書込み可
- Value: 値
- Handle: ATTテーブル内でユニークな16bit値。ATT tableの行番号に相当(連番ではないが)
- 2種類の UUID
- Bluetooth SIGが定義した 16bit UUID
0x180d
は assigned_numbers/uuids/service_uuids.yamlにある- ncs では zephyr/bluetooth/uuid.hに定義がある
- GATT Heart Rate Service (HRS) Clientに書いていないのはユーザが使わないからだろう
- この辺のページは ncs で定義済みの service 実装が載っているようだが、「Service」と「Service Client」がある。”Client” が付いているのは Central でなくてもよいが値を受け取る方ってことか?
- HRS は “Client” しかないけど、nRF に HRS 載せるんだったら Heart Rate を提供する “Server” の方になりそうだが。
- peripheral_hrでは “Client” ではない
<zephyr/bluetooth/services/hrs.h>
を include しているので、ドキュメントに出てないだけで “Server” の実装もあるのだろう。
0x2a37
は characteristic の UUID なので assigned_numbers/uuids/characteristic_uuids.yamlにある- ATT PDU は短めだし、短い方が通信時間が短くて省電力になるので UUID が短いと効率が良い。が、全部の定義をできるわけでもないので、自作の場合は重複しにくい 128bit UUID を使う。
- ベンダーが定義した 128bit UUID(16bytes)
- UUIDの表記はwikipediaによると
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
とバイト数だと<4>-<2>-<2>-<2>-<6>
のようにハイフンで区切ることになっている - base UUID は
xxxxZZZZ-xxxx-xxxx-xxxx-xxxxxxxxxxxx
とZZZZ
以外の部分- LBSの場合
- LBS service:
00001523-1212-EFDE-1523-785FEABCD123
- LBS Button Characteristic:
00001524-1212-EFDE-1523-785FEABCD123
- LBS LED Characteristic:
00001525-1212-EFDE-1523-785FEABCD123
- LBS service:
- LBSの場合
- base UUID + 16bit UUID、という見方をする
- 先に base UUID をどこかに保存しておいて、あとは 16bit UUID だけで操作することができるので Bluetooth SIG 定義の UUID と同じ感じでアクセスできる
- UUIDの表記はwikipediaによると
- Bluetooth SIGが定義した 16bit UUID
- Service
- Primary Service Declaration:
0x2800
- Characteristic(V5.1, Vol 3, Part G “3.3.1 Characteristic declaration”):
0x2803
- Value(V5.1, Vol 3, Part G “3.3.2 Characteristic Value declaration”)
- Descriptor(V5.1, Vol 3, Part G “3.3.3 Characteristic descriptor declaration”)
- User description(V5.1, Vol 3, Part G, “3.3.3.2 Characteristic User Description”):
0x2901
- Characteristic の略称?
- Client configuration(V5.1, Vol 3, Part G, “3.3.3.3 Client Characteristic Configuration”):
0x2902
- Notify/Indicate
- 略して”CCCD”と呼ばれたりする
- User description(V5.1, Vol 3, Part G, “3.3.3.2 Characteristic User Description”):
- Primary Service Declaration:
- entities (services and characteristics)という表現があるのでデータベースのようなイメージなのか
- Attribute table
- V5.1, Vol 3, Part G, Appendix B “Example Database Hash”
- LBS サンプルを nRF Connect for Mobile と接続したときの画面