BlueJelly と bleno でBLE通信する際の文字列の取り回しについて

ブラウザでお手軽BLEをするのに、BlueJellyがすごく便利なんだが、Peripheral化させたラズパイ(Node.js + bleno)とデータのやり取りする時に、Byte Arrayとかなんとかメンドクサイのが出て来て訳が分からんので、とりあえず簡単に使う方法を整理。

●データを受ける(Read)

Peripheral側から飛んできたデータはArray Bufferになってるので、文字列に戻す

//Bluejelly イベント
ble.onRead = function (data, uuid){
 let xVal = buffToString(data.buffer);
 console.log(xVal);
}

/*ArrayBufferから値を読んで文字列に変換*/
const buffToString = function(xBuffer) {
  let xArrayBuffer = new Uint8Array(xBuffer);
  let xRes = String.fromCharCode.apply(null,xArrayBuffer);
  return xRes;
}
●データを送る(Write)

Peripheralにデータを送るには文字列をArrayBufferにして、送る。

let xSendVal = "送信データ";

//文字列をArrayBufferに変換
let arrayBuffe = new TextEncoder().encode(xSendVal);
ble.write('UUID名',arrayBuffe);
●Node.js側でWriteされたデータを文字列に戻す
//xVal = writeされたデータ
let xVal = Buffer.from(Uint8Array.from(Buffer.from(data))).toString();

ラズパイをBLEのPeripheralにするためにNode.js + bleno で環境作成

Peripheral(ペリフェラル)ってのは送信側の事だそうな。ちなみに、受信側はセントラル(Central)だって。

で、本題。
とりあえず、OS入れて初期設定だけ済ませたクリーンな環境で作業開始。(出たてで怖いので、あえてOSはStretchを利用。)

■環境
ハード:Raspberry Pi Zero WH
OS:Raspbian Stretch
■n のインストール
使い勝手が良いので、Node.jsのヴァージョン管理には n を使う事にする。

apt-getで node と npm入れる → npm で n 入れる → aptで入れた node と npm 消す。

…って方法が一般的っぽいけど、入れて消すってのが気持ち悪いのと、これだと色々面倒な事になるっぽいので、apt方式はやめて、n-install を使って、先に n をインストールする。

$curl -L https://git.io/n-install | bash

無事インストールできたら、インストーラの指示に従ってエイリアス設定を再読み込み。(これをしないと、n コマンドが通らない)

$source ~/.bashrc

n コマンドが通るのを確認したら、bleno 用にnode 8.xをインストール(今回は8.15.0を利用)

$n 8.15.0
■node を sudo で実行させる
実行できるなら、この項は無視してOK。
  1. nodeのパスを確認
    $which node
  2. シンボリックリンクを作成
    (上記1で調べたパスが「/home/pi/n」だった場合の例)
    $ sudo ln -s /home/pi/n/bin/node /usr/bin/node
    $ sudo ln -s /home/pi/n/lib/node /usr/lib/node
    $ sudo ln -s /home/pi/n/bin/npm /usr/bin/npm
    $ sudo ln -s /home/pi/n/bin/node-waf /usr/bin/node-waf *もしあったら
  3. とりあえず、ラズパイを再起動して、ちゃんとヴァージョン番号が表示されるのを確認できたら、作業完了!
    sudo node -v
    sudo npm -v

    (参考サイト:日々精進EC2でsudo nodeを実行するとcommand not found」)

■blenoのインストール
・Node.js ver8.x が動いてる。
・sudo node が実行できる。

この二つの条件が整ったら、いよいよblenoをインストール!

$ sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev
$ npm install bleno

詳しいやり方等は、親切丁寧で分かりやすいページがありましたので、そちらをご覧ください。

極力ローコスト ロボット製作 ブログNode.jsとblenoでRaspberry PiとiPhoneをBLEでつなげてみる