Edited at
Node.jsDay 8

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

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

LINE Things 対応デバイスをraspberry pi zero w + Node.jsで実装してみるの記事では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での事象です。インストールは出来るけど起動した時にアドバタイズが動いてくれません。

$ node app.js

bleno - n0bisuke-BLE-device
on -> stateChange: poweredOn



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

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

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


Mojave support


ちなみに、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が入ってなかったのでそこからでした笑

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

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

ただnode-gypを見ると

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

はい、またエラーですね。

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

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

ドライバーインストールで詰んでる。 ここにきてハードウェア(Bluetoothアダプタ)トラブル疑ってるのですがUSBドライバのインストールしてね的なところでドライバ認識できずで心折れて終了です。


Raspberry Pi: うまくできた

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

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

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

$ sudo node -v

v8.14.0

コードはNode.jsでBLE Peripheralの実装をするパッケージblenoを使ってみるのコードです。

$ npm init -y

$ npm i ble

$ sudo node app.js

bleno - n0bisuke-BLE-device
on -> stateChange: poweredOn
on -> advertisingStart: success



やっと動いた...!

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

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実装するならやりやすいかもです。

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