LoginSignup
5
3

More than 3 years have passed since last update.

ObnizからBLEで文字列を送信する

Posted at

はじめに

ObnizでBLEを使ってデータを送信するところでつまづく人が多いので、やり方をまとめてみました。

前提

Obnizがperipheralです。
Obnizがセンサデータ等をNotifyで送信する状況を想定してください。
peripheral、central、Notifyなどの言葉がわからない場合は下記を参照ください。

開発視点の超簡単BLE入門 - クラゲのIoTテクノロジー

参考

ObnizをBLE peripheralとして使うためのリファレンス

BLEペリフェラル | JavaScript SDK | obniz

ObnizをLINE Things デバイスとして使うためのサンプルコード

line-things-starter/obniz at master · line/line-things-starter

やり方

送信側

まず、Notify送信方法のおさらいです。
リファレンスでは、characteristicにwriteWait()で値を書き込み、notify()でcentralに送信しています。

obniz-ble.js
await characteristic.writeWait(([0xf0, 0x27]))
characteristic.notify();

このwriteWait()は、引数としてバイナリしか受け取れません。
幸いにも、obnizは文字列をバイナリに変換してから書き込んでくれる関数writeTextWait()を用意しているので、それを使います。

obniz-ble.js
await characteristic.writeTextWait("dataToSend")
characteristic.notify();

受信側

あとは、受信側でデータをもとに戻してやるだけです。

LINE Things 自動通信機能で、送られてきたデータをLINE Botのバックエンド(node.js)で処理する場合について説明します。
この場合、ネットワークを介すときにbase64エンコードされているため、そのデコードが必要です。

server.js
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

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3