SORACOM LTE-M Button for Enterpriseを使ってみた

# SORACOM LTE-M Button for Enterpriseを使ってみた
2019年4月10日に発表されたSORACOM LTE-M Button for Enterpriseを一個からでも買えるようになったということで、早速、購入しました。俗にいう、あのボタンです。

![IMG_1891.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33220/41da26da-3c75-fd55-fa80-29809034218b.jpeg)


### 届いたらやること
４月１０日の昼に注文して、東京のアジトに届いたのが１１日の昼でした。
これを沖縄のアジトにすると思うと、やっぱ内地はいいですね。
SORACOM LTE-M Button for AWSとは、違って、SORACOM　CONSOLEでの扱いは、SIMになるので、そこだけ注意ですね。
また、もう届いたのに、SIM管理に出てこないなあとなるので、まずは、受け取り確認をしましょう！
注文履歴から、『受け取り確認』ボタンを押下すればOKです。

![190412-0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33220/e73af4f9-f6cd-a401-1afb-44707c50b229.png)

SIM管理で追加されていることが確認ができればOKです。

まだ、ボタンを押していないので、状態が『準備完了』になっていますね。

![190412-0002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33220/bedcb926-1c16-7520-ffc2-90a517818e34.png)

とりあえず、何も考えず、電池を入れていきなりボタンを押してみると、最後赤ランプ点灯して、エラーになりますが、状態が使用中に変化して、有効になったことが確認できました。

![190412-0003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33220/4a2ba4b8-0823-0a64-0bac-5946e0caf3a1.png)

### SIMグループの設定
SIMをあのボタン用のグループに所属させましょう！（自分の場合は、Buttonです)

SORACOM LTE-M Button for EnterpriseはUDPでバイナリで情報を送信する仕様のようなので、SORACOM Air for Cellularの設定で

バイナリパーサーの設定が必要になります。内容は。『@button』で指定します。

![190412-0004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33220/e55c7991-2ca1-dba2-d3d8-d8246fdcc71a.png)

### SORACOM Harvest設定（必須ではない）

とりあえず、ボタンの動作を確認するために使う感じですね。これはただ単にONにすればOK

![190412-0005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33220/91ba07a5-ee79-20e5-a8b2-7d40198d77b4.png)

ボタンの押し方を変えて取得したデータの状況！

![190412-0006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33220/cdd51695-dc01-0807-3306-46ef67a645a0.png)

こんな感じで取れます。課金もされるので、Harvestの設定はOFFにしておきましょう。

### SORACOM Beam設定（UDP→HTTP/HTTPS）

SORACOM LTE-M Button for Enterpriseを使うのは、AWSを経由しないで、SORACOMから、インターネット上の任意のサーバに通知したいということなので、SORACOM Beamを使って、行います。Buttonデバイスは、UDPで通信するようなので、UDP→HTTP/HTTPSを使います。

ただ単に、インターネット上のサーバに通知したいだけなら、ヘッダ操作の部分は設定しなくてもOKです。

![190414-0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33220/5eaaae8d-8836-0ef2-eb9d-6e6557dc6436.png)

### 署名ヘッダを使う理由

SORACOM beamの設定で、単に、あるURLを呼び出すのであれば、それでもいいのかも知れませんが、自分の場合は、Twilioを使って、電話をかけるという処理を行います。電話かけるということはそれなりの費用がかかるし、インターネット上から嫌がらせされても嫌なので、SORACOM経由でアクセス来たことを確認するために署名ヘッダを付与する設定にしています。

署名ヘッダをどうやって解析して認証するのか？をPHPのコードで書いてみました。
debug.txtにログ出力していますが、不要の場合は削除しましょう。

```php:debug.php
<?php
$imsi = $_SERVER['HTTP_X_SORACOM_IMSI'];
$timestamp = $_SERVER['HTTP_X_SORACOM_TIMESTAMP'];
$sig = $_SERVER['HTTP_X_SORACOM_SIGNATURE'];

file_put_contents("debug.txt","IMESI=" . $imsi);
file_put_contents("debug.txt",",TIMESTAMP=" . $timestamp, FILE_APPEND);
file_put_contents("debug.txt",",SIG=" . $sig, FILE_APPEND);

$secret = "secret"; // これが、事前共有鍵なので、SORACOM CONCOLEの内容と合わせてね。
$original_string = $secret . "x-soracom-imsi=" . $imsi . "x-soracom-timestamp=" . $timestamp;
$hased_string = hash('sha256', $original_string);

$local_timestamp = (time() * 1000);
$a = abs($local_timestamp - $timestamp);

file_put_contents("debug.txt",",a=" . $a , FILE_APPEND);

// タイムスタンプが2秒以内であるかチェック
if(($a < 2000) && ($a >= 0))
{
    if(strcmp($sig, $hased_string) == 0)
    {
        file_put_contents("debug.txt",",OK", FILE_APPEND);
        // 例えば、Twilio経由で電話をかける処理を書きましょう
    }
    else{
        file_put_contents("debug.txt",",NG", FILE_APPEND);
        print("NG");
    }
} else {
    file_put_contents("debug.txt",",TNG", FILE_APPEND);
    print("TNG");
}
?>
```

NGは、署名が一致しなかった場合で、TNGは、タイムスタンプが古い場合に出力されます。