MQTT - 使用Amazon AWS IoT Shadow服务

材料准备

范例说明

介绍

Amazon AWS IoT 提供可用于实施 IoT 解决方案的云服务和设备支持。 AWS 提供许多云服务来支持基于物联网的应用程序。
AWS IoT Core 提供将您的 IoT 设备连接到 AWS 云的服务,以便其他云服务和应用程序可以与您的联网设备进行交互。

1

(图片来自http ://docs.aws.amazon.com/iot/latest/developerguide/aws-iot-how-it-works.html )

在该结构中,Ameba属于左上角的“Things”。将在“Things”和MQTT Message Broker之间建立一个TLS安全通道。接着,“Things”和“Message Broker”通过此安全通道使用MQTT协议进行通信。在“Message Broker”后面,“Thing Shadows”在Ameba离线时暂时保留消息,并在下次连接时将控制消息发送给Ameba。通过“Rules Engine”,您可以限制事物的行为或将事物连接到Amazon的其他服务。

AWS管理控制台

首先,创建一个帐户并注册AWS IoT服务:https://aws.amazon. com/iot-core/
然后,登录到Amazon 管理控制台,然后单击services -> Internet of Things下的 “IoT Core”。

选择附近的区域。这是一份教学在线文档,可供详细参考。请注意,需要完成以下步骤。
• 创建thing。使用“ameba”作为thing名称。添加“attribute”,使用“led”作为名称,“0”作为值。
• 创建policy。使用“amebaPolicy”作为名称,“iot:*”作为操作,“*”作为资源 ARN。
• 创建TLS凭证。记录“public keys”、“private key”、“certificate”和“root CA”。
• 启用后,附加Policy和Thing。

查找用于设置 Amazon Alexa 的 Rest API Endpoint 资讯:
• REST API endpoint:
o 例如 “https://a1a7oo4baosgyy.iot.us-east-1.amazonaws.com/things/ameba/shadow”,“a1a7oo4baosgyy.iot.us-east-1.amazonaws.com” 为 MQTT Broker 服务器的地址。
• MQTT topic:
o 例如 “$aws/things/ameba/shadow/update” 表示我们将在AWS IoT Shadow服务中使用的MQTT主题(如果仅使用MQTT,而没有AWS IoT Shadow服务,则可以指定其他主题名称)。建议使用”$aws/things/ameba/shadow/update”。

Ameba 设定

打开 “File” -> “Examples” -> “AmebaMQTTClient” -> “Amazon_AWS_IoT_Basic”

在范例代码中,
• 设置WiFi 网络SSID 和密码。
• “Thing_Name”设置为“ameba”。
• “mqttServer”设置为之前在AWS IoT 中找到的MQTT 代理服务器地址。
• “rootCABuff”设置为记录的“root CA”。
• “certificate”。填写纪录的凭证(即客户端凭证),通常其文件名以“-certificate.pem.crt”结尾(例如“efae24a533-certificate.pem.crt”)。使用文字编辑器打开凭证,并如下调整其格式:
– 在每行末尾添加新的行字元“\n”。
– 在每行的开头和结尾处添加双引号。
– 要将每行连接为字串,请在每行末尾添加“\”。
– 最后一行以分号结尾。
• “privateKeyBuff”。以相同的方式调整private key的格式。

编译并执行

上传程式码并在上传完成后按Ameba上的重置按钮。
在Arduino IDE中打开串行端口,观察Ameba连接到AWS IoT服务器的情况。
1

备择方案

Ameba还可以从AWS shadow中检索当前的LED状态。通过向“shadow/get”主题发送消息来完成此操作。有关更多信息,请参阅Amazon_AWS_IoT_with_ACK范例代码。

程式码说明

更改led状态:
在这个例子中,我们使用GPIO接口来控制led。在范例代码中,我们默认将led_pin设置为10,将led_state设置为1。

pinMode(led_pin, OUTPUT);
digitalWrite(led_pin, led_state);

设置凭证:
注意我们是使用wifiClient的WiFiSSLClient类型。

WiFiSSLClient wifiClient;

WiFiSSLClient继承Client,因此可以将其作为PubSubClient构造函数的参数进行传递。
接下来,设置连接所需的TLS凭证。

wifiClient.setRootCA((unsigned char*)rootCABuff);
wifiClient.setClientCertificate((unsigned char*)certificateBuff, (unsigned char*)privateKeyBuff);

配置MQTT Broker服务器
然后,MQTT PubClient将MQTT Broker服务器设置成连接

client.setServer(mqttServer, 8883);
client.setCallback(callback);

连接到MQTT Broker服务器:
在loop()中,调用reconnect()函数并尝试连接到MQTT Broker服务器并进行凭证验证。

while (!client.connected()) {

订阅并发布
接下来,订阅主题。

for (int i=0; i<5; i++) {
client.subscribe(subscribeTopic[i]);
}

有一些共同的主题:
“$aws/things/ameba/shadow/update/accepted”,
“$aws/things/ameba/shadow/update/rejected”,
“$aws/things/ameba/shadow/update/delta”,
“$aws/things/ameba/shadow/get/accepted”,
“$aws/things/ameba/shadow/get/rejected”
相关文件:
http://docs. aws.amazon.com/iot/latest/developerguide/thing-shadow-data-flow.html
然后发布当前状态:

sprintf(publishPayload, "{\"state\":{\"reported\":{\"led\":%d}},\"clientToken\":\"%s\"}", led_state , clientId);
client.publish(publishTopic, publishPayload);

检查主题并做出回应:
在回调函数中,我们检查5个订阅的主题,并检查是否有“/shadow/get/accepted”消息:

if (strstr(topic, "/shadow/get/accepted") != NULL) {

如果存在,则消息来自控制端。如果消息中的属性状态不同于当前状态,请发布新状态。

updateLedState(desired_led_state);
请先确认已安装QQ通讯软体