2021年10月22日金曜日

Ubuntu 18.04 で BLE iBeacon の内容を確認する

前提

Windows 11 Pro 上の VirtualBox に立てた Ubuntu 18.04 VM に、 USB ドングルを繋げて確認した。

使用した USB ドングルとビーコンは 今回使ったハード類 を参照。

  • ホスト OS: Windows 11 Pro 21H2
  • VirtualBox: バージョン 6.1.28 r147628 (Qt5.6.2)
  • ゲスト OS: Ubuntu 18.04

Bluetooth の環境構築

Bluetooth 通信スタックのインストール

sudo apt-get install -y bluez bluez-hcidump
  • bluez : Bluetooth 通信スタック
  • bluez-hcidump : Bluetooth 通信のパケットをダンプするためのパッケージ。今回は iBeacon の通信内容を確認するために使う。

USB ドングルの認識確認

hciconfig で、 USB ドングルの情報が確認できる。

以下のような形でもろもろの情報が取得できる。

LMP Version4.0 以上になっていれば BLE(iBeacon) できるはず…。

$ hciconfig -a
hci0:   Type: Primary  Bus: USB
        BD Address: 00:1A:7D:DA:71:15  ACL MTU: 310:10  SCO MTU: 64:8
        UP RUNNING
        RX bytes:4238 acl:0 sco:0 events:147 errors:0
        TX bytes:2189 acl:0 sco:0 commands:44 errors:0
        Features: 0xff 0xff 0x8f 0xfe 0xdb 0xff 0x5b 0x87
        Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
        Link policy: RSWITCH HOLD SNIFF PARK
        Link mode: SLAVE ACCEPT
        Name: 'ubuntu'
        Class: 0x000000
        Service Classes: Unspecified
        Device Class: Miscellaneous,
        HCI Version: 4.0 (0x6)  Revision: 0x22bb
        LMP Version: 4.0 (0x6)  Subversion: 0x22bb
        Manufacturer: Cambridge Silicon Radio (10)

iBeacon を受信できるかの確認

BLE アドバータイズ検索

hcitool lescan で、 BLE のアドバータイズを検索できる。

以下コマンドで、ビーコンの MAC が表示されることを確認。

$ sudo hcitool lescan
...(snip)
AC:23:3F:26:2C:DE (unknown)
...(snip)

ビーコンとの通信

簡単に iBeacon の内容を確認するコマンドは無いようだ。

hcidumphcitool lescan の合わせ技で UUIDMajor, Minor を取得している方法が見つかる。

$ sudo hcidump -R & sudo hcitool lescan
...(snip)
AC:23:3F:26:2C:DE (unknown)
> 04 3E 2B 02 01 00 00 DE 2C 26 3F 23 AC 1F 02 01 06 03 03 F1
  FF 17 16 E2 C5 6D B5 DF FB 48 D2 B0 60 D0 F5 A7 10 96 E0 00
  0C 00 22 00 64 C7
...(snip)
<C-c>
$ fg
<C-c>

ダンプされたバイナリの中に、今回使ったビーコンで設定した UUID, Major, Minor が含まれていることを確認できた。

バイナリの読み方は Raspberry piでiBeacon受信 | TomoSoft を参照のこと。

iBeacon 受信プログラムを nodejs で作る

あまりに読みずらいので、 nodejs のビーコンライブラリを使って受信と情報表示を行う。

Raspberry PiでiBeaconを受信する(Node.js + bleacon) - Qiita に記述されている beacon_discover.js をそのまま利用する。

必要パッケージのインストール

sudo apt-get install -y nodejs npm libbluetooth-dev vim
  • nodejs : ビーコン受信プログラムのランタイム
  • npm : nodejs のパッケージ管理システム
  • libbluetooth-dev : nodejs のビーコンライブラリのビルドに必要なパッケージ
  • vim : プログラム作成のため
mkdir ibeaconreceiver
cd ibeaconreceiver
npm init
npm install bleacon
  • bleacon : nodejs のビーコンライブラリ

iBeacon 受信プログラム作成

Raspberry PiでiBeaconを受信する(Node.js + bleacon) - Qiita に記述されている beacon_discover.js の通りにファイルを作成する。

名前だけ、 npm デフォルトの index.js にした。

var Bleacon = require("bleacon");
Bleacon.startScanning();
Bleacon.on("discover", function(bleacon) {
  console.dir(bleacon);
});

iBeacon 受信プログラム実行

$ sudo nodejs ./index.js
{ uuid: 'e2c56db5dffb48d2b060d0f5a71096e0',
  major: 12,
  minor: 34,
  measuredPower: 0,
  rssi: -62,
  accuracy: 0,
  proximity: 'immediate' }
{ uuid: 'e2c56db5dffb48d2b060d0f5a71096e0',
...(snip)

hcidump より大分わかりやすく情報が表示されている。

後は uuid, major, minor, rssi あたりを見たり見なかったりしながら所望の処理を実装していけばいい感じですかね。

以上。

今回使ったハード類

Bluetooth ドングルは、家に転がっていた 2 つで試して、どちらでも OK だった。

ビーコン発信側は、サンワダイレクトのビーコンを使った。

参考資料

0 件のコメント:

コメントを投稿