[AWS×IoT] AWS IoT エンタープライズボタンを使ってラズパイにMQTTでメッセージをPublishする

# はじめに

AWS IoT エンタープライズボタンが一般販売され、個人用に1つポチりました。
どんな使用方法があるかを検討している中で、「とりあえずラズパイにMQTTで何かしらのメッセージをPublishしてみるか」ということで試してみました。

## AWS IoT エンタープライズボタンって？

<img width="300" alt="61iUdCWGplL._SL1000_.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/95875/73f8c81d-15d5-6f7a-7a0f-881fb360641d.jpeg">


要するに「AmazonDashButtonのエンタープライズバージョン」です。
簡単な設定を行うだけで、Lambda関数をコールしたり、SMSを送信したりすることができます。
おそらく、ボタン本体の中に証明書などを持っていて、紐づけたAWSアカウントのAWSIoTにリクエストを送信するような仕組みになっているのかなーと思ってます。

ちなみに今回はLambda関数をコールします。

## やること

至って簡単です。

1. ボタン押す
2. Lambdaがコールされる
3. ラズパイがSubってるトピックにメッセージをPubる
4. 以上！

## ラズパイの設定

この記事を参考にして、MQTTを扱えるようにしてください。
[SORACOMでAWSIoTにメッセージをBeamする](https://qiita.com/is_ryo/items/526ed0c28c22b53b0298)

ラズパイ側はトピック名 `demodemo/#` でSubっておいてください。

## Lambda関数のデプロイ

ランタイムは `Node.js 8.10`
最低限必要な権限は、 AWSIoTのPublish `iot:Publish`
ソースコードはこんな感じです。

```js:index.js
const AWS = require("aws-sdk");
const iotData = new AWS.IotData({
 endpoint: "aclhlxe7k1bjt.iot.ap-northeast-1.amazonaws.com"
});
const TOPIC_NAME = "beamdemo/IoTbutton";

exports.handler = async (event) => {
  console.log(JSON.stringify(event));
  
  try {
    const clickType = event["deviceEvent"]["buttonClicked"]["clickType"]
    const params = {
      topic: TOPIC_NAME,
      payload: JSON.stringify({ "message": `Button Clicked ${clickType}` }),
      qos: 0
    };
    await iotData.publish(params).promise();
    console.log("Success!!");
    return null;
  } catch (err) {
    console.error(err);
    throw err;
  }
};

```

Eventにボタンをクリックした回数などが含まれているので、どのようなボタンのクリック方法をしたのかをメッセージとして、 トピック名　`demodemo/IoTButton` にPublishしています。

```console
// message例
{"message":"Button Clicked SINGLE"}
{"message":"Button Clicked DOUBLE"}
{"message":"Button Clicked LONG"}
```

SINGLE=ボタンを1回押す、DOUBLE=ボタンを2回押す、LONG=ボタンを1.5~6秒未満長押しする、といった感じで取れます。

## AWS IoT エンタープライズボタンの設定

まず「AWS IoT 1-Click」というスマホアプリからWiFiの設定を行ってください。
画面の通りに進めていけばボタンがWiFi経由でインターネットに出ていくことが可能になります。

その後、AWSコンソール画面に戻り、アカウントとボタンの紐づけ、ボタンをクリックされたあとのイベントの設定を行っていきます。

### ボタンを登録する

<img width="1024" alt="AWS IoT 1-Click 2018-06-25 12-57-45.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/16c6c729-bbf7-7297-17cb-a2f7322fabc6.png">

<img width="560" alt="AWS IoT 1-Click 2018-06-25 13-13-52.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/7eebe475-194c-5c82-dd8f-6fa7458a1c7b.png">

<img width="560" alt="AWS IoT 1-Click 2018-06-25 13-16-54.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/a7d45cc2-a807-140d-608c-a0cf15c32dfc.png">

↑この画面になったらボタンを押してください

<img width="560" alt="AWS IoT 1-Click 2018-06-25 13-17-34.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/108c84f8-4981-7701-0aef-cda5f844dc9a.png">

<img width="1024" alt="AWS IoT 1-Click 2018-06-25 13-20-02.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/ee84ea0e-7fe1-94f0-3d16-275ccdeb6120.png">

これでボタンとAWSアカウントが紐付きました。

### ボタンを有効化する

<img width="1024" alt="AWS IoT 1-Click 2018-06-25 13-23-07.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/fb7ff90f-1efd-168a-a31d-99f97a6ebe2f.png">

<img width="1024" alt="AWS IoT 1-Click 2018-06-25 13-24-51.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/b5f6f445-8583-291f-b31a-53edc9279270.png">

ボタンが有効になりました。

### プロジェクト / プレイスメントの作成

<img width="1024" alt="AWS IoT 1-Click 2018-06-25 13-26-57.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/8f178577-5944-0468-191b-7fefc6b15e79.png">

<img width="560" alt="AWS IoT 1-Click 2018-06-25 13-29-03.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/f3d924b2-fb0c-8ca6-b398-f6cfeb216a5c.png">

<img width="560" alt="AWS IoT 1-Click 2018-06-25 13-32-13.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/f5a392d5-e305-14c5-c580-03e424afe8e9.png">

<img width="560" alt="AWS IoT 1-Click 2018-06-25 13-35-08.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/57b4c32e-d9a2-de35-5daf-b7174929e2f1.png">

<img width="560" alt="AWS IoT 1-Click 2018-06-25 13-37-24.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/62b51208-a34d-a4a5-7890-c48845433f41.png">

<img width="560" alt="AWS IoT 1-Click 2018-06-25 13-39-01.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/af377595-3b2f-1e85-0cb0-9a40f1f9f14d.png">

これでボタンをクリックしたときにLambda関数がコールされるようになりました。

## 確認

ラズパイでトピック名 `demodemo/#` をSubります。

```console
$ mosquitto_sub -h beam.soracom.io -t demodemo/#
```

この状態でボタンをクリックします。
無事メッセージが届きました！

![console.png](https://qiita-image-store.s3.amazonaws.com/0/95875/4b83a841-988e-d3a7-1237-11a9e17f3b6d.png)

## さいごに

AWS IoT エンタープライズボタンの登場で、かなり簡単にIoT(っぽいこと)に触れることができるようになりました。
Lambda関数をキックできるので、実質かなり応用が効きますし夢がかなり広がります。
また、Lambda関数以外にもSMSやEmailを送信することができます。

ただボタンに寿命がある(リクエストを送信できるのが約2000回)ので、実際にプロダクションレベルで使用する際には、ボタンの交換などについても考慮しなければいけないです。

簡単に試すことができるので、いろんな利用方法を考えて試していこうと思います。
ではまた！