AWS IoT Coreは使ったことなかった
たぶんクラウドのブローカーサービスでいいんですよね
ちょっとMQTTのおさらい
参考:https://kfep.jp/solution/iot-mqtt/mqtt
実は結構詰まった
参考サイト
-
https://zenn.dev/kou_pg_0131/articles/aws-iot-core-mosquitto
- 「モノ」を作らずにやったほうがまずはいいかも
- セキュリティ的に全部オッケーなものが作れる
- 自動的に作られるよりまずは一個ずつ作ったほうが理解しやすかったので
AWS側の設定
- 証明書作成
- 作ったときしかダウンロードできないので注意
- ポリシー作成
- まずは全部許可しておこうかな
- 証明書にポリシーをアタッチ
一度理解したらモノ作って自動的にしてもらってもいいもの
クライアント側
参考サイトのようにmosquittoだと失敗した
windowsだとコマンドの折り返しは「`」らしい
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で
コード
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...');
できた
AWSのコンソールでテストできるのいいな
UIFlowで
これ以前にAWS用のブロックあったと思ったのになくなってた…
- MQTTブロックの追加
- mqttの初期化ブロック
- keyとcertファイルをブロックのプラスボタンから追加
- AWSの管理画面と見合わせて、記入
- 「MQTT client id」は、特に名前揃えなくても送れた
- 接続ブロックを初期化ブロック後に
- M5のボタン押したらpublishするように
- テスト
できた
M5Capsuleのボタンを押してNode.jsで受け取る
できた