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


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

## 見つけてから接続

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

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

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

```javascript
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ではこのように記載できます。

```javascript
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258216/be26fd57-e20a-4734-58cb-7e608b8cc5ee.png)


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

## awaitな書き方

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

```javascript
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");
    }
  }
}
```

## エラーハンドリング

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

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

```javascript
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](/doc/sdk/doc/ble-central)をご覧ください。

## 切断

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

```javascript
peripheral.disconnectWait();
```

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

```javascript
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258216/9283af31-4f5a-c0dd-55a0-bde4e31e5076.png)


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

```javascript
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");
  }
}
```