AWS IoT CoreをNode.jsやM5StackのUIFlowで試してみたよ

## AWS IoT Coreは使ったことなかった
たぶんクラウドのブローカーサービスでいいんですよね

### ちょっとMQTTのおさらい
![image02_new.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1326419/651d8bd1-d41e-c41d-38de-7cee7aa857dd.jpeg)

参考：https://kfep.jp/solution/iot-mqtt/mqtt

## 実は結構詰まった

参考サイト

- https://zenn.dev/kou_pg_0131/articles/aws-iot-core-mosquitto
    - 「モノ」を作らずにやったほうがまずはいいかも
    - セキュリティ的に全部オッケーなものが作れる
    - 自動的に作られるよりまずは一個ずつ作ったほうが理解しやすかったので

## AWS側の設定

1. 証明書作成
    1. 作ったときしかダウンロードできないので注意
2. ポリシー作成
    1. まずは全部許可しておこうかな
3. 証明書にポリシーをアタッチ

一度理解したらモノ作って自動的にしてもらってもいいもの

## クライアント側

### 参考サイトのようにmosquittoだと失敗した

windowsだとコマンドの折り返しは「`」らしい

```shell
mosquitto_pub `
    --cafile "AmazonRootCA1.pem" `
    --cert "xxxxxxxxxxxxxxx-certificate.pem.crt" `
    --key "xxxxxxxxxxxxxxx-private.pem.key" `
    --host "xxxxxxxxxxxxxxx.iot.us-east-1.amazonaws.com" `
    --port 8883 `
    --topic "messages/test" `
    --message '{"message":"hello world"}' `
    --debug
```

### Node.jsで

コード
    
```js
const awsIot = require('aws-iot-device-sdk');

const AWSIOT_ENDPOINT = 'xxxxxxxxxxxxx.amazonaws.com';
const AWSIOT_CLIENT_ID = 'xxxxxxxxxxxxx';
const AWSIOT_TOPIC = 'myTest';

const deviceIot = awsIot.device({
    keyPath:
        './keys/xxxxxxxxxxxxx-private.pem.key',
    certPath:
        './keys/xxxxxxxxxxxxx-certificate.pem.crt',
    caPath: './keys/AmazonRootCA1.pem',
    clientId: AWSIOT_CLIENT_ID,
    host: AWSIOT_ENDPOINT,
});

deviceIot.on('error', function (error) {
    console.log('error: ' + error);
});

deviceIot.on('connect', function () {
    console.log('connected');
    deviceIot.subscribe(AWSIOT_TOPIC, undefined, (err, granted) => {
        if (err) {
            console.error(err);
            return;
        }
        console.log('deviceIot subscribe ok');
    });

    deviceIot.publish(AWSIOT_TOPIC, '{ "message": "from nodejs" }', (err) => {
        if (err) {
            console.error(err);
            return;
        }
        console.log('deviceIot publish ok');
    });
});

deviceIot.on('closed', function () {
    console.log('closed');
});

deviceIot.on('message', function (topic, payload) {
    console.log('message (' + topic + ')');
    console.log(payload.toString());
});

console.log('starting...');

```
    

できた

[![Image from Gyazo](https://i.gyazo.com/e92c16a3e0a132905b0bbf82b3761ab7.png)](https://gyazo.com/e92c16a3e0a132905b0bbf82b3761ab7)

AWSのコンソールでテストできるのいいな

### UIFlowで

これ以前にAWS用のブロックあったと思ったのになくなってた…

1. MQTTブロックの追加
[![Image from Gyazo](https://i.gyazo.com/50b41c54c4673c0ca9082a52a4c34c5e.png)](https://gyazo.com/50b41c54c4673c0ca9082a52a4c34c5e)
1. mqttの初期化ブロック
    1. keyとcertファイルをブロックのプラスボタンから追加
    1. AWSの管理画面と見合わせて、記入
        1. 「MQTT client id」は、特に名前揃えなくても送れた
1. 接続ブロックを初期化ブロック後に
1. M5のボタン押したらpublishするように
1. テスト

できた

[![Image from Gyazo](https://i.gyazo.com/3a9ed9634b1fd0cf78abb93934f45c72.png)](https://gyazo.com/3a9ed9634b1fd0cf78abb93934f45c72)

[![Image from Gyazo](https://i.gyazo.com/7bbf1182709e2ebacc57d4b731c7e7a3.png)](https://gyazo.com/7bbf1182709e2ebacc57d4b731c7e7a3)


## M5Capsuleのボタンを押してNode.jsで受け取る

<iframe width=300 height= 600 src="https://www.youtube.com/embed/_d4m46Sa2xE" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

できた