【IoTLT 2019】新しい obniz で obniz-noble を試す（2019/12/22）

この記事は 「[IoTLT Advent Calendar 2019](https://qiita.com/advent-calendar/2019/iotlt)」の 22日目の記事です。
[同名の 2つ目のカレンダー](https://qiita.com/advent-calendar/2019/iotlt_neo)もありますが、[1つ目のほう](https://qiita.com/advent-calendar/2019/iotlt)での登録です。

## はじめに

記事に書く IoT なネタを何にしようか、キーワードだけは先月からちょこちょこメモしていたのですが、なかなか決めきれていませんでした。

そんな中、4日前に書いた以下の記事にて [obniz-noble](https://github.com/obniz/obniz-noble) を試そうとして、その手前で終わってしまっていた話が。

- 新デバイスと新機能：obniz Board 1Y と obniz-noble（2019/12/18） - Qiita
    - https://qiita.com/youtoy/items/13017a7625732a0dc27d

そして、[@miso_develop さんの記事](https://qiita.com/miso_develop/items/ed4b85448b8eb400d4df)で「obnizを使えばIoTといった記載（⇒ obnizはネットにつながってないと動かないのでこれはきっとIoT）」という心強い後押し（？）も見かけたので、今回の IoTなネタは上記の自分の obniz を使ったネタの続きということにしようと思います。

## obniz-noble について

上記の自分の記事でも触れたのですが、[obniz-noble](https://github.com/obniz/obniz-noble) は先日でてきたばかりの新ネタで、内容は [Node.js の BLE (Bluetooth Low Energy) central module である noble](https://github.com/noble/noble) をフォークして作られたものになります。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">試してみたい。<br><br>●obniz/obniz-noble: A Node.js BLE (Bluetooth Low Energy) central module<br>　<a href="https://t.co/BEu2253KyM">https://t.co/BEu2253KyM</a><a href="https://twitter.com/hashtag/obniz?src=hash&amp;ref_src=twsrc%5Etfw">#obniz</a> <a href="https://t.co/o2Yk6CPG3t">https://t.co/o2Yk6CPG3t</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1206854690903748608?ref_src=twsrc%5Etfw">December 17, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>　

### 試していく内容について

obniz-noble をいきなり試しても良いのですが、安全策として既存の noble を使ったサンプルを何か動かしてみて、その後にうまくいった内容の noble を使った部分を obniz-noble に置き換えれば良いかな、と思いました。
[この前の記事](https://qiita.com/youtoy/items/13017a7625732a0dc27d)では、noble を使ったサンプルをいくつか見つけるところまではやったのですが、試すところは時間切れでできていませんでした。

### noble を使って toio と BLE通信

ということで obniz での BLE通信を試す前に、まずは noble を使って、[toio](https://toio.io/#four-attracts) を使った内容を試してみようと思います。

#### toio側の準備

toio側は特に準備無しです。
念のため BLE の通信ができそうかを、スマホアプリの [LightBlue Explorer](https://apps.apple.com/jp/app/lightblue-explorer/id557428110) 等のアプリで確認しておくと良いかもしれません。以下のとおり、リストにでてきて UUID 等の情報が表示されていれば大丈夫です。

![c3rMF28M.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/9d6301a8-8bb4-e887-2eed-ab3aacda742c.jpeg)

![9soWRE-v.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/e085bf1b-6aac-1843-17ae-1ff795099273.jpeg)

#### PC側の準備

次に PC側の話です。
ここで試す noble は[上記の obniz のアドベントカレンダー用に書いた記事](https://qiita.com/youtoy/items/13017a7625732a0dc27d)でとりあげていた「[@abandonware/noble](https://www.npmjs.com/package/@abandonware/noble)」を使ってみることにしました。
（ ※ [noble-mac のページ](https://github.com/Timeular/noble-mac)に「`Note: this project was integrated in @abandonware/noble and is no longer actively maintained`」という形で書かれていたものです）

この内容を試される場合の事前準備は、[@abandonware/noble のページ](https://www.npmjs.com/package/@abandonware/noble)の中の [Prerequisites](https://www.npmjs.com/package/@abandonware/noble#prerequisites) に書かれた、ご自身のプラットフォームごとで違った内容となります。
自分は、「OS X」のところの「install Xcode」を行ったのみで済みました。

そして、上記の対応の後に「`npm install @abandonware/noble`」を実行してください。

#### 試してみる

ソースコードは、下記に書かれた内容を参考にしました。

●Getting started · noble/noble Wiki
　https://github.com/noble/noble/wiki/Getting-started

プログラムに関しては `require('noble');` となる部分を `require('@abandonware/noble');` とすれば、それ以外の処理は同じで OK です。
今回試したものは、以下のようなソースコードになりました。

```JavaScript
var noble = require('@abandonware/noble');

noble.on('stateChange', function(state) {
    if (state === 'poweredOn') {
      noble.startScanning();
    } else {
      noble.stopScanning();
    }
});

noble.on('discover', function(peripheral) {
    console.log('Found device with local name: ' + peripheral.advertisement.localName);
    console.log();
});
```
これで実行をしてみたのですが、toio が見つからず・・・。
デバイスを全く見つけられないのではなく、いくつかのデバイスは見つかった、という感じでした。

「そもそも、LightBlue Explorer で発見できていた多数のデバイスも見つかっていない！？」というのがあり、
また、過去のハッカソンで「Mac でうまくいかなかった BLE周りの処理を、Raspberry Pi で動かしたら、それほど特別な対応はしなくても動いた」ということがあったのを思いだし、デバイス・環境依存の問題かもしれないと思って、次のステップに進みました。

### obniz-noble で同じことをやってみる

#### 環境の準備

下記を参照して、準備をします。

●obniz/obniz-noble: A Node.js BLE (Bluetooth Low Energy) central module
　https://github.com/obniz/obniz-noble

参照した部分は、具体的には以下の辺りです。

> **Install & Usage**
For node.js
npm install obniz-noble
>
var obnizNoble = require('obniz-noble')
var noble = obnizNoble("OBNIZ_ID_HERE")

プログラム周りの話は以下で書いていきます。

#### プログラム関連

プログラムについては、「@abandonware/noble」を利用したソースコードの一部置きかえ・行の追加を行っていきます。
まず、上記のソースコードの 1行目 `var noble = require('@abandonware/noble');` の部分は `var obnizNoble = require('obniz-noble');` に置きかえてください。
そして、その下に `var noble = obnizNoble("OBNIZ_ID_HERE")` という行を追加します。**"OBNIZ_ID_HERE"**の部分は、ご自身の obniz のID（8桁の数字）に置きかえてください。

変更後のソースコードは以下のとおりです。

```JavaScript
var obnizNoble = require('obniz-noble')
var noble = obnizNoble("OBNIZ_ID_HERE")

noble.on('stateChange', function(state) {
    if (state === 'poweredOn') {
      noble.startScanning();
    } else {
      noble.stopScanning();
    }
});

noble.on('discover', function(peripheral) {
    console.log('Found device with local name: ' + peripheral.advertisement.localName);
    console.log();
});
```

こちらを実行してみます。
このプログラムは PC の Bluetooth は使っていないはずなので、それを確かめるために PC の Bluetooth をオフにしてプログラムを動作させてみました。

その結果、PC の Bluetooth はオフになっていますが、以下のように obniz の BLE が使われて、先ほどと同じように動作している様子が確認できました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/obniz1Y?src=hash&amp;ref_src=twsrc%5Etfw">#obniz1Y</a> で、obniz-noble を使い、 <a href="https://twitter.com/hashtag/toio?src=hash&amp;ref_src=twsrc%5Etfw">#toio</a> の Loocal Name を読み取れた！<a href="https://twitter.com/hashtag/obniz?src=hash&amp;ref_src=twsrc%5Etfw">#obniz</a> <a href="https://t.co/KDDbyrmvwR">pic.twitter.com/KDDbyrmvwR</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1208901196787769344?ref_src=twsrc%5Etfw">December 23, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

そして、先ほどとの違いが1つ。
プログラムの処理部分は上記の流れで試したときと同じなのに、今度は無事に toio を発見できました。
（やはり、デバイス依存か環境依存の問題だったか！！）

## さいごに

試す途中に、Mac での BLEスキャン関連のトラブルがあったため、考えていた内容を試しきれなかったのですが、引き続き、obniz での BLE周りの内容を試していければと思います。

あと、記事を準備して調べている途中で、直近で投稿されたこちらも見かけました。
こちらで、本記事では toio にあたる部分で、LightBlue のバーチャルデバイス作成機能を使っていて興味深かったです（アプリメニューで見かけつつも、試せてなかったやつ）。

●obnizのBLEでペリフェラルを探す - Qiita
　https://qiita.com/yukisato1987/items/93d22b195e7b7707525c

それと、toio での BLE 利用について、こちらを参考に操作なども試せればと思っています。

●Android/iOSアプリのLightBlueでtoioコア キューブを動かしてみる - Qiita
　https://qiita.com/kenichih/items/ef5fde749c9a20bfa2bc