Mac で noble を使って BLE対応のデバイスをスキャンする（2021年4月版）

過去に、2019年のアドベントカレンダーで以下の記事を書いた際に使った「[@abandonware/noble](https://github.com/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](https://iotlt.connpass.com/event/207823/) で @n0bisuke さんが「@abandonware/noble」の話をされていて、久しぶりに公式ページを見てみたら手順の記載が少しだけ増えていて、「これは、上記の記事を書いた際にうまくいかなかった原因が分かったかも！？」というのがあって今回の記事を書きました。

ちなみに以下の内容が、上に書いている「@abandonware/noble」の話が登場していた LT です。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">最後は <a href="https://twitter.com/n0bisuke?ref_src=twsrc%5Etfw">@n0bisuke</a> さんが、<br>Node.js＋Bluetoothの話の最新事情。<br><br> <a href="https://twitter.com/hashtag/IoTLT?src=hash&amp;ref_src=twsrc%5Etfw">#IoTLT</a> <a href="https://t.co/mLI7M2FYbW">pic.twitter.com/mLI7M2FYbW</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1382666668426489857?ref_src=twsrc%5Etfw">April 15, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 2019年にやろうとしていたこと
当時、やろうとしていたことは「[toio](https://toio.io/) というデバイスと Mac の間で、noble を使った Node.js のプログラムで通信をさせる」という内容でした。

当時の記事の内容の一部抜粋ですが、こんな感じでセットアップをして使う流れでした。

----------
![2019年の記事の一部抜粋.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/2728ec64-e35d-e9ca-e120-8dec96b58a46.jpeg)
----------

そして、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 で使う手順で以下の記載が増えていました。
![Bluetooth通信をターミナルに許可.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/88167155-62e5-8da6-3dcf-36bb131136e6.jpeg)
ターミナルアプリや iTerm2 といったアプリで、上記の設定はした覚えがなく、「この設定を追加すれば動いたりするのでは？」と思い試してみました。

## 試した内容
とりあえず、Mac の設定でターミナルアプリと iTerm2 の 2つに Bluetooth の利用を許可する設定をしました。

そして、適当に作ったフォルダで 2019年当時も行った手順と同様に `npm install @abandonware/noble` を実行します。

あとは、toio の電源をいれて、その後に以下のプログラムを実行してみました。
2019年当時に動かしたプログラムの一部を、現在の @abandonware/noble のページのサンプルを見て、少しだけ書きかえました。プログラム内で行う基本的な処理は、2019年当時のものと同じです。

```javascript
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 をスキャン結果に表示させることができました。
![スキャン結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/8e01136e-def0-02cd-212e-6c52aef4d513.jpeg)

## おわりに
今回、細かな検証をしていないので「Node.js のバージョンが当時より上がっている中で、当時と違いが何か出ていることが影響した可能性」や「@abandonware/noble のソースコードに何か手を加えられたことが影響した可能性」は残ります。

個人的には、とりあえず「2019年当時にできなかったことが、現在できる状況になった」というだけで大満足です！

そして、今回は toio で試しましたが、あれこれ試してみたいと思うデバイスは micro:bit だったりするので、こちらも試してみられればと思います。

## 余談
今回の記事を書くきっかけとなったイベントにて、以下のツイートがされていて、とても気になりました。
これは試してみなければ！

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">よもやと思ったらやっぱりNode-REDでもBLE関連復活してた。abandonwareさんのnoble使ってるみたい <a href="https://twitter.com/hashtag/iotlt?src=hash&amp;ref_src=twsrc%5Etfw">#iotlt</a><a href="https://t.co/IB0AbUqP8L">https://t.co/IB0AbUqP8L</a> とか</p>&mdash; よしの (@yoshinosandesu) <a href="https://twitter.com/yoshinosandesu/status/1382669214083731459?ref_src=twsrc%5Etfw">April 15, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

●node-red-contrib-generic-ble (node) - Node-RED
　https://flows.nodered.org/node/node-red-contrib-generic-ble