2017/8/31

Notifyでデータ読み込み

どうも、クラゲです。
Web Bluetooth APIを超簡単に扱えるBlueJellyを使って今回はNotifyを行います
セントラル(PCやスマホ)側からのタイミングではなく、ペリフェラル(BLEデバイス)側からのタイミングで読み込むため、無駄なく早くデータを読むことができます。

【 必要なもの 】

scan のときと同じです

【 デモページとソースコード 】

デバイスがBLE Nanoの場合で説明します。
BLE Nanoと繋げた可変抵抗のつまみの位置を変化させると、リアルタイムにHTML側のデータ表示も変化します。

WEB上で試せるデモページはこちら
https://secure1689.sakura.ne.jp/kurage.jellyware.jp/bluejelly/notify.html

ローカル環境で試したい方はこちらのGitHubからダウンロードし、notify.htmlを実行してください。
https://github.com/electricbaka/bluejelly


Start Notifyボタンを押して成功すると、数値が表示されます。つまみを回すとリアルタイムに値が更新されます。
Stop Notifyボタンを押すと読み込みを停止します。
notifyもread同様、scanやconnectを行っていない場合は、先にscanやconnectを行った後にnotifyする仕様となっています。
それではプログラムの解説に入ります。

【 プログラム解説(HTML) 】

前回のreadサンプルプログラムから変更は1か所のみ。

HTMLのreadボタンを消して、Start NotifyボタンとStop Notifyボタンを追加しました。

<button id="startNotifications">Start Notify</button>
<button id="stopNotifications">Stop Notify</button>

【 プログラム解説(JavaScript) 】

notifyはstartとstopの2種類ありますが、フローは似たような感じです。

startNotify中にデータを受け取るとonReadイベントが呼ばれます。
データを受け取るタイミングはBLEデバイス側で決まっています。
onReadの中身は Readサンプルプログムと全く同じです。

ble.onRead = function (data, uuid){
  //フォーマットに従って値を取得
  value = data.getInt16(0);//2Byteの場合のフォーマット
 
  //コンソールに値を表示
  console.log(value);
 
  //HTMLに値を表示
  document.getElementById('data_text').innerHTML = value;
 
  document.getElementById('uuid_name').innerHTML = uuid;
  document.getElementById('status').innerHTML = "read data"
}

startNotify処理が終わるとonStartNotifyイベントが呼ばれます。
ここではStart Notifyが始まったことを伝えているだけです。
実際にデータを取得するタイミングはonRead時です。

ble.onStartNotify = function(uuid){
  console.log('> Start Notify!');
 
  document.getElementById('uuid_name').innerHTML = uuid;
  document.getElementById('status').innerHTML = "started Notify";
}

同様にstopNotify処理が終わると、onStopNotifyイベントが呼ばれます。

ble.onStopNotify = function(uuid){
  console.log('> Stop Notify!');
 
  document.getElementById('uuid_name').innerHTML = uuid;
  document.getElementById('status').innerHTML = "stopped Notify";
}

ボタンが押されたときの関数呼び出しを指定します
今回はnotifyなので、ble.startNotify(uuid)及びble.stopNotifyで呼び出しています。

document.getElementById('startNotifications').addEventListener('click', function() {
      ble.startNotify('UUID1');
});
 
document.getElementById('stopNotifications').addEventListener('click', function() {
      ble.stopNotify('UUID1');
});

うまくいかない場合

特にBLE Nano以外を使っていてうまくいかない人は、以下の3点を確かめてください

これでBLEデバイスからデータを読み込むReadとNotifyについては学んだので、次回はBLEデバイスへの書き込みに挑戦しましょう
以上、Notifyでデータ読み込みでした!