MAMORIO を BLE ビーコンとして obniz の BLE で検知するメモです。
東京テクニカルカレッジ Advent Calendar 2022 の 21 日目の記事です。
背景
obniz で BLE ビーコンの値を取りたいなと思っていて、obniz の 動作確認済みBLEデバイス のものを取り寄せようとも思っているのですが、そういえば、常用している BLE ビーコンと言えば MAMORIO だったなということで、これで検証してみます。
実は、以前、別のビーコン検証で家の中で混乱した経験があるので、思い出しました。すでに、この一件で UUID は把握していて、たしか iBeacon の仕様で値が取得できるのでやってみます。
あと、MAMORIO さすが続いている製品だけあって、待望の電池交換可能なタグも出てきたり、いろんな用途に合わせたタグがあってデザインが素敵なので良いんですよね。
ぜひ MAMORIO STORE をみてみてください。
obniz のソースコード
obniz Cloud の HTML エディタで以下のソースコードを動かしました。obniz Board を動かします。
<html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"> <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script> <script src="https://unpkg.com/obniz@3.24.0/obniz.js" crossorigin="anonymous"></script> </head> <body> <h1>Hello MAMORIO!!!</h1> <div id="obniz-debug"></div> <script> const obniz = new Obniz("OBNIZ_ID_HERE"); // 参考 : https://obniz.com/ja/doc/guides/ble-location-service/scan-and-send-data-from-1-obniz // obnizデバイスとの接続を確立する obniz.onconnect = async function () { // BLEシステムを初期化する await obniz.ble.initWait(); // 検索をかける obniz.ble.scan.onfind = async function(peripheral){ // iBeacon でデータが取れるのでデータの有無で分岐 if(peripheral.iBeacon){ const uuid = peripheral.iBeacon.uuid; if(uuid == 'b9407f30-f5f8-466e-aff9-25556b57fe6e'){ // この UUID が MAMORIO console.log(`address ${peripheral.address}`); console.log(`rssi ${peripheral.rssi}`); console.log(`------`); } } }; obniz.ble.scan.onfinish = async function(peripherals, error){ console.log("scan timeout!") // 周辺BLEデバイスをスキャンを実行する // 30秒で終了してonfinishが呼ばれます await obniz.ble.scan.startWait(); }; // 周辺BLEデバイスをスキャンを実行する // 30秒で終了してonfinishが呼ばれます await obniz.ble.scan.startWait(); } </script> </body> </html>
基本的には ビーコンのスキャン結果をサーバーに送る – obniz Docs の記事を参考にしつつ、MAMORIO は peripheral.iBeacon で値が取れて、その中の peripheral.iBeacon.uuid が b9407f30-f5f8-466e-aff9-25556b57fe6e であれば MAMORIO なのでこれで検出します。
動かしてみる
ということで、実行しています。
しばらく待つとこのように値が出ました。私の場合は、財布と名刺入れに入れているので 2 つ出てきました。address で区別できそうです。
-44 がめっちゃ近くに置いた財布で、-62 がちょっと遠くのリュックサックに入れた名刺入れです。
名刺入れを、部屋から出るギリギリのところに置いたら、電波強度が弱い -91 が出ました。合ってる。ちなみに、隣の部屋の奥に持っていくと電波が圏外になったのか検出されませんでした。正しい。
あとは、いろいろ追加実装していけば良さそう
ひとまず、値がしっかりとれたので、今日は満足です。
ここから良い感じに検出するには、結構チューニングが必要なのですが Central: スキャン – obniz Docs のところに色々書いてあってありがたいです。
- duplicate で同じビーコンの電波強度 RSSI の変化を取る
- filterOnDevice で、出来たらフィルタをかける
- そうでなくても peripheral.address で複数の MAMORIO の区別をする
といったことをやると、より実践で使えると思います。今度また深く試してみます。