Help us understand the problem. What is going on with this article?

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

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");
  }
}
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした