Central: 接続

BLEペリフェラルに接続するには2つの方法があります。

  • スキャンして見つけたペリフェラルに接続
  • デバイスアドレスを指定してスキャンせずに接続

スキャンして接続

スキャンして発見したperipheralに対してはbleRemotePeripheral.connectWait()を呼ぶことで接続できます。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
  await obniz.ble.initWait();
  var target = {
    localName: "Blank"
  };
  var peripheral = await obniz.ble.scan.startOneWait(target);
  if(peripheral) {
    console.log("found");
    try {
      await peripheral.connectWait();
      console.log("connected");
    } catch(e) {
      console.error(e);
    }
  }
}

接続とスキャンの同時実行はできないため、接続開始と同時にスキャンは自動停止されます。ただ、接続してしまったあとの両立はできますので再度スキャンの実行ができます。

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

  obniz.ble.scan.onfind = async function(peripheral){
   try {
      await peripheral.connectWait();
      console.log("connected");
      await obniz.ble.scan.startWait(target);
    } catch(e) {
      console.error(e);
    }
  };

  obniz.ble.scan.onfinish = async function(peripherals, error){
    await obniz.ble.scan.startWait(target);
  };

  await obniz.ble.scan.startWait(target);
}

アドレスを指定しての接続

一度スキャンしたなどで、既にアドレスが分かっているデバイスにはdirectConnectWait()関数で接続が可能です(またはdirectConnect()関数)。周りにデバイスが多い場合などスキャンにかかる時間を省くことができます。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
  await obniz.ble.initWait(); 
  try {
    var peripheral = await obniz.ble.directConnectWait("e4b9efb29218", "random");
    console.log("connected");
  } catch(e) {
    console.log("can't connect");
  }
}

サービスとキャラクタリスティクスの自動検索

obniz.jsでは接続完了後に自動的にペリフェラルの持つサービスとそれに紐づくキャラクタリスティクス・ディスクリプタを自動検索し、完了後に接続完了となるため、即座に全てのサービスやそれ以下に対する操作が可能です。

もし、接続時間等の問題で自動検索をやめたい場合は、bleRemotePeripheral.connectWait()の引数を{autoDiscovery:false}とすることで設定が可能です。

その場合、手動でサービスとキャラクタリスティクスを検索する必要がありますので、bleRemoteService.discoverAllCharacteristicsWait()bleRemoteCharacteristic.discoverAllDescriptorsWait()を使う必要があります

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
  await obniz.ble.initWait({});
  obniz.ble.scan.onfind = function(peripheral){
    if(peripheral.localName == "my peripheral"){
      peripheral.onconnect = async function(){
        console.log("success");
        await peripheral.discoverAllServicesWait(); //manually discover
        let service = peripheral.getService("1800");
        await service.discoverAllCharacteristicsWait(); //manually discover
        let characteristics = service.getCharacteristic("ff00");
        await characteristics.discoverAllDescriptorsWait(); //manually discover
        let descriptor = characteristics.getDescriptor("fff1");
      }
      peripheral.connect({autoDiscovery:false});
    }
  }
  await obniz.ble.scan.startWait();
}

エラーハンドリング

無線通信ですので、通信を始めた後にエラーが起こることがあります。途中で相手がいなくなった場合や、できないことを要求した場合などです。

ペリフェラルとのあいだで起きたエラーはbleRemotePeripheral.onerrorに設定した関数で受け取ることができます。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
  await obniz.ble.initWait();
  var target = {
    localName: "Blank"
  };
  var peripheral = await obniz.ble.scan.startOneWait(target);
  if(peripheral) {
    console.log("found");
    try {
      await peripheral.connectWait();
      peripheral.onerror = function(err){
        console.log("error : " + err.message);
      }
      console.log("connected");
    } catch(e) {
      console.error(e);
    }
  }
}

切断

接続中のペリフェラルと切断するにはdisconnectWait()を利用します。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
  await obniz.ble.initWait();
  var target = {
    localName: "Blank"
  };
  var peripheral = await obniz.ble.scan.startOneWait(target);
  if(peripheral) {
    try {
      console.log("found");
      await peripheral.connectWait();
      console.log("connected");
      await peripheral.disconnectWait();
      console.log("disconnected");
    } catch(e) {
      console.error(e);
    }
  }
}