Ameba Arduino: [RTL8722CSM/RTL8722DM] 使用Amazon AWS IoT Shadow服务

材料准备
  • Ameba x 1
范例说明
IntroductionAmazon AWS IoT是一个云端IoT服务平台: AWS IoT是一个平台使您可以将设备连接到AWS Services和其他设备,保护数据,处理设备数据并对其进行操作,并使应用程序即使在离线状态下也可以与设备进行互动。 AWS IoT的服务架构: 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/ A然后,登录到Amazon 管理控制台,然后单击“ IoT Core”。 1 然后,您将进入AWS IoT的主页。为了提供最佳服务,Amazon在不同地区提供服务器供用户选择。 点击右上角的区域下拉菜单: 1 选择附近的区域。 1 然后点击“Get started” 1 进入AWS IoT的主页 1 1 左侧的“Manage”下有一个“Things”。选择它,然后单击“Register a thing”。 1 进入下一页,然后单击“Create a single thing” 1 我们在名称栏位中填写“ameba”。属性代表ameba的状态。属性的值可以直接由ameba或由控制端更新,并且控制端可以请求ameba将属性设置为所需值。 在这里,我们添加一个名为“led”的属性,其值为 0”,然后单击“Next”。 1 点击“Create thing witohut certificate”并进入下一页 1 然后我们可以看到成功创建了一个名为ambea的项目。 1 点击安全中的“Policies”,然后选择“Create a policy” 策略用于限制“thing”可以执行的功能,它可以限制MQTT操作或可以执行的特定主题。详细了解政策: http://docs.aws.amazon.com/iot/latest/developerguide /authorization.html 1 在这里,我们不对ameba设置政策。在名称栏位中填写“amebaPolicy”,在操作栏位中填写“iot:*”,在资源栏位中填写“*”。然后检查“Allow”。最后单击“Create”。 1 完成策略设置: 1 接下来,我们必须设置TLS凭证。点击“Create a certificate”。单击左侧的“Secure->certificates”,然后单击右侧的“Create a certificate”。 1 您可以选择使用用户定义的凭证或通过AWS IoT生成凭证。在此范例中,我们单击“1-Click certificate create”以生成TLS凭证。 1 然后,您可以看到4个链接。请单击4个链接中的每个链接,以下载“public key”,“private key”,“certificate”和“ rootCA”。 下载完4个文件后,单击“Done”,然后返回到凭证主页。 1 在“Actions”下拉菜单中单击“Attach a policy”。 1 1 选择“ AmebaPolicy”,然后点击“Attach” 然后返回到凭证首页右上方的“Actions”下拉菜单,单击“Attach thing”,选择出现在下面的窗口时刚创建的内容“ameba”,然后单击“Attach” 1 1 然后启动凭证。返回凭证主页并单击凭证,然后在“Actions”下拉菜单中单击“Activate”。 1 返回到左侧的文件,选择“Manage”->“Things”,然后单击我们创建的ameba项目。 1 进入ameba页面,在左侧选择“Interact”。查找用于设置Amazon Alexa的Rest API端点的信息: — REST API endpoint: “https://a1a7oo4baosgyy.iot.us-east-1.amazonaws.com/things/ameba/shadow”, “a1a7oo4baosgyy.iot.us-east-1.amazonaws.com” 为MQTT Broker服务器的地址。 — MQTT topic:”$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网路设置。 1 填入”thing”名称为”ameba” 1 以及我们先前在AWS IoT中找到的MQTT Broker服务器地址。 1 接下来,填写TLS中使用的root CA。下载并确保root CA内容正确。 1 接着填写我们在AWS IoT控制台中创建的凭证(即客户端凭证),通常其文件名会以“ -certificate.pem.crt”(例如“ efae24a533-certificate.pem.crt”)结尾。使用文字编辑器打开凭证,并如下调整其格式: – 在每行末尾添加新的行字元“\n”。 – 在每行的开头和结尾处添加双引号。 – 要将每行连接为字串,请在每行末尾添加“\”。 – 最后一行以分号结尾。 以相同的方式调整私钥的格式,并将其添加到privateKeyBuff。 1 编译并执行 上传程式码并在上传完成后按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”消息: Listen to topic and make response: In the callback function, we listen to the 5 subscribed topics and check if there are messages of “/shadow/get/accepted”:
if (strstr(topic, "/shadow/get/accepted") != NULL) {
如果存在,则消息来自控制端。如果消息中的属性状态不同于当前状态,请发布新状态。
updateLedState(desired_led_state);
请先确认已安装QQ通讯软体