TI SensorTagをブラウザから使う(2)：with LINE Things

前回に引き続きTIが販売している小型で電池駆動のSensorTagを使ってみます。
　[TI SensorTagをブラウザから使う(1)：with Chromeブラウザ](https://qiita.com/poruruba/items/16f1a43fdf07c8a03b5b)

今回は、TIのSensorTagをLINE Thingsに対応させ、LINEアプリの中でセンサー情報を表示してみます。また、ついでに、LINE Beaconにも対応させます。

結構、めんどかったです。SensorTagのファームウェアのカスタマイズが。

以下の手順で進みます。

* LINE Thingsトライアルプロダクトを作成し、サービス探索用serviceUUIDを取得します。
* LINE BeaconのためのハードウェアIDを払い出します。
* サービス探索用serviceUUIDとハードウェアIDを埋め込めるように、SensorTagのファームウェアをカスタマイズします。
* LINEアプリから接続します。

# LINE Thingsのためのサービス探索用serviceUUIDの取得

以下に手順があります。
　https://developers.line.biz/ja/docs/line-things/regist-product/

LINE Things対応デバイスは、LIFFアプリに紐づきます。また、LIFFアプリは、Message APIのチャネルに紐づきます。
そして、LINEアプリユーザは、LINE Things対応デバイスをBLEスキャンして発見し、LINE Things対応デバイスが属するチャネルとお友達になることで、LINEアプリからそのLINE Things対応デバイスを扱えるようになります。
LINE Things対応デバイスを扱うためのアプリが、LIFFです。

〇まず、LIFF APP IDを作成します。

LINE Developerページから、Messaging APIのプロバイダを選択します。まだ作成していない場合は作成してください。
そして、LIFFタブを選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261826/f15bfcc3-e868-0ab2-f6b4-09ba297f72d0.png)

右側にある「＋追加」ボタンを押下します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261826/3d9c37e7-ce17-46bf-40fd-2bcdbbd52380.png)

名前には適当な名前を付けます。たとえば、「SensorTag Application」とでもしておきます。
サイズは、LIFFアプリのWindowsサイズです。Fullでいいでしょう。
エンドポイントURLには、LIFFアプリのWebページを指定します。1回目の投稿で作成したWebページのことです。
BLE freatureは、当然ONにします。

完了すると、LIFF URLが割り当たります。
line://app/ より右側にある文字列がLIFF APP IDです。

ちなみに、1回目で作成したWebアプリのJavascriptは、LIFFアプリとしても動作するように実装してありますので、LINEアプリからでもChromeからでもどちらからでも開けます。

(参考)
https://developers.line.biz/ja/reference/line-things/#liff-bluetooth-getavailability



〇次に、サービス探索用serviceUUIDを取得します。

以下のページを参考に、CurlやPostman等を使って取得します。
　https://developers.line.biz/ja/docs/line-things/regist-product/
 
レスポンスのうちの、「"serviceUuid": "{serviceUuid}"」が大事です。覚えておきます。
忘れてしまったら以下を参考に呼び出せばわかります。
　https://developers.line.biz/ja/reference/line-things/#get-trial-products

# ハードウェアIDを取得する。

以下のページから、LINE BeaconのためのハードウェアIDを取得します。

https://admin-official.line.me/beacon/register#/botlist

対象のチャネルを選択して、「ハードウェアID発行」ボタンを押下するだけです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261826/a8a09072-94cd-a957-bf4d-d25ae903cbfe.png)

LINE Beaconは、この払い出されたハードウェアIDでMessage APIのチャネルに紐づけられます。
LINEアプリでは、LINE Beacon対応デバイスが属するチャネルとお友達になることで、LINE Beaconから通知を受けることができるようになります。

# SensorTagのファームウェアをカスタマイズする

変更内容は以下の通りです。これが一番苦戦しました。

* LINE Things対応デバイス

・ボンディングの前に、サービス探索用serviceUUIDをアドバタイズできる
・ボンディングができる
・ボンディング後の通信が暗号化される
・デバイス特定用characteristicから、デバイスを一意に識別する値を読み込める
・デバイス特定用characteristicは、属性のパーミッションを暗号化（Encryption）に設定してください。
(参考)
https://developers.line.biz/ja/docs/line-things/create-product/

