Central: 変更通知の受け取り

セントラル側からの一方的な読み書きの他にペリフェラル側からセントラルに対して値の変更を通知する仕組みがBLEにはありNotifyと呼ばれています。

Notifyとは

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

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

監視登録とデータの受け取り

実際にキャラクタリスティクスに対してnotifyを受け取るよう登録するにはcharacteristic.registerNotifyWait()を利用します。引数に指定した関数がペリフェラルからのNotifyが来たときに実行されます。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
  await obniz.ble.initWait();
  var peripheral = await obniz.ble.scan.startOneWait({ localName: "Blank" });
  if(peripheral) {
    console.log("found");
    await peripheral.connectWait();
    console.log("connected");
    var service = peripheral.getService("1111");
    var char = service.getCharacteristic("2222");
    char.onregisternotify = async () => {
      console.log("register finshed")
    }
    await char.registerNotifyWait((data) => {
      console.log("notify with data " + data.join(','));
    });
  }
}

characteristic.registerNotify()characteristic.onregisternotifyを利用したcallback形式での記載も可能です。

登録の解除

notifyの受け取りが不要になった場合はcharacteristic.unRegisterNotifyWait()を利用します。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
  await obniz.ble.initWait();
  var peripheral = await obniz.ble.scan.startOneWait({ localName: "Blank" });
  if(peripheral) {
    console.log("found");
    await peripheral.connectWait();
    console.log("connected");
    var service = peripheral.getService("1111");
    var char = service.getCharacteristic("2222");
    await char.registerNotifyWait(async (data) => {
      console.log("notify with data " + data.join(','));
   await char.unregisterNotifyWait();
    });
  }
}

characteristic.unRegisterNotify()characteristic.onunregisternotifyを利用したcallback形式での記載も可能です。