Node.jsでBLE Pheripheralを実装するblenoのインストールで結構ハマった


Node.jsでBLE Pheripheralを作ってLINE Thingsで遊びたかったけどインストールで結構ハマったって話です。

[LINE Things 対応デバイスをraspberry pi zero w + Node.jsで実装してみる](https://qiita.com/pierusan2010/items/10f6ec2e0724f42190ba)の記事ではRasPiでやってますが、Mac(Mojave)でやると現在上手く出来なくなってしまっている模様。

これはハマる人はハマると思うので（この辺人口少ないかもだけど）メモしておきます。

## 前提

Node.js 8.14.0でやっています。最新の10系や11系でblenoのインストールをしようとするとコケます。MacでもWindowsでもRasPiでもコケました。

**2018年12月14日時点**の内容なので色々とメンテされて直ってる場合もあります。

> https://github.com/noble/bleno

## Mac: macOS Mojaveで現状使えない模様 （未解決）

macOS 10.14での事象です。インストールは出来るけど起動した時にアドバタイズが動いてくれません。

```bash
$ node app.js
bleno - n0bisuke-BLE-device
on -> stateChange: poweredOn
・
・
・
```

こんな感じで止まってしまいます。ほんとは`on -> advertisingStart: success`のメッセージが表示されます。

昔は僕のマシンでも動いてたんですけどね... PCのOSバージョンアップデートはこの辺のリスクがありますね。



* [stuck on startAdvertising, MacOS 10.14 #404](https://github.com/noble/bleno/issues/404)

ちなみにCentral側のnobleについては既に対応済みとのこと

> [Mojave support](https://github.com/noble/noble/pull/804)

ちなみに、issueのコメントにbleno-macというリポジトリでパッチを当てて上手く動いたって言ってる方がいます。

```
@notjosh's bleno-mac is partially working for me on 10.14: advertising works, I can connect to the "device" and can read/monitor a custom characteristic using LightBlue on iOS (the organization of the services is a bit wonky, though that's likely poor configuration on my part). @jwheatp how did you try to get things working? I did the following:

cloned https://github.com/notjosh/bleno/ and checked out the inject-bindings branch
cloned https://github.com/notjosh/bleno-mac
modified the package.json of bleno-mac so that it pointed to my local, patched copy of bleno (i.e. "dependencies": { "bleno": "/path/to/cloned/patched/bleno", ... })
modified my own app's package.json to point to the local copy of bleno-mac (as in last step).
```

とあるので試してみたけど上手くいかず... コメントにも上手くいかないって書いてる人いますね。

うーん、誰か出来たら教えてください。

## Windows: 複合的な問題があって階層が深かった（未解決）

とりあえずMacが厳しそうだったのでWindowsマシンでチャレンジです。

僕の場合はWindowsにそもそもNode.jsが入ってなかったのでそこからでした笑

* [nodistでNode.jsをバージョン管理](https://qiita.com/satoyan419/items/56e0b5f35912b9374305)
* Node.js 8.14.0を使えるようにします


まずそのままインストールしようとすると、内部で利用しているビルドツールのnode-gypによってPythonが入ってないと怒られます。

<img src="https://i.gyazo.com/3dc203626099fd01bc069df91904f6b3.png" width="400">

MacやRasPiはデフォルトでPythonが入ってるのでこの辺の依存を気にする必要は無いんですよね。ここで結構心が折れました苦笑

ただ[node-gyp](https://github.com/nodejs/node-gyp#installation)を見ると

windowsの場合は: `npm install --global --production windows-build-tools`やるといいよって書いてます。

はい、またエラーですね。
<img src="https://i.gyazo.com/c6c3d81227c50a524217cfa75a99de37.png" width="400">

また心折れそうだったけど["VCBuild.exe"がないと言われたけど、windows-build-toolsを入れたら解決したよ。](https://ginpen.com/2017/09/06/vcbuild-exe/)に書いてある内容そのままだったので、コマンドプロンプトを管理者として実行して先ほどの`npm install --global --production windows-build-tools`を実行しました。

<img src="https://i.gyazo.com/d628eaa325bdf4c0f1fc07e7277a87df.png" width="400">

そしたら上手くいったっぽい...? windows-build-toolsでPythonなど色々入ってくれる模様

<img src="https://i.gyazo.com/9c2d7e70b14d762e88636466fba3a187.png" width="400">

ドライバーインストールで詰んでる。 ここにきてハードウェア（Bluetoothアダプタ）トラブル疑ってるのですが[USBドライバのインストールしてね](https://github.com/noble/node-bluetooth-hci-socket#windows)的なところでドライバ認識できずで心折れて終了です。

![](https://i.gyazo.com/5f5ead09b81bf05bb9d666478096b10f.png)


## Raspberry Pi: うまくできた

結果やはりRasPiが安定でした。

```
sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev
```

で依存パッケージをインストールして、sudo実行できるnode.jsを用意。

```bash
$ sudo node -v
v8.14.0
```

コードは[Node.jsでBLE Peripheralの実装をするパッケージblenoを使ってみる](https://qiita.com/n0bisuke/items/e6298f13be6822965045)のコードです。

```bash
$ npm init -y
$ npm i ble
```

```bash
$ sudo node app.js
bleno - n0bisuke-BLE-device
on -> stateChange: poweredOn
on -> advertisingStart: success
・
・
・
```

やっと動いた...!

ちなみにsudo実行しないと以下のように怒られます。

```bash
bleno warning: adapter state unauthorized, please run as root or with sudo
               or see README for information on running without root/sudo:
               https://github.com/sandeepmistry/bleno#running-on-linux
```

## まとめ

長い道のりだったのでこれ以上何か作るところまでは踏み込めず苦笑

Windowsはもともとハードウェアが一定（自作PCとかも多いし）じゃないのでそもそもが難しいかもしれません。原因特定の箇所が多い。

Macに関しては今までイチバン楽に出来てた印象だったんですけど、今回のアップデートトラブルで少し様子見ですね。。。

今現状だとRasPiがNode.jsでBLEのPheripheral実装するならやりやすいかもです。

やろうとしてた人たちの参考になれば幸いです。