2015/04/26

汝の名はBlueZ - (4)

gattoolsのconnectっぽいところを実装しようかと思ったが、まずはBLEのスキャンについて残しておこう。
Bluezのソースファイルから、hcitool.cを見ていく。


hcitoolのlescanは、こういう構成になっている。

hci_open_dev()
    hci_le_set_scan_parameters();
    hci_le_set_scan_enable(始め);
    ・・・(あれこれ)・・・
    hci_le_set_scan_enable(終わり);
hci_close_dev();

では、スキャン中に何をやってるのか?


あれこれ、と書いているのはprint_advertising_devices()。
BlueZの関数ではない。

まず、取得するデータのフィルタを設定するようだ。
hci_filter_clear()でクリアして(やってるのは単なるmemset)、hci_filter_set_ptype()でパケットタイプを指定して(HCI_EVENT_PKT)、hci_filter_set_event()でイベントの種類を指定している(EVT_LE_META_EVENT)。

と書いてはみたものの、何をしているのかさっぱりわからない。
Core_V4.2.pdfを見ると、p.1238に「7.7.65 LE Meta Event」という章があった。
Event Codeは0x3Eで、EVT_LE_META_EVENTの定義値と同じだ。
どうやら、このイベントはBLEのコントローラ関連のイベント全部で、サブイベントコードでさらに細かい内容がわかるようだ。

hci_open_dev()で取得したハンドラ(ファイルディスクリプタ)をread()して、読み込んだデータをevt_le_meta_eventにキャストしている。これがhci_filterで設定していたイベントだ。
そのサブイベントコードがEVT_LE_ADVERTISING_REPORT、Core_V4.2.pdfの「7.7.65.2 LE Advertising Report Event」かどうかをチェックし、そうだったらさらにle_advertising_infoにキャストして、アドレスと名前を表示させている。

この辺の定義は、BlueZのlibディレクトリの中に入っている。
hci.hとかhci_lib.hとか。


しかしまあ、ソースにもコメントがないし、ドキュメントっていう感じのものもないので、つらいですな。

0 件のコメント:

コメントを投稿

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