FreeBSDで Bluetooth Low Energy (BLE)を使う

いろいろと案件がありまして、LinuxやらほげほげやらいろんなものでBLEを使って調べ物をしていたのですが、これがなかなか期待通り動いてくれないんですよねぇ・・・いつものようにソースやらBluetooth4.0の仕様書(2000頁以上ある)などをいろいろ読み始めたのですが linuxの bleno -> Bluezという流れが複雑で実験環境すらままならないので使い慣れたFreeBSDで動かんものかとtwitterでつぶやいてみました。すると・・・

以外と近いところに解はあるんだなー。まさかフォロワーさんがCURRENTにコミットしてたとわ。 ということで手持ちのPCに最新のCURRENTをいれてセコセコ調査を始めた次第。

ちなみにドングルはこれ アイ・オー・データ機器 I-O DATA USB-BT40LE [Bluetooth4.0+EDR/LE準拠 USBアダプター]

ぱっと調べたところBroadcomの BCM20702を使ってるドングルはアイオーのこれしかないようなので無難に。あきばお~とかで安売りしているやつは地雷の可能性が大そうなのでやめました。

これをBSDに差してみるとこういうメッセージが出ます

Sep 10 10:45:01  kernel: WARNING: attempt to domain_add(netgraph) after domainfinalize()
Sep 10 10:45:06  kernel: ugen0.3: <Broadcom Corp> at usbus0
Sep 10 10:45:06  kernel: ubt0: <Broadcom Corp BCM20702A0, rev 2.00/1.12, addr 3> on usbus0
Sep 10 10:45:06  kernel: WARNING: attempt to domain_add(bluetooth) after domainfinalize()

何やらwarningは出ますがとりあえず使えそう…… ngctl listで見ると

 # ngctl list
There are 8 total nodes:
  Name: ubt0            Type: ubt             ID: 00000002   Num hooks: 1
  Name: btsock_hci_raw  Type: btsock_hci_raw  ID: 00000003   Num hooks: 1
  Name: btsock_l2c_raw  Type: btsock_l2c_raw  ID: 00000004   Num hooks: 1
  Name: btsock_l2c      Type: btsock_l2c      ID: 00000005   Num hooks: 1
  Name: btsock_sco      Type: btsock_sco      ID: 00000006   Num hooks: 0
  Name: ubt0hci         Type: hci             ID: 00000008   Num hooks: 3
  Name: ubt0l2cap       Type: l2cap           ID: 0000000c   Num hooks: 3
  Name: ngctl714        Type: socket          ID: 00000012   Num hooks: 0

hccontrolでスキャンをしてみます。BLE対応の接続先が必要ですが、iOSでlightBlueをつかって立てました

# hccontrol le_enable enable
# hccontrol le_set_scan_param passive 10 10 public all
# hccontrol le_set_scan_enable enable

結果は近傍キャッシュから読めました

# hccontrol read_neighbor_cache
BD_ADDR           Features                Clock offset Page scan Rep. scan
XX:XX:XX:XX:XX:XX 00 00 00 00 00 00 00 00            0         0         0

今回はここまで

Posted by issei

カテゴリ: BSD