2019/08/24

[zephyr][ble]serviceを作る (2)

menuconfigの続き。

 

menuconfigでSaveすると、ファイルはbuildの下に.configとして保存されるようだ。
このファイルは、—prestineすると消えてしまうようである。

なので、これをprj.confとして保存してしまえばいいや、と思ったが、CONFIGがずらずら並んでいると気が滅入る。
どうやって減らそうかと思ったら、advancedということでminimal configをSaveするメニューがあった。

# Generated by Kconfiglib (https://github.com/ulfalizer/Kconfiglib)
CONFIG_GPIO=y
CONFIG_SOC_SERIES_NRF51X=y
CONFIG_ARM=y
CONFIG_SERIAL=y
CONFIG_UART_0_NRF_UART=y
CONFIG_ENTROPY_NRF5_THR_THRESHOLD=4
CONFIG_ENTROPY_NRF5_ISR_THRESHOLD=12
CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y
CONFIG_CLOCK_CONTROL_NRF_K32SRC_250PPM=y
CONFIG_BT=y

今の設定で出力させたのだが、THRESHOLDの設定を変更したかどうか記憶にない。。まあいいや。

 

samples/bluetooth/peripheral_hrと比べて、いくつか追加した。

# Generated by Kconfiglib (https://github.com/ulfalizer/Kconfiglib)
CONFIG_GPIO=y
CONFIG_SOC_SERIES_NRF51X=y
CONFIG_ARM=y
CONFIG_SERIAL=y
CONFIG_UART_0_NRF_UART=y
CONFIG_ENTROPY_NRF5_THR_THRESHOLD=4
CONFIG_ENTROPY_NRF5_ISR_THRESHOLD=12
CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y
CONFIG_CLOCK_CONTROL_NRF_K32SRC_250PPM=y
CONFIG_BT=y
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_GATT_DIS=y
CONFIG_BT_GATT_DIS_MODEL="LED control"
CONFIG_BT_GATT_DIS_MANUF="hiro99ma"
CONFIG_BT_SMP=y
CONFIG_BT_DEVICE_NAME="BLE Test"

標準の項目については大半がCONFIGの設定だけで済ませられそうだ。
こりゃ、便利だわ。

Memory region         Used Size  Region Size  %age Used
           FLASH:       76267 B       256 KB     29.09%
            SRAM:       12988 B        16 KB     79.27%
        IDT_LIST:         136 B         2 KB      6.64%

まだまだ大丈夫だ。


Device Information Serviceを組み込んだので、これだけでも何か動いていいはずだ。
samples/bluetooth/peripheral_hrからBASとHRSを削除すればいいだろう。

 

main.cを見て気付いたが、BASとHRSっぽいのって、ほぼnotify()だけではないか。。。
こんなにコードが少なくて済むのか。
まあ、自分でserviceを作ってないからだとはいえ、助かるな。

 

Advertisingする設定が気になる。
peripheral_hrではこんな設定になっていた。

static const struct bt_data ad[] = {
	BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)),
	BT_DATA_BYTES(BT_DATA_UUID16_ALL, 0x0d, 0x18, 0x0f, 0x18, 0x05, 0x18),
};

UUIDはいつも128bitだったような気がするが、ここは16bitなのか。
じゃあ、16bitの設定はどこで? 128bitはどうやって??

 

やはりコードだけじゃ無理だな。

https://docs.zephyrproject.org/latest/guides/bluetooth/bluetooth-dev.html#initialization

説明はないが、ここではadが2byte分しかないのでわかりやすい。
0xaa, 0xfeはGoogleだろう。

https://www.bluetooth.com/ja-jp/specifications/assigned-numbers/16-bit-uuids-for-members/

image

BT_DATA_UUID16_ALLは、ALLとついているから列挙しているのだろう。
serviceなんかで、こういう値があった気がするのだが。。。

https://www.bluetooth.com/ja-jp/specifications/gatt/services/

そういえば、GenericだかGeneralだかがあったな。Device Information Serviceもそうだし。

 

Core仕様書が出てきた。
ここではv4.2を見ている。たぶんv5.1でも同じ章番号だろう。

Vol 3 – Part B – 2.5.1 UUID

https://www.bluetooth.com/specifications/assigned-numbers/service-discovery/

Serviceはここから探せそうだ。

https://www.bluetooth.com/specifications/gatt/services/

0x18があるのでGenericなServiceの番号かと思ったのだけど、なんか違う気がする。
Current Time Serviceは使って無さそうだから。
あまり深く考えず、AdvertisingだからAdvertisingのところを調べるべきだろう。


Advertisingは、GAP(Generic Access Profile)だ。
GAPは、Vol.3 – Part Cだ。

https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile/

BT_DATA_UUID16_ALLは0x03なので、«Complete List of 16-bit Service Class UUIDs»を表しているのだろう。
0x09の«Complete Local Name»はBT_DATA_NAME_COMPLETEだから、COMPLETEを使ってくれれば悩まなかったのに。。。

ともかく、Service Classの16bit UUIDを列挙しているということだろう。
あれ、じゃあさっきの考えは間違ってなかったのか?

0x180d = Heart Rate
0x180f = Battery
0x1805 = Current Time

普通はこういう情報に現在時刻が必要よね?ということで付けたのだろうか。
じゃあ、最初に「Googleだろう」って書いたのは間違っているのかな。

 

まあいい。
今回は、Device Information Serviceだけだから、0x180Aでよかろう。
ビルドして焼いてみる。

image

image

むう、あっさり動いた。


さて、ここで出てきたUUIDのF1:76:C0:98:07:47はなんだろう?
MACなんだろうけど、どうやって指定するんだっけ。

6 byte mac address oft nrf52832 - Nordic DevZone
https://devzone.nordicsemi.com/f/nordic-q-a/31062/6-byte-mac-address-oft-nrf52832

ああ、FICRか。
nRF52832のデータだけど、こんな感じでDEVICEADDR[]が入っているようだ。

https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.nrf52832.ps.v1.1%2Fficr.html

nRF51822だと少し違うのかな?

nRF51822 - ID - Nordic DevZone
https://devzone.nordicsemi.com/f/nordic-q-a/6452/nrf51822---id

たぶん書き換えられないんだろう。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。