nobleでお手軽BLE通信(構築編)

nobleというNode.jsのパッケージがある。
公式のGithubページは以下です。

noble

これをいれれば、自分のパソコンをBLEの発信機にすることができるすごいパッケージなのです。

今回はGithubのサンプルを試して見ようと思います。
ですが、久しぶりにNode.jsを触ったのでインストールに手こずりました。。
RubyとかNodeとか、環境構築に一番時間がかかる気がする。。
Gemとかnpmが一発でインストールできた例がない。。

では行きます!

実行環境

今回は、以下の環境で試しました

  • OS X El Capitan 10.11.6
  • ✗Node.js v6.9.1 -> ◯v4.7.2

最初一番新しい安定バージョンv6.9.1で試したら動かずv4.7.2で試したら動いたというのが今回のあらましです。

Githubのサンプルを試す

最初node.jsのバージョンはバージョンv6.9.1で試しました。

Githubのリポジトリーを見る限りexamplesディレクトリがあり、色々試せそうな感じでした。
なので何も考えずgit cloneをしましょう。

git clone git@github.com:sandeepmistry/bleno.git  

一番カンタンそうなサンプル、battery-serviceを試してみたいと思います。

説明のページはここです。 https://github.com/sandeepmistry/bleno/tree/master/examples/battery-service

battery-serviceのディレクトリまで移動します。

cd bleno/examples/battery-service/  

npmをインストールしてみます。

npm install  

すると何やらgyp ERR! configure errorというエラーがでてしまっていました。

依存のパッケージがインストール&ビルドできていない状況みたいでした。

こちらを確認して
npm installで起こるnode-gypのエラーの対処方法
python2.7をインストールしました。

でも失敗する。。

あれ?もしかして、Nodeのバージョンが悪いのかな?

Node.jsのバージョンを下げる

v6.9.1バージョンに対応していないことを疑って、Node.jsのバージョンを下げることにしました。
Node.jsのバージョン管理にnodebrewをつかってた気もしたのですが、直接インストールしたかもしれないので、一度Node.jsをアンインストールすることにしました。

こちらの記事を参考にしました。
node.jsのversionを管理するためにnodebrewを利用する

まず、nodeが生きているかを確認します。

node -v

バージョンが出てきたら、生きているので削除します。

$ curl -o uninstall-node.sh https://gist.githubusercontent.com/nicerobot/2697848/raw/uninstall-node.sh
$ chmod u+x uninstall-node.sh 
$ ./uninstall-node.sh 
$ rm uninstall-node.sh
$ sudo rm -rf /usr/local/include/node
$ sudo rm -rf /usr/local/lib/dtrace
$ rm -rf ~/.node-gyp
$ rm -rf ~/.npm
$ rm -rf ~/.sourcemint 

nodebrewをインストールします。

$ curl -L git.io/nodebrew | perl - setup
...
========================================
Add path:

export PATH=$HOME/.nodebrew/current/bin:$PATH  
========================================

インストールの出力に出ていたようにexport PATH=$HOME/.nodebrew/current/bin:$PATHのパスを通します。  
~/.bash_profileに追加します。

vim ~/.bash_profile  
#export PATH=$HOME/.nodebrew/current/bin:$PATH追加
$ source ~/.bash_profile
$ nodebrew help

nodebrewを使えるようになりました。
バージョンを変えます。

まず利用できるバージョンを確認します。

nodebrew ls-remote

その中でv4.7.2をインストールします。

$nodebrew install-binary v4.7.2
Fetching: https://nodejs.org/dist/v4.7.2/node-v4.7.2-darwin-x64.tar.gz  
######################################################################## 100.0%
Installed successfully

ローカルで使用可能なバージョンを確認します。

$nodebrew ls
v4.4.7  
v4.7.2  
v6.9.1

current: v6.9.1  

使用するバージョンをv4.7.2に変更します。

$nodebrew use v4.7.2
use v4.7.2

nodeコマンドでバージョンを確認します。

$ node -v
v4.7.2

あらためてbattery-serviceを試す!

これで上手く行くはず! battery-serviceのディレクトリに移動してnpm installです

$ cd battery-service/
$ npm install
...

上手くいけばエラーなく完了します。

サンプルをnodeコマンドで実行してみます。

$ node main.js 
on -> stateChange: poweredOn  
on -> advertisingStart: success  
setServices: error Error: failed to set service 180F, UUID not allowed!

なんかエラーがでました。failed to set service 180F, UUID not allowed!とあるのでUUIDが180Fだと桁が少なくて認められていないとあります。

UUIDを作成します。

uuidgen  
DA211EFD-156D-437E-9120-0815F5B4FCB4  

この値をbattery-service.jsのuuidへ書き換えます。

//battery-service.js
function BatteryService() {  
  BatteryService.super_.call(this, {
      uuid: 'DA211EFD-156D-437E-9120-0815F5B4FCB4',
      characteristics: [
          new BatteryLevelCharacteristic()
      ]
  });
}

もう一度実行

$ node main.js
on -> stateChange: poweredOn  
on -> advertisingStart: success  
setServices: success  

上手くいっているようです。

スマフォで確認してみます。 iOSでBLEの通信を受信できるアプリLightBlueで確認してみます。

どうやらこのtkrというものみたいです。

とりあえず、動いたので、良しとします。

最後に

今度は自分のMacをiBeaconにしたいと思います。
もっとドキュメント読み込もう。

最後まで読んでいただいてありがとうございました。