Peripheral: advertisement

obnizをBLEのペリフェラルとして使用します。つまりセントラルとなるコンピューターやスマートフォンなどから繋がれる側になります。

通常は接続されることを想定して、サービスやキャラクタリスティクスの登録を行い、それに合わせたadvertisementを発信しますが、advertisementはBLEの魅力の1つで、温度などであればこれだけで接続せずともデータを送れるため電池駆動で長く動かす事が可能となります。また、存在だけわかればいい場合にも利用されます(落とし物タグなど)。そこで、obnizでは接続されない前提であればキャラクタリスティクスなどを用意しなくてもadvertisementの情報だけ用意することができます。

2種類のadvertisement

BLEのadvertisementには2種類あります。通常のadvertisementとスキャンレスポンスです。

BLEのadvertisementは自分で発信し続けますが、データ容量が少ないため、送るべきデータが全部はいらないことがあります。なのでセントラル側はペリフェラルに対して「もっとデータはないのか」と聞くことができるようになってます。そしてそれを聞かれたペリフェラルが応答として返すのがスキャンレスポンスです。

localNameという名前はスキャンレスポンスで送ることが多いです。ではadvertisementには何を入れるのかと言うと、重要なのはサービスのUUIDです。「私にはこのUUIDのサービスがあります」とadvertisementで発信することができます。

ad(advertisement)の発信

ble.advertisementに対してadとadのスキャンレスポンス両方を設定することができます。

ble.advertisement.setAdvData()によりjson形式でadvertisementを指定します。スキャンレスポンスが必要な場合はble.advertisement.setScanRespData()によりレスポンスデータをjsonで指定します。advertisementはble.advertisement.start()により開始され、ble.advertisement.end()が呼ばれるまで発信し続けます。

以下のようにすることでこのデバイスにサービスUUID1234のサービスがあるということをadで発信し、デバイス名が”obniz BLE”であることもスキャンレスポンスで発信します。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
  await obniz.ble.initWait();
  obniz.ble.advertisement.setAdvData({
    serviceUuids: ["1234"]
  });

  obniz.ble.advertisement.setScanRespData({
    localName : "obniz BLE",
  });

  obniz.ble.advertisement.start();
}

advertisementの発信間隔は1.28secで固定となります。

詳細な設定

設定ではserviceUuidsやlocalName以外にもadvertisementの情報を入れることができます。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
  await obniz.ble.initWait();
  obniz.ble.advertisement.setAdvData({
    flags: ["general_discoverable_mode","br_edr_not_supported"],
    manufacturerData:{
      companyCode : 0x004C,
      serviceUuids: ["fff0"],
      data : [0x02,0x15, 0xC2, 0x8f, 0x0a, 0xd5, 0xa7, 0xfd, 0x48, 0xbe, 0x9f, 0xd0, 0xea, 0xe9, 0xff, 0xd3, 0xa8, 0xbb,0x10,0x00,0x00,0x10,0xFF],
    },
  });
  obniz.ble.advertisement.setScanRespData({
    localName : "obniz BLE",
  });

  obniz.ble.advertisement.start();
}

バイナリ列での設定

2つのadは、それぞれjsonを用いずバイナリ形式で直接登録する方法があります。setAdvDataRaw()setScanRespDataRaw()です。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
  await obniz.ble.initWait();
  obniz.ble.advertisement.setAdvDataRaw([0x02, 0x01, 0x1A, 0x07, 0x09, 0x53, 0x61, 0x6D, 0x70, 0x6C, 0x65 ]);
  obniz.ble.advertisement.setScanRespDataRaw([0x07, 0x09, 0x53, 0x61, 0x6D, 0x70, 0x6C, 0x65 ]);

  obniz.ble.advertisement.start();
}