BLE: セントラル-値の変更通知を受け取る

前回までの内容ではBLEではセントラルからペリフェラルに対して、キャラクタリスティクスにある値を書き込んだり、読み取ったりと一方的な読み書きを行ってきました。

しかし、ペリフェラルからセントラル側に値を送りたいこともあるはずです。
例えば、これが温度センサーのBLEペリフェラルで、温度が変わったときなどです。

セントラルから定期的に値を読み取ってもよいのですが、より少ない通信でやろうと思うと、ペリフェラルからセントラルに何か通知ができると良いですよね。それがNotify(ノーティファイ)です。

Notifyとは

Notifyはペリフェラルからセントラルに対して「このキャラクタリスティクスの値変わったよ」と変更を通知するための機能です。このような流れで利用できます。

  1. セントラルからペリフェラルに対して「このキャラクタリスティクスを監視したい」と設定しておきます。
  2. ペリフェラルは値が変わったら(変わってなくても)セントラルに対してNotifyを送れます。
  3. セントラルはそれを受け取ってから値を読み取ることで最新の情報を取得できます。

obnizでもnotifyには対応しています。
残念ながら前回まで使ってきたLightBlueではNotifyを送れないので、実験されたい場合はNotifyを送るようなアプリかデバイスを使う必要があります。

利用方法

obniz.jsではこのようにキャラクタリスティクスに対してnotifyが来たときに呼び出される関数を設定できます。

characteristics.registerNotify( async function() {
  console.log("Notified!");
});

実際に使う

実際にキャラクタリスティクスに対して登録して、Notifyが来たときに
値を読み取るようにプログラムするとこのようになります。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
  var peripheral = await obniz.ble.scan.startOneWait({ localName: "Blank" });
  if(peripheral) {
    console.log("found");
    var connected = await peripheral.connectWait();
    if(connected){
      console.log("connected");
      var service = peripheral.getService("1111");
      var char = service.getCharacteristic("2222");
      var data = await char.readWait();
      console.log(data)

      char.registerNotify( async function() {
        console.log("Notified!");
        var data = await char.readWait();
        console.log(data)
      });
    }else{
      console.log("failed");
    }
  }
}


Next : BLE: Peripheral-start advertisement

You will Get in Few Days

Circuit for Starter “obniz Board” is available on Amazon and other online stores.
You can get it at below

Our products and resellers

Forum

Visit our developer’s forum to discuss and discover technologies.

Forum

Contact

Feel free to contact out support and technical team.

Contact us