LoginSignup
1
0

More than 3 years have passed since last update.

obnizのBLEでペリフェラルに接続する

Posted at

BLEデバイスを見つけるだけでなく接続するというのをやってみます。
接続することで実際にデータを送ったり、データを受け取ることができるようになります。

見つけてから接続

接続するためにはまず、見つけなければなりません。
そして見つけたperipheralに対してconnect()を呼ぶことで接続できます。

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

それでは、同じくアプリで作ったBlankというBLEデバイスに対して接続してみます。

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");
    await peripheral.connectWait();
    console.log("connected");
    obniz.ble.scan.start();
  }
}

callbackではこのように記載できます。

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

  obniz.ble.scan.onfind = function(peripheral){
    console.log("found");
    obniz.ble.scan.end();

    peripheral.onconnect = function(){
      console.log("connected");
    }
    peripheral.ondisconnect = function(){
      console.log("closed");
    }
    peripheral.connect();
  };

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

接続できたでしょうか。
うまく行けばこのようなログが出ると思います。

lessons_obnizjs_ble_conn.png

接続するためにはscanを終了してから接続する必要があります。

awaitな書き方

スキャンと同じく、ペリフェラルとの接続もawaitを利用して書くことができます。

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");
    var connected = await peripheral.connectWait();
    if(connected){
      console.log("connected");
    }else{
      console.log("failed");
    }
  }
}

エラーハンドリング

今は接続しているだけですが、通信を始めるとエラーが起こることがあります。
途中で相手がいなくなったとか、できないことを要求したとか。

ペリフェラルとのあいだで起きたエラーはこのように検出できます。

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

  obniz.ble.scan.onfind = function(peripheral){
    console.log("found");
    obniz.ble.scan.end();

    peripheral.onerror = function(err){
      console.log("error : " + err.message);
    }

    peripheral.onconnect = function(){
      console.log("connected");
    }
    peripheral.ondisconnect = function(){
      console.log("closed");
    }
    peripheral.connect();
  };

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

エラーには何に対してやった何のエラーなのかが入っています。
詳しくはBLE Central Docをご覧ください。

切断

接続できたペリフェラルと切断するには

peripheral.disconnectWait();

を利用します。
繋がったらすぐに切るというプログラムにする場合はこのようになります。

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

  obniz.ble.scan.onfind = function(peripheral){
    console.log("found");
    obniz.ble.scan.end();

    peripheral.onconnect = async function(){
      console.log("connected");
      peripheral.disconnect();
    }
    peripheral.ondisconnect = function(){
      console.log("closed");
    }
    peripheral.connect();
  };

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

これを実行するとこのようになります。

lessons_obnizjs_ble_disconnect.png

または、同期的な切断は以下のようなやり方です。

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");
    await peripheral.connectWait();
    console.log("connected");
    await peripheral.disconnectWait();
    console.log("disconnected");
  }
}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0