過去に、2019年のアドベントカレンダーで以下の記事を書いた際に使った「@abandonware/noble」、当時はサンプルで作った BLEスキャンのプログラムを実行できたものの、スキャン対象にしたデバイスが Node.js のプログラムの出力に出てきませんでした。
(そして、obniz-noble を使って、デバイスと obniz の間で BLE通信をさせた場合は、スキャンされたデバイスに表示されていたという状況でした)
●【IoTLT 2019】新しい obniz で obniz-noble を試す(2019/12/22) - Qiita
https://qiita.com/youtoy/items/1a2e92ae7a83df7e9a82
そして1年以上が経過した 2021/4/15、この日に開催された IoTLT vol.74 で @n0bisuke さんが「@abandonware/noble」の話をされていて、久しぶりに公式ページを見てみたら手順の記載が少しだけ増えていて、「これは、上記の記事を書いた際にうまくいかなかった原因が分かったかも!?」というのがあって今回の記事を書きました。
ちなみに以下の内容が、上に書いている「@abandonware/noble」の話が登場していた LT です。
最後は @n0bisuke さんが、
— you (@youtoy) April 15, 2021
Node.js+Bluetoothの話の最新事情。
#IoTLT pic.twitter.com/mLI7M2FYbW
2019年にやろうとしていたこと
当時、やろうとしていたことは「toio というデバイスと Mac の間で、noble を使った Node.js のプログラムで通信をさせる」という内容でした。
当時の記事の内容の一部抜粋ですが、こんな感じでセットアップをして使う流れでした。
そして、BLEスキャンを行うプログラムは実行できたものの、スキャン対象にしたデバイスが出力結果の中に出てきませんでした。
Node.js のプログラム以外での動作確認として、Apple が提供している「Bluetooth Explorer」で BLEデバイスのスキャンを試したところ、そちらではスキャン結果に toio が出てきていました。
その後、Google Chrome上で Web Bluetooth API を使った JavaScript のプログラムを動かしたりした際も、BLEデバイスをスキャンできて接続から制御まで行うことができていました(例えば以下の内容など)。
●toio を音で制御してみた(Audio用の Teachable Machine でベルやタンバリンの音を機械学習) - Qiita
https://qiita.com/youtoy/items/37f70bb4ce630e6cbd92
●Web Bluetooth API で BLE(Chrome と micro:bit をつなぐ) - Qiita
https://qiita.com/youtoy/items/cd2c3d4770d4ad75a321
そして、これ以降は noble を使った BLE通信は使わない状態が長らく続きました。
2021年4月に公式ページで見た内容
そして、冒頭に書いたイベントで取り上げられたのを聞いて、久しぶりに 「@abandonware/noble」のページを見てみたところ、Mac で使う手順で以下の記載が増えていました。
ターミナルアプリや iTerm2 といったアプリで、上記の設定はした覚えがなく、「この設定を追加すれば動いたりするのでは?」と思い試してみました。
試した内容
とりあえず、Mac の設定でターミナルアプリと iTerm2 の 2つに Bluetooth の利用を許可する設定をしました。
そして、適当に作ったフォルダで 2019年当時も行った手順と同様に npm install @abandonware/noble
を実行します。
あとは、toio の電源をいれて、その後に以下のプログラムを実行してみました。
2019年当時に動かしたプログラムの一部を、現在の @abandonware/noble のページのサンプルを見て、少しだけ書きかえました。プログラム内で行う基本的な処理は、2019年当時のものと同じです。
var noble = require('@abandonware/noble');
noble.on('stateChange', function(state) {
if (state === 'poweredOn') {
noble.startScanningAsync();
} else {
noble.stopScanningAsync();
}
});
noble.on('discover', async (peripheral) => {
console.log(`${peripheral.address} (${peripheral.advertisement.localName})`);
});
toio は 2台動かしていて、上記を実行した結果、以下がの出力が得られて無事に toio をスキャン結果に表示させることができました。
おわりに
今回、細かな検証をしていないので「Node.js のバージョンが当時より上がっている中で、当時と違いが何か出ていることが影響した可能性」や「@abandonware/noble のソースコードに何か手を加えられたことが影響した可能性」は残ります。
個人的には、とりあえず「2019年当時にできなかったことが、現在できる状況になった」というだけで大満足です!
そして、今回は toio で試しましたが、あれこれ試してみたいと思うデバイスは micro:bit だったりするので、こちらも試してみられればと思います。
余談
今回の記事を書くきっかけとなったイベントにて、以下のツイートがされていて、とても気になりました。
これは試してみなければ!
よもやと思ったらやっぱりNode-REDでもBLE関連復活してた。abandonwareさんのnoble使ってるみたい #iotlthttps://t.co/IB0AbUqP8L とか
— よしの (@yoshinosandesu) April 15, 2021
●node-red-contrib-generic-ble (node) - Node-RED
https://flows.nodered.org/node/node-red-contrib-generic-ble