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日時点の内容なので色々とメンテされて直ってる場合もあります。
Mac: macOS Mojaveで現状使えない模様 (未解決)
macOS 10.14での事象です。インストールは出来るけど起動した時にアドバタイズが動いてくれません。
$ node app.js
bleno - n0bisuke-BLE-device
on -> stateChange: poweredOn
・
・
・
こんな感じで止まってしまいます。ほんとはon -> advertisingStart: success
のメッセージが表示されます。
昔は僕のマシンでも動いてたんですけどね... PCのOSバージョンアップデートはこの辺のリスクがありますね。
ちなみにCentral側のnobleについては既に対応済みとのこと
ちなみに、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をバージョン管理
- Node.js 8.14.0を使えるようにします
まずそのままインストールしようとすると、内部で利用しているビルドツールの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実装するならやりやすいかもです。
やろうとしてた人たちの参考になれば幸いです。