obniz を LINE Things のデバイスとして使う

obnizがLINE Thingsに対応しました。
[LINE Thingsのgithubレポジトリ](https://github.com/line/line-things-starter)にもサンプルが載っています

今回はこちらを使ってみます

## LINEの準備

まずはLINE側の準備をします。
といっても、LIFFアプリを作るのはめんどくさいので、LINEがテスト用に作ってくれているサンプルをそのまま使います。（プログラムは書きません）

## LINEのアップデート
LINEのアプリを最新のものへアップデートしてください。
古いものだと、LINE Thingsの機能がまだ入っていないことがあります。

## LINE Thingsと友だちになる

LINE公式ブログの記事、[LINE の IoT プラットフォーム LINE Things の Developer Trial を試してみる](https://engineering.linecorp.com/ja/blog/line-things-developer-trial/)
内にある、QRコードより、LINE Thingsのアカウントと友達になります

>LINE と LINE Things デバイスを連携させてみよう
>
>次に、ファームウェアの書き込みが完了したら、実際に LINE へデバイスを連携してみましょう。
>
>LINE Things を利用するために、まずお使いの LINE をインストールしたスマートフォン上で、以下の QR コードを読み取って規約に同意していただき、LINE Things の機能を有効化してください。
>![qr_code-311f3503.png](https://qiita-image-store.s3.amazonaws.com/0/227015/d463f47d-1a0d-2de2-9085-70a08732c139.png)
>
>
>その後、以下のようなデバイス連携画面が見えるはずです。(一度有効化したら、次回からは “設定” → “LINE Things” からデバイス連携画面を開くことが出来ます) ここで、ファームウェアを書き込んだデバイスの電源を入れると、LINE Things デバイスが検出され “連携可能なデバイス” に “LINE Things Trial (Default Firmware)” が表示がされるはずです。表示されない場合には、スマートフォンの Bluetooth がオフになっていないか確認してください。

ひとまず、LINE Thingsの画面まで行けばOKです
<img width="375" alt="IMG_1711.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/227015/57aaa09c-be95-8e9f-e4ee-61c0860f45f2.png">



## obnizの準備

obnizのBLEの機能がfirmware v1.1.0より強化されていますので、それ以降のファームウェアで動かす必要があります。
また、firmware v1.1.0はobniz.js v1.15.0以降でないと動きませんので、SDKのバージョンもそれ以降である必要があります。


### obnizファームウェアのアップデート

#### ファームウェアの確認の仕方

obnizのスイッチを押した状態で電源を投入することでメニューが表示されます。
その中からDisplay infoを選ぶことで、ファームウェアバージョンを確認することができます。

![IMG_1612.jpg](https://qiita-image-store.s3.amazonaws.com/0/227015/9d967f20-009d-15f5-4957-a904b0eb15ef.jpeg)

![IMG_1613.jpg](https://qiita-image-store.s3.amazonaws.com/0/227015/2c3d8051-d1ea-64a3-9496-0a29567ce715.jpeg)
 

ユーザー登録をした後、クラウドコンソールから確認することもできます。

![スクリーンショット_2019-01-16_19_30_14.png](https://qiita-image-store.s3.amazonaws.com/0/227015/94f7e146-5880-a403-e3c7-f6fdde5e69c1.png)

#### ファームウェアアップデートの仕方
　ユーザー登録をした後、クラウドコンソールよりアップデートするとができます
　https://obniz.io/doc/about_cloud_console

![スクリーンショット_2019-01-16_19_32_44.png](https://qiita-image-store.s3.amazonaws.com/0/227015/44e20392-c873-696f-115d-56e528b413f8.png)

　

## プログラムを書く

Javascript部分のみ記載しています.
node.jsでもhtmlでもどちらでも動きます。

最初の行のYOUR_OBNIZ_ID のみ、自分のobniz idを入力ください

```javascript
const obnizId = 'YOUR_OBNIZ_ID';

let obniz = new Obniz(obnizId);

obniz.onconnect = async function() {
  obniz.display.clear();
  obniz.display.print('OFF');

  setSecuritySettings(obniz);

  let { PSDIService } = createSPDIService(obniz);
  let { userService, writeCharacteristic, notifyCharacteristic } = createUserSerivice(obniz);

  writeCharacteristic.onwritefromremote = async function( deviceAddress, newValue ) {
    console.log('remote button state changed : ' + newValue[0]);
    if (newValue[0]) {
      obniz.display.clear();
      obniz.display.print('ON');
    } else {
      obniz.display.clear();
      obniz.display.print('OFF');
    }
  };

  obniz.switch.onchange = async function(state) {
    console.log('button state changed : ' + state);
    if (state === 'push') {
      await notifyCharacteristic.writeWait([0x01]);
    } else {
      await notifyCharacteristic.writeWait([0x00]);
    }
    notifyCharacteristic.notify();
  };

  let advDataFromService = userService.advData;
  advDataFromService.localName = 'obniz';
  obniz.ble.advertisement.setAdvData(advDataFromService);

  obniz.ble.advertisement.setScanRespData({
    localName: 'LINE Things Trial obniz',
  });

  console.log('start advertisement');
  obniz.ble.advertisement.start();
};

function setSecuritySettings(obniz) {
  obniz.ble.security.onerror = function() {
    console.error('security set params error');
    obniz.reboot();
  };
  obniz.ble.security.clearBondingDevicesList();
  obniz.ble.security.setModeLevel(1, 2);
}

function createUserSerivice(obniz) {
  let writeCharacteristic = new obniz.ble.characteristic({
    uuid: 'E9062E71-9E62-4BC6-B0D3-35CDCD9B027B',
    data: [0x00],
    properties: ['read', 'write'],
    permissions: ['read_encrypted', 'write_encrypted'],
    descriptors: [
      {
        uuid: '2901',
        text: 'Write to change display',
      },
    ],
  });

  let notifyCharacteristic = new obniz.ble.characteristic({
    uuid: '62FBD229-6EDD-4D1A-B554-5C4E1BB29169',
    data: [0x00],
    properties: ['read', 'notify'],
    permissions: ['read_encrypted', 'write_encrypted'],
    descriptors: [
      {
        uuid: '2901',
        text: 'Notify when push button on LINE app',
      },
      {
        uuid: '2902', //2byte for CCCD
        data: [0x00, 0x00], //2byte for CCCD
        permissions: ['read_encrypted', 'write_encrypted'],
      },
    ],
  });

  let userService = new obniz.ble.service({
    uuid: '91E4E176-D0B9-464D-9FE4-52EE3E9F1552',
    characteristics: [writeCharacteristic, notifyCharacteristic],
  });

  obniz.ble.peripheral.addService(userService);

  return {
    userService,
    writeCharacteristic,
    notifyCharacteristic,
  };
}

function createSPDIService(obniz) {
  let PSDIService = new obniz.ble.service({
    uuid: 'E625601E-9E55-4597-A598-76018A0D293D',
    characteristics: [
      {
        uuid: '26E2B12B-85F0-4F3F-9FDD-91D114270E6E',
        text: obnizId, //unique id
        permissions: ['read_encrypted', 'write_encrypted'],
        descriptors: [
          {
            uuid: '2901',
            text: 'PSDI',
          },
        ],
      },
    ],
  });

  obniz.ble.peripheral.addService(PSDIService);

  return { PSDIService };
}
```


## 動かす
LINE Thingsの画面を表示しておき、obnizのプログラムを実行します。
このように選択肢が出てきます
<img width="375" alt="IMG_1712.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/227015/95cc611a-580e-7f4a-bc3c-4fb09cc389e9.png">

選択すると、ペアリング要求の後、デバイスと連携します
<img width="375" alt="IMG_1713.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/227015/d063ab3f-e2d3-1bc0-776a-c100c48e790d.png">

<img width="375" alt="IMG_1714.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/227015/7f1383cf-ca91-d7df-26d0-3537971459a2.png">

今すぐ利用を押せば、インターフェース画面に遷移して、動かすことができます。
今回のプログラムは、obnizのボタンを押したらLINE上のボタンが操作されてカウントが上がっていき、逆にLINE上のボタンを押したらobnizのディスプレイにON/OFFが表示されます。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">obnizでLINE Things! <a href="https://t.co/LgLOHfeEH1">pic.twitter.com/LgLOHfeEH1</a></p>&mdash; 9wick (@9wick) <a href="https://twitter.com/9wick/status/1092633509942910976?ref_src=twsrc%5Etfw">2019年2月5日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 


## まとめ
obnizとLINE Thingsが簡単に連携できるようになりました。どちらもプログラムをサクッと作ってサクッとデバッグできてサクッと修正できるので、BLE関係のプロトタイプ作るときに便利なんじゃないかなと思います。