WioLTEで自転車セキュリティシステムを作る

# 1.はじめに
私はMTBが好きでたまにポタリング途中で喫茶店や中華屋によるのだが、30分以上繁華街に愛車を停めるのはロックをしていてもやはり不安になる。
永らくこの課題に対してのソリューションは、ラズパイに3Gドングルを付けて加速度センサで振動を検知するのが最もコストが安く簡単と思っていたが、コンパクトなLTE Cat1モジュール内蔵のWioLTE登場によりいよいよ実行の時が来たのである。
なお、WioLTEの1stインプレッションは[WioLTEを使ってみた](https://qiita.com/tmurasawa/items/10e3b372b53d6f8f56b9)にまとめている。

(2017/12/11追加：2017/12/4 WioLTEユーザイベント時のLT資料をアップしました。）
[![thumbnail](http://image.slidesharecdn.com/20171204seeedwiolte-171204135458/95/slide-1-1024.jpg)](https://www.slideshare.net/torumurasawa/20171204-seeed-wiolte-lt)

 
# 2.調達物
WioLTEとSORACOM Air（Nano SIMタイプ）以外の調達物は以下である。

 <ul><li>バッテリ
WioLTEは3.7VのLiPo対応コネクタを持っている。このコネクタはJST1.0 SHコネタクという標準的なPHコネクタより1サイズ小さいものであり、結局安直な手段としてUSBモバイルバッテリーによる駆動を選択した。WioLTE自体の[消費電力](http://wiki.seeed.cc/Wio_LTE_Cat.1/#power-consumption)は常時通信状態において600mA(mA/h)となっている。このモバイルバッテリーの容量が3600mAhとなるので5〜6時間は自転車いたずらを監視できる計算となる。出先で使うには実用上十分な容量である。
    - [超薄型 モバイルバッテリー TOPVISION モバイルバッテリー 極薄の6.9mm 超軽量（60gだけ）超小型 最新の改良版　3600mAh](https://www.amazon.co.jp/gp/product/B0754LMNLY/ref=ox_sc_act_title_4?ie=UTF8&psc=1&smid=A242U3WWK4LG9J)
<img src="https://qiita-image-store.s3.amazonaws.com/0/212874/94074940-7591-d5b6-cba6-6f47ab5df010.jpeg" width=50%>


 <li>振動検知
WioLTEのGroveコネクタにポン付けできる3軸加速センサを購入した。12/1に販売された[Grove IoT スターターキット for SORACOM](https://blog.soracom.jp/blog/2017/12/01/wio-lte-grove-iot-starter-kit-for-soracom/)にも同梱されているようなので、WioLTE単品よりこちらのスターターキットの方がお得かもしれない。
    - [GROVE - I2C 3軸加速度センサ ADXL345搭載](https://www.switch-science.com/catalog/972/)
<img src="https://qiita-image-store.s3.amazonaws.com/0/212874/94127dbb-cb4a-f75a-9a2c-f00f42a2703d.jpeg" width=50%>

 <li>ケース
WioLTEとバッテリ一式を収めるケースとして、フレームに着けるウォーターボトルを選択した。ウォーターボトルに偽装する事で自然な取り付けが可能だ。
手持ちのボトルを使う際の注意点として、バッテリーとWioLTEの全幅以上の開口面積があるかをチェックしてほしい。また、LEDの光が漏れるので半透明ボトルも避けたほうが良い。
    - [CYCLE PRO(サイクルプロ) ウォーターボトル 700ml CP-WB1580](https://www.amazon.co.jp/gp/product/B008BWCZIY/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1)
</ul>

SORACOM AirのNano SIMカード含め、新規で購入した際の参考価格である。クラウドサービスはThingScaleの「30 days trial freeサブスクリプション」を利用するため、30日間は無料で使用出来る。

<table>
<th>Item<th>価格（税込）<th>調達元</th>
<tr><td>1.WioLTE(Seeed)<td>10,584<td>ソラコム</tr>
<tr><td>2.SORACOM Air(ソラコム)<td>1,313<td>Amazon</tr>
<tr><td>3.薄型モバイルバッテリー(TOPVISION)<td>1,899<td>Amazon</tr>
<tr><td>4.加速度センサ(Seeed ADXL345)<td>1,382<td>スイッチサイエンス</tr>
<tr><td>5.ウォーターボトル(CYCLE PRO)<td>473<td>Amazon</tr>
<tr><td>6.ボトルケージ(MINOURA)<td>641<td>Amazon</tr>
<tr><td><b>Total:</b><td><b>16,292</b><td></tr>
</table>
※[Grove IoT スターターキット for SORACOM](https://soracom.jp/products/#grovestarter_kit)購入の場合は1,2,4については同梱

# 3.仕組み
加速度センサでいたずら（衝撃）を検知したら、MQTTによりクラウドに通知する仕組みを作る。
せっかくなのでMQTTブローカーとして当社の[ThingScale IoT message broker](http://thingscale.io/jp/)（以下ThingScale）を使う事にした。
ThingScaleはMQTTでPublishされたデータの蓄積とThingScaleにSubscribeしているデバイスへのコマンド配信も可能なHosted MQTT brokerである。
今回は手元のスマホにgmailでいたずらを通知する仕組みとしたいので、ThingScaleのイベント機能を利用していたずら発生時にメールする事にする。
主なIoT的要素は以下となった。

- 通信:SORACOM Air/Beam
- クラウド:ThingScale
- メール:gmail

# 4.ベースシステム作成
以下のような要領でベースシステムを作成する。加速度センサは「I2C」ポートに接続する。
取り付けベースはamazonの箱の底になっている段ボールが強度含め丁度良い。今回は段ボールに全ての部品をセロテープで貼り付けた。テキトーである。
ベースシステムを組む順番はWioLTEの動作確認が取れてからでも問題ない。
（左側のLTEアンテナが上部となる）
<img src="https://qiita-image-store.s3.amazonaws.com/0/212874/d7036b96-a842-d6b7-cde7-6e2087f499c9.jpeg" width=80%>

# 5.ThingScaleの準備
ThingScaleの30日間フリートライアルを利用するため、[30日フリートライアルの開始](https://m.thingscale.io/signup/index.php)よりサインアップする。
サインアップ時のメールアドレスにコンソールのログイン用アカウントが送付されてくるので、この情報よりDev Consoleへアクセスする。
<img src="https://qiita-image-store.s3.amazonaws.com/0/212874/03ef19fc-0a35-546a-6030-120fc9ac6307.png" width=50%>

ログインするとコンソール画面が表示される。
<img src="https://qiita-image-store.s3.amazonaws.com/0/212874/e630cdb3-3086-4b51-d461-1988c97cc865.png" width=80%>


Dev Consoleの'Admin'メニュー->'View profile'の'Token Information'に含まれる「Device Token」情報をメモする。
アカウント発行時のUser_IDと上記でメモしたDevice TokenはSORACOM Beam設定時のMQTT接続ユーザ/パスワードで必要となる。

# 6.WioLTEセットアップ
WioLTEはArduino IDEでプログラミングできるのが最高である。いつでもどこでもノートPCがあればプロトタイプが可能だ。
WioLTEのセットアップについてはソラコム社のページ[LTEモデム搭載プロトタイプ向けデバイス Wio LTE をセットアップする](https://dev.soracom.io/jp/start/lte_hw_wio-lte/)の手順を参考にしながら以下githubのサンプルコードをArduino IDEにコピペしてほしい。

 <ul><li>サンプルコード
[https://github.com/tmurasawa/thingscale_shockdetect](https://github.com/tmurasawa/thingscale_shockdetect)
※Arduino IDEに貼り付けるコードは「thingscale_shockdetect.ino」
<li>加速度センサとMQTTクライアントのライブラリもArduino IDEよりインストールする。
[Seeed 3-Axis Digital Accelerometer library ](https://github.com/Seeed-Studio/Accelerometer_ADXL345)
[Arduino Client for MQTT](https://github.com/knolleary/pubsubclient)
</ul>

（サンプルコードの修正）
サンプルコード中の以下はユーザ毎に書き換える。
今回はセンサ感度の切り替えをするためMQTT Subscribeによるコマンド受信に必要なIN_TOPICの設定もしておく。SORACOMのSIMのIMSIはユーザーコンソールから確認できる。

```thingscale_shockdetect.ino
17: // ThingScale
18: #define OUT_TOPIC         "<YOUR_DEVICE_TOKEN>/json"
19: #define IN_TOPIC          "<YOUR_DEVICE_TOKEN>/<YOUR_SORACOM_IMSI>/subscribe"
```

## 振動検出ロジック
振動検出は3軸加速度センサをポーリングして一定以上の加速度の場合はクラウドに通知するロジックになるが、ADXL345がプリセットされた閾値以上の加速度で割り込みをかけるサービス(Active/In-active機能)を持っているので1秒間隔で割り込み発生を確認するロジックで振動検出を行う。
実際の閾値は、ウォーターボトルにケーシングしてMTBに搭載した環境で調整したので好みにより調整して欲しい。

 <ul><li>Activeモード
加速度測定有効（平均消費電力23uA）
 <li>In-activeモード
加速度測定有効・スリープモードに移行（平均消費電力0.1uA）
</ul>
※各モードの消費電力は[ADXL-345データシート 日本語版_Rev.A](http://www.analog.com/media/jp/technical-documentation/data-sheets/ADXL345_jp.pdf)を参照

プログラム書き込み後、RSTボタンを押してシリアルコンソールより以下メッセージが確認できればWioLTEの動作確認はOKである。
<img src="https://qiita-image-store.s3.amazonaws.com/0/212874/16f95a56-1608-e76f-15c6-938b6b958f96.png" width=80%>

# 7.SORACOM Beam設定
WioLTEからThingScaleのMQTTブローカーに直接接続しても良いが、WioLTEはMQTTS（MQTT w/TLS)を利用するのがリソース的に厳しいので以下の構成とする。

 <ul><li>WioLTE-SORACOM間
MQTT（閉域網区間なので非暗号化で問題なし）
 <li>SORACOM-ThingScale間
MQTTS（SORACOM BeamでTLSオフロードを行う）
</ul>

これでデバイス-クラウド間がEnd-to-endでセキュアとなった。
WioLTEのMQTTエンドポイントはSORACOM Beam(beam.soracom.io)となる。SORACOM Beamの設定は以下となる。

（転送先）
 <ul><li>プロトコル:MQTTS
 <li>ホスト名：m.thingscale.io
 <li>ポート番号:8883
 <li>ユーザ名:ThingScale_User_ID
 <li>パスワード:Device_Token
</ul>
（オプション）
 <ul><li>IMSI付与:ON
</ul>

<img src="https://qiita-image-store.s3.amazonaws.com/0/212874/232208d1-b29f-061c-632b-12815e93f4e7.png" width=60%>

# 8.ThingScaleにWioLTEを登録
サンプルコードを実行すると、WioLTEが自動的にSORACOMのAPNに接続し"SORACOM Beam”が付与したIMSIの名前がデバイスIDとして登録されている。
Dev Consoleの'Device'メニュー->'Device Management'ページより、WioLTEが認識されているか確認してみる。認識していない場合は振動を加速度センサに与える。
<img src="https://qiita-image-store.s3.amazonaws.com/0/212874/46ad76f4-ac73-67be-ab0c-e81ba1e98ddb.png" width=80%>

WioLTE(SORACOM Air)がデバイスとして認識されたら、時系列データベースである'チャネル'の作成とデバイスへのマップを行う。
'Channel'メニュー->'+ New Channel'より新規のチャネル作成を行う。
<img src="https://qiita-image-store.s3.amazonaws.com/0/212874/276590a8-d708-b9a6-e7cc-f185c9f18fbd.png" width=60%>

チャネル作成後、'Device'メニューに戻り、WioLTEのIMSI番号を選択してチャネル設定を行う。自動認識されたデバイスは無効となっているため"Enabled:"を"true"に変更するのを忘れないように。。
（ここではCH2をマップ）
<img src="https://qiita-image-store.s3.amazonaws.com/0/212874/5c317837-6301-aaac-dbb6-4900c1c00989.png" width=60%>

# 9.WioLTEから送信されてくるデータを確認する。
'Stream'ページから手順8.で設定したチャネルにWioLTEからの送信データ(motion）がJSONで格納されていることを確認する。
監視状態が正常（衝撃が無検知）であれば255秒に1回の頻度で{"motion":0}のデータが送信されるので通信の正常確認ができる。
衝撃を検知し、255秒間何もなければ以後{"motion":0}を送信する。
※In-activeモードへの移行時間を設定するTIME_INACTレジスタが8bitなので最大255秒となる。

## 加速度センサーの確認
（加速度センサーが動くと{"motion":1}が送信される）
<img src="https://qiita-image-store.s3.amazonaws.com/0/212874/57fa067c-6282-1990-ff00-df468a69d880.png" width=80%>

（振動検知時のシリアルコンソール画面）
<img src="https://qiita-image-store.s3.amazonaws.com/0/212874/83543469-7701-1c5c-d1fd-2eff4db2073e.png" width=80%>
（約4分毎に振動が無ければ{"motion":0}が送信される）
<img src="https://qiita-image-store.s3.amazonaws.com/0/212874/1a1eb845-0fdb-4fb7-af34-1b2cb8a6d44a.png" width=80%>

※ThingScaleのAPIを使う場合
```curl -X GET -H "X-APITOKEN: <API_TOKEN_HERE>" -H "X-ENDTIME: last" -H "X-PAGELIMIT: 10" -k https://m.thingscale.io/v2/stream/<CHANNEL_ID> | jq '.stream[]'```

データがこない場合は'SESSION'メニューよりMQTTセッションを確認する。
※WioLTEをリセットすると上手くいくケースが多い
<img src="https://qiita-image-store.s3.amazonaws.com/0/212874/d7d12798-8416-34aa-0df0-9db390ff18d7.png" width=80%>

※ThingScaleのAPIを使う場合
```curl -X GET -H "X-APITOKEN: <API_TOKEN_HERE>" -k https://m.thingscale.io/v2/session | jq '.'```

## センサ感度の調整
標準の設定値は自転車を軽く揺らした場合で反応する調整としたが、敏感と感じる場合はリモートコマンドでセンサ感度を落とす事ができる。
MQTT Publishにより、以下コマンドをWioLTEに送る事でセンサ感度が切り替わる。

 <ul><li>mode:1
センサ感度を落とす
 <li>mode:0
センサ感度を標準に戻す
</ul>

'Tools'メニュ->'Publish'メニューよりコマンドを送る。
<img src="https://qiita-image-store.s3.amazonaws.com/0/212874/ecaef583-444d-3c43-5cf0-62adf0d1e756.png" width=60%>

※ThingScaleのAPIを使う場合
```curl -X POST -H "X-APITOKEN: <API_TOKEN_HERE>" -k -d '{"payload" : "mode:1"}' https://m.thingscale.io/v2/publish/<YOUR_SORACOM_IMSI>```

コマンド発行が成功するとmode:0 またはmode:1のメッセージがWioLTEから返って来る。
<img src="https://qiita-image-store.s3.amazonaws.com/0/212874/1df440bd-a5e2-8e38-f4b0-a7566f533a28.png" width=80%>

※ThingScaleのAPIを使う場合
```curl -X GET -H "X-APITOKEN: <API_TOKEN_HERE>" -H "X-ENDTIME: last" -H "X-PAGELIMIT: 10" -k https://m.thingscale.io/v2/stream/<CHANNEL_ID> | jq '.stream[].value | select(.mode)'```

# 10.Eventの設定
クラウドまで加速度センサーの状態が上がるようになったので、ThingScaleのEvent機能を利用して、"motion=1"になった時にメール通知するようにする。
'Event'メニュー->'+ New Event'より加速度センサーのチャネルに対して以下のイベントを作成する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/212874/c6954829-1495-dce2-44c4-04a5e57e3860.png" width=80%>

加速度センサーに衝撃を与えるたびに以下メールがくればあとはウォーターボトルに組み込むだけとなる。
<img src="https://qiita-image-store.s3.amazonaws.com/0/212874/df8112a1-7dfa-22d3-2b6c-a797a382b0bb.png" width=50%>

# 11.偽装工作
以下のような要領でウォーターボトルにベースシステムを組み込む。WioLTEのコンパクトさと薄型バッテリーが今回の作戦を容易にしている。
(組み込み）
<img src="https://qiita-image-store.s3.amazonaws.com/0/212874/9aea13a9-051b-88df-98b8-8f175f319dbb.jpeg" width=50%>
（外観図）
<img src="https://qiita-image-store.s3.amazonaws.com/0/212874/d369d9d8-9d39-3e2b-e432-6f40c0ae2288.jpeg" width=50%>

# 12.実際に使ってみた。
私の愛車である「KONA Blast 2017」に偽装工作したウォーターボトルを搭載してテストしてみた。
ご覧の通り、全く自然で常時LTE接続で振動検知されているとは誰も思わないだろう。REST APIを使えば世界中どこからでも自転車の状態確認とセンサ感度変更が可能である（笑）
<img src="https://qiita-image-store.s3.amazonaws.com/0/212874/8a4d2736-368b-8f84-0520-d23e1e4c1ddb.jpeg" width=80%>
使用感は上々である。私はバイクも乗るので、さらなる小型化を図り出先のバイクセキュリティとして利用する事を検討中である。

今回、ThingScaleからWioLTEへの下り通信でセンサ感度を変更しているが、アラートが来たらGPSをONにして追跡開始などの応用も可能である。
WioLTEによりLTE通信を利用したプロトタイプも手軽にできるようになった。
皆様もアイデア次第で面白いガジェットを作ってみてください！
（WioLTEは”ワイオエルティーイー”と発音するそうですw）