デバイスを一意に識別する値として、今回はBluetooth MACアドレス(リトルエンディアン)としました。

* LINE Beacon対応デバイス

・アドバタイズデータに、ハードウェアIDを含む「LINE Simple Beacon Frame」を含める。
(参考)
　https://github.com/line/line-simple-beacon/blob/master/README.ja.md

アドバタイズデータの最大長の制限により、LINE Things対応デバイスとLINE Beacon対応デバイスを同時に有効にすることができませんでした。以降のカスタマイズでは、Characteristicに0x00または0x01を書き込むことによって切り替えられるようにします。
もろもろのソースコード変更分を以下に置きました。オリジナルのファイルも置いておいたので、比較してみてください。

　https://github.com/poruruba/sensortag_modified

ちなみに、コンパイル時にROM容量が足りなくなったので以下の機能を削除しています。

* OAD(Over the Air Download）
* FACTORY_IMAGE

ですので、一度更新したらOTAで更新できなくなります。（なので、デバッガボードCC-DEVPACK-DEBUGを所有している方限定なのです）
それから、既存のSensorTagサンプルアプリをJust Works Pairing対応しようとしましたがうまくいかず、SamplePeripheralサンプルアプリをベースに、SensorTagサンプルアプリの機能を移植して、LINE用にカスタマイズしました。

# カスタムファームウェアの使い方

* サービス探索用serviceUUIDの設定
Characteristic UUID：linethings.cのlinethingsProfileServiceUuidCharUUIDで示すUUID
に、サービス探索用serviceUUID(16バイト)をリトルエンディアンでWriteします。

* ハードウェアIDの設定
Characteristic UUID：linethings.cのlinethingsProfileBeaconHwidCharUUIDで示すUUID
に、ハードウェアID(5バイト)をWriteします。

* LINE ThingsとLINE Beaconの切り替え
Characteristic UUID：linethings.cのlinethingsProfileSwitchCharUUIDで示すUUID
に、以下の値(1バイト)をWriteします。
	0x00：LINE Things対応デバイス
	0x01：LINE Beacon対応デバイス

# LINE Things対応デバイスとしてLINEアプリから接続する

サービス探索用serviceUUIDを設定し、LINE Thingsに切り替わっていることを確認します。（アドバタイズデータを見ればわかります。）

LINEアプリを立ち上げて、右上の歯車のマークを選択して設定画面を表示します。
そこに、「LINE Things」という選択肢があるかと思います。それを選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261826/81141ea4-48b4-65dd-ce98-4fdcbba6d471.png)

連携可能なデバイス に、SensorTag というのが現れていると思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261826/1d5762af-139b-1ce9-75ea-3c2162a693f7.png)

それを選択します。以下のようなダイアログが表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261826/0c2ffbb4-ba86-799c-1f32-919a2ae8019f.png)

「今すぐ利用」を押下すると、マイデバイスにSensorTagが追加されて、紐づけていたLIFFアプリが起動します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261826/c53dc355-ff26-bad0-d9d7-f396f9d2f8a3.png)

後は、1回目の投稿と同じように、「接続」ボタンを押下して、チェックボックスをチェックすれば、センサー情報が取得されるかと思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261826/e8b32b7c-6546-0448-68fc-be6e0254bf69.png)

ちなみに、1回目の投稿で、sensortag.jsにおいて、以下のようにしていましたが、今回取得したサービス探索用serviceUUIDに指定することで、BLEスキャン範囲を絞ることができます。

* const UUID_SERVICE_LINETHINGS = "【LINE Thingsのサービス探索用serviceUUID】"; //1回目では使いません。 
* filters: [{services:[ /* service_uuid */ BluetoothUUID.canonicalUUID(0x180f) ]}], // 1回目ではとりあえずこんな感じ

#LINE Beaconとして起動する

ハードウェアIDを設定し、LINE Beaconに切り替わっていることを確認します。（アドバタイズデータを見ればわかります。）
LINE Beaconから通知が飛ぶようになるので受ける側のRESTfulサーバを立ち上げます。

そのやり方は、過去の投稿の以下を参考にしてください。
　[LINE Beaconを自宅に住まわせる](https://qiita.com/poruruba/items/a28476ad53b2232c789d)

以上