BLE: セントラル-ペリフェラルを探す

BLEとはBluetooth Low Engeryの略で、Bluetoothの一種です。
こんな特徴を持っています

  • 省電力
  • ペアリングなしの接続モードがある
  • GATTというプロファイルが基本で、データベースのように相手を扱う
  • 1つの親に対して複数の子を接続できる
  • スマートフォンなどでかなり普及していて、多くのスマートフォンから利用できる。

obnizにもBLEの機能があります。
これを利用することで同じようにBLEを利用する照明とかスマートウォッチにつないで値を取り出したり、逆にスマホから繋がれるなんてことが可能です。

セントラルとペリフェラル

BLEでは1対多の通信となっていて、親が1存在します。その親をセントラル、子をペリフェラルと呼びます。

初期化

BLEを使用するときは最初に初期化をする必要があります。
初期化はこちらのようにやります。

  await obniz.ble.initWait();

スキャン

BLEのペリフェラルはadvertisement(直訳で広告)という信号を送り続けます。
これは「私はXXXっていうデバイスです!つなぐことができますよ!」という信号で、これを使ってセントラルは近くにいるBLEペリフェラルを探すことができます。

何も設定せずに周りにあるデバイスを全部探してみましょう。
以下のプログラムでスキャンが開始され、デバイスが見つかったらデバイスの名前を表示するようにしています。名前がないものも多いのでnullとなることがあります。


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

  obniz.ble.scan.onfind = function(peripheral){
    console.log(peripheral.localName)
  };

  obniz.ble.scan.onfinish = function(peripheral){
    console.log("scan timeout!")
  };

  obniz.ble.scan.start();
}

これによりobnizは決められた時間だけまわりにいるbleのadvertisementを集めて、どんなデバイスが近くにいるのかを調べます。
もし、見つかれば見つかったときにonfind関数を呼んで教えてくれます。

onfindの引数に入っているperipheralというのはobniz.jsのペリフェラルクラスのインスタンスです。

スキャンはある一定時間だけ行われて終わったらonfinishが呼ばれます。標準で30秒となっています。

条件付き検索

すべての検索以外にも以下の指定が可能です。

  • advertisementに含まれるUUIDを指定して検索

  • 名前(localName)を指定して検索

  • タイムアウトを30秒から変更

  • 同一のデバイスでも新しいadvertisementを受け取ったら通知。

    以下は名前を指定する例です。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
  await obniz.ble.initWait();
  var target = {
    localName: "Blank"
  };

  obniz.ble.scan.onfind = function(peripheral){
    console.log(peripheral.localName)
  };

  obniz.ble.scan.onfinish = function(peripheral){
    console.log("scan timeout!")
  };

  obniz.ble.scan.start(target);
}

検索時間を長くし、かつ同じデバイスでもadvertiseimetを再度受け取ったら通知するようにします。これによりadvertisement内に含まれるデータが変わった場合や、RSSIの変化を知ることができます。

var target = {
  localName: "Blank"
};
var setting = {
  duration: 60, // 60 sec
  duplicate: true // allow duplicate
}
obniz.ble.scan.start(target, setting);

検索時の条件としてlocalNameの他にadvetisementに入っているUUIDを指定することもできます。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
  await obniz.ble.initWait();
  var target = {
    uuids: ["1111"]
  };

  obniz.ble.scan.onfind = function(peripheral){
   console.log(peripheral.localName)
  };

  obniz.ble.scan.onfinish = function(peripheral){
   console.log("scan timeout!")
  };

  obniz.ble.scan.start(target);
}

スキャンの中断。

開始中のスキャンを中断するにはend()を利用します。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
  await obniz.ble.initWait();
  var target = {
    uuids: ["1111"]
  };

  obniz.ble.scan.onfind = function(peripheral){
    console.log(peripheral.localName)
  };

  obniz.ble.scan.onfinish = function(peripheral){
    console.log("scan timeout!")
  };

  obniz.ble.scan.start(target);
  await obniz.wait(1000);
  obniz.ble.scan.end();
}

繰り返し探索

継続的にスキャンを行うにはonfinishで再度scanを開始します。

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

  obniz.ble.scan.onfind = function(peripheral){
    console.log(peripheral.localName)
  };

  obniz.ble.scan.onfinish = function(peripheral){
    console.log("scan again")
    obniz.ble.scan.start();
  };

  obniz.ble.scan.start();
}


Next : BLE: Central-connect

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