SORACOM LTE-M Button くん、僕と友達になってよ！！

#概要
この記事は SORACOM LTE-M Button を GET した僕が、チュートリアルを通じて Button との友情を深めていく物語です。
![friends_boys.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557096/25e4500c-dfb3-8dd5-631c-d9fd0b580d84.png)
チュートリアル中に自分が調べた内容をつらつらとまとめています。
チュートリアルの手順自体は、公式の HP をご参考ください。

#お品書き
- [SORACOM Beam](#soracom-beam)
- [SORACOM Harvest](#soracom-harvest)
- [SORACOM Funk](#soracom-funk)

#SORACOM Beam
このチュートリアルです。
https://dev.soracom.io/jp/start/enterprise_button_beam/

###IoT SIM の所属グループの設定
SORACOM のユーザーコンソールでは、各 SIM をグループごとに管理できます。
「このグループの Beam の転送先はココ！」みたいに使えます。
監視設定など色々設定できます。

###バイナリパーサー
https://dev.soracom.io/jp/docs/binary_parser/
SORACOM Air for Cellular の設定にあるバイナリパーサーという項目があります。
わからない単語は公式に聞きましょう。
>バイナリパーサーとは SORACOM Air でご利用いただけるバイナリデータをJSONデータに変換する機能です。(https://dev.soracom.io/jp/docs/binary_parser/)

SORACOM Platform 側で変換をしてくれるなんて...ありがとうございます！
※バイナリパーサーを利用すると、出力 JSON に `binaryParserEnabled: true` が追加されます。
今回のチュートリアルで使うバイナリパーサーは `@button` です。
`clickType` と `batteryLevel` を出力してくれます。

`@button`で表示されるデータはこんな感じ。
https://dev.soracom.io/jp/start/enterprise_button_harvest/

| 項目名 | 説明 | 値 |
|:---|:---|:---|
| clickType | クリックの種類 |1:シングルクリック<br>2: ダブルクリック<br>3: ロングクリック |
| batteryLevel | バッテリーレベル | 0.25 / 0.5 / 0.75 / 1.0 |

また IFTTT の形式 `(value1:...}` に合わせたバイナリパーサーもあります。
これでプログラムを一行も書かなくても、なんちゃって IoT ができちまうんだ！
API くん、いつもありがとう!

カスタムフォーマットでは、バイナリパーサーの自作もできます。
ここで「出力のフォーマットは `temp` と `humid` で...」とか指定できるんですね。
ユーザーコンソールがこんなに便利だとは...

###SORACOM Beam 設定
`UDP → HTTP/HTTPS エントリポイント` を選ぶだけ！
IMSI ヘッダを ON にすればボタンの個体を識別できます。
IMEI ヘッダを ON にすれば特定の SIM と特定のデバイスの組み合わせを識別できます。
参考：https://blog.soracom.jp/blog/2016/01/27/imei/

###SORACOM Endorse
Beam には、通信データに IMSI が付与されているので不要ですが、その他の場合は SORACOM Endorse というサービスでデバイス認証を行えるようです。
参考：https://soracom.jp/services/endorse/

#####SIM 認証のメリット
- 高耐タンパ性
- 一意性( IMSI は世界固有の ID )
- SIM 内にしかない秘密情報を使った認証や通信の暗号化

#####SORACOM Endorse のユースケース
- SORACOM Canal/Direct で接続されたネットワークのサーバーに接続するケース
- インターネットを介してサーバーに接続するケース
- SORACOM Air 以外の通信手段でインターネットを介してサーバーに接続するケース

参考：https://soracom.jp/services/endorse/ 

#####SORACOM Endorse の処理の流れ
1. IoT デバイスが SORACOM Platform に認証トークンをリクエスト
2. SORACOM Platform が IoT デバイスに認証トークンを発行
3. IoT デバイスは SORACOM Platform の発行した認証トークンをサーバに送信
4. サーバは IoT デバイスから送られてきた認証トークンを SORACOM の公開鍵で検証

という流れで、サーバはそのデバイスが正しいものか判断できるみたいです。
一度認証トークンを発行できれば、その後の通信経路は Wi-Fi でも OK !

###Beam を送信
ユーザーコンソールでの設定を終えたら、あとはボタンを押すだけです！

#####Beam のエラーログ
>Beam では直近2週間で発生したエラーログを保管しており、ユーザーコンソールやAPIから確認できます。
https://dev.soracom.io/jp/start/beam/

便利ですね！

#SORACOM Harvest
このチュートリアルです。
https://dev.soracom.io/jp/start/enterprise_button_harvest/

###SORACOM Harvest 設定
SIM グループの設定で SORACOM Harvest を ON にするだけ！
確認も SIM 管理から`データの確認`を選択すれば OK です。

###SORACOM Harvest
https://soracom.jp/services/harvest/
チュートリアルの内容に書き足すことがなかったので、 Harvest について書きます。
SORACOM Harvest には、以下2種類の機能があります。

- SORACOM Harvest Data
- SORACOM Harvest Files

Button だと基本的には Harvest Data を使うことになりそうです。
https://dev.soracom.io/jp/docs/location_service_harvest/
上記の URL にあるように、`簡易位置測位機能`を ON にしてバイナリパーサーに`@button`を設定すると、`location`データが Harvest に送られ Button の位置表示ができます。

###Private Garden
チュートリアルに書いてありました。
こんな機能あるんだ！(n度目)

>Private Garden 機能は、Beam, Funnel, Funk, Harvest のエンドポイント以外にアクセスできない機能です。デバイスから直接インターネットにアクセスできないため、よりセキュアにソラコムのサービスを利用できます。
https://dev.soracom.io/jp/docs/private_garden/

エンドポイントの種類少なくない？と思いきや、先駆者様の調査によると他の SORACOM サービスにも対応しているようです。
https://qiita.com/1stship/items/47afae52a5fd7ec53315
追加料金なしで一定のセキュリティを担保できるので便利そうです。

#SORACOM Funk
このチュートリアルです。
https://dev.soracom.io/jp/start/funk_aws_lambda/

###SORACOM Funk 設定
AWS Lambda の ARN を書くだけ！
認証情報の設定とか下準備がありますが、チュートリアル通りに進めれば OK です。
あとはボタンをクリックすれば Lambda が実行されます。

###SORACOM Funk
https://soracom.jp/services/funk/
Harvest 同様チュートリアルの内容に書き足すことがなかったので、 Funk について書きます。
まず、名前の由来がかっこいいですね！

>またサービス名については、 Function は時として Func と略される事が多いですが、響きが同じなのと、16ビートのリズムに乗ってテンポよくレスポンスが返ってくるようなイメージで Funk としました。
https://blog.soracom.jp/blog/2019/07/02/funk/

僕も Funk music 大好きです（隙自語）

###Beam や Funnel との比較
SORACOM Funk が登場するまで、`SORACOM ⇄ Lambda`の構成には、Beam または Funnel が使われていました。それらと比較した Funk のメリットをまとめます。
#####Beam と比較した Funk のメリット
- API Gateway や AWS IoT を挟まず、直接 Lambda に publish できる

API Gateway を挟まないおかげで、異常が発生した際に、原因が IoT デバイスなのか、SORACOM なのか、AWS なのかの切り分けしやすくなるそうです。(https://iot.kyoto/iotan_blog/2019/12/03/7599/)

#####Funnel と比較した Funk のメリット
- Kinesis や AWS IoT を挟まず、直接 Lambda に publish できる
- Lambda のレスポンスを直接受け取ることができる

Funnel はデバイス宛の通信には対応していません。(https://dev.soracom.io/jp/start/funnel_aws_iot/)
Funnel はその名の通り、漏斗のようにデータをアダプターにアップロードするためのサービスですし、デバイスと Lambda を連携させるには Funk が一番良さそう（というか楽そう）ですね！

#まとめ
今回は SORACOM 公式のチュートリアルを一通り試してみました。
例のボタンに触るのは初めてでしたが、複雑な設定もなくサクッと試すことができました。
SIM とハードウェアがパッケージになってるって素晴らしいですね！
ボタンワンクリックで色々動かせそうなのは胸が高まる一方、何を作るかが想像力の見せどころですね...

今日から寝る前に5分くらい考える時間をとることにします！笑