Peripheral: 値の変更を相手に通知

obnizをBLEのペリフェラルとして使う場合、他の端末がBLEでobnizデバイスに接続して値の読み書きを行うことになります。その値はBLE経由で相手が書き換えることも出来ますし(書き込み権限があれば)、自分から値を変えることも可能です。しかしただ値を変えるだけでは接続中の相手に変わったことが伝わりません。Notifyを使えば相手に「このキャラクタリスティクスの値が変わった」と伝えることができます。

変更を通知

characteristic.notify()関数を使うことでキャラクタリスティクスの値が変わったことを接続中のデバイスに送ることができます。ただし、Notifyを送れるcharacteristicsはnotifyが送れるような属性を持っている必要があります。
具体的にはpropertyで”notify”を持っている必要があり、ディスクリプタにCCCDというのが存在する必要があります。キャラクタリスティクス作成時にdescriptorの項目でCCCDを以下のように設定する必要があります。また接続中の相手もnotifyを受け取れるようにsubscribeしている必要があります。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {

  await obniz.ble.initWait();
 // create servce & characteristics
  var service = new obniz.ble.service({ uuid : "1234" });
  var characteristic = new obniz.ble.characteristic({
    uuid : "7777",
    data: [1, 2, 3],
    properties : ["read","write","notify"],  // add notify properties
    descriptors: [
      {
        uuid: '2902', //CCCD
        data: [0x00, 0x00],  //2byte
      }, 
    ],
  });
  service.addCharacteristic(characteristic);
  obniz.ble.peripheral.addService(service);

  // advertisement
  obniz.ble.advertisement.setAdvData(service.advData);
  obniz.ble.advertisement.setScanRespData({
    localName : "obniz BLE",
  });
  obniz.ble.advertisement.start();

  // on connection
  obniz.ble.peripheral.onconnectionupdates = function(data){
    console.log("remote device ", data.address, data.status)

    setTimeout(async function(){
      await characteristic.writeWait([0xFF])
      characteristic.notify();
    }, 10000)
  };
}