2017/8/28

Readでデータ読み込み

どうも、クラゲです。
Web Bluetooth APIを超簡単に扱えるBlueJellyを使って今回はReadを行います
BLEデバイスのセンサー値やスイッチのOFF/ONなどを読むことができます

【 必要なもの 】

scan のときと同じです

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

デバイスがBLE Nanoの場合で説明します。
BLE Nanoと繋げた可変抵抗のつまみの位置により、readする度に値が変化します。

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

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


成功すると、数値が表示されます。つまみを回して再びReadボタンを押すと値が更新されます。
scanとconnectから順番に学習してきた人は気づいていると思いますが、今回scanとconnectボタンがありません。
実はBlueJellyのreadは、scanやconnectを行っていない場合は、先にscanやconnectを行った後にreadする仕様となっています。
逆にscanやconnectが完了している場合は、readのみ行う仕様です。
なので、scanボタンやconnectボタンはあってもなくてもどちらでもOKです。ボタンが多いとごちゃごちゃするので今回は消しました。
それではプログラムの解説に入ります。

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

前回のconnectサンプルプログラムから追加点は2点のみ。

HTMLのScanボタンとConnectボタンを消して、Readボタンを追加しました。

  <button id="read">Read</button>

HTMLにデータ値を表示させるための場所を追加しました。
デフォルト表示は無しとしました。

  <div id="data_text"> </div>

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

readのフローもscanやconnectと同様です

scanとconnectのフローは省略しています。

READ後に、何をするかを記述します。
BlueJelly.jsにてREAD処理が終わるとonReadイベントが呼ばれます。(引数にはデータ値とUUID名が入る)
ここでは、2Byte(=16bit)のデータとして取得してvalueへ入れています。
valueの値をコンソールとHTMLの両方に表示し、UUID名とステータスをHTMLに表示しています。

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"
}

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

document.getElementById('read').addEventListener('click', function() {
      ble.read('UUID1');
});

うまくいかない場合

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

読み込む度にReadボタン押すのが面倒!

このように感じた人は多いのではないでしょうか?
連続でReadしたい場合は、onReadの中で ble.read を行ったり、タイマーを使って ble.readを呼び出したりすることを思いついたはずです。
このやり方も間違ってはいませんが、BLEではもっとスマートなRead方法があります。
それはNotifyです。セントラル(PCやスマホ)側からのタイミングで読むのではなく、ペリフェラル(BLEデバイス)側のタイミングで通知してもらう手法です。
これがもっとも適切で無駄なく早く値を取得できます。

次回は、Notifyについて実践していましょう
以上、Readでデータ読み込みでした!