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にキャストして、アドレスと名前を表示させている。
hci.hとかhci_lib.hとか。
しかしまあ、ソースにもコメントがないし、ドキュメントっていう感じのものもないので、つらいですな。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。