はじめに
ObnizでBLEを使ってデータを送信するところでつまづく人が多いので、やり方をまとめてみました。
前提
Obnizがperipheralです。
Obnizがセンサデータ等をNotifyで送信する状況を想定してください。
peripheral、central、Notifyなどの言葉がわからない場合は下記を参照ください。
参考
ObnizをBLE peripheralとして使うためのリファレンス
ObnizをLINE Things デバイスとして使うためのサンプルコード
line-things-starter/obniz at master · line/line-things-starter
やり方
送信側
まず、Notify送信方法のおさらいです。
リファレンスでは、characteristicにwriteWait()
で値を書き込み、notify()
でcentralに送信しています。
await characteristic.writeWait(([0xf0, 0x27]))
characteristic.notify();
このwriteWait()
は、引数としてバイナリしか受け取れません。
幸いにも、obnizは文字列をバイナリに変換してから書き込んでくれる関数writeTextWait()
を用意しているので、それを使います。
await characteristic.writeTextWait("dataToSend")
characteristic.notify();
受信側
あとは、受信側でデータをもとに戻してやるだけです。
LINE Things 自動通信機能で、送られてきたデータをLINE Botのバックエンド(node.js)で処理する場合について説明します。
この場合、ネットワークを介すときにbase64エンコードされているため、そのデコードが必要です。
const blePayload = thingsData.bleNotificationPayload;
console.log(blePayload); // ZGF0YVRvU2VuZA==
// 受信データをbase64デコードする
const buffer = new Buffer.from(blePayload, 'base64');
const reveiveData = buffer.toString('utf-8');
console.log(reveiveData); // dataToSend
注意点
BLE Notifyのペイロードのうち、ユーザが利用できるのは20Byteまでです。
英数字なら20文字、日本語なら1文字3バイトのため6文字までです。
それ以上のデータの送信を試みると切り捨てられてしまうため、分けて送信するなど工夫が必要です。
分けて送信をやってみた記録を下記エントリーに残しているので、参考にしてみてください。
移動中の心拍数(位置情報付き)をモバイル回線経由で記録する。丸1日動かせるくらいの低消費電力で。 - Qiita