本文主要是介绍阿里MQTT物联网平台“云产品流转”实战——两片ESP32通过物联网平台实现远程互操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
关键词:阿里,物联网,MQTT,ESP32,ARDUINO,云产品流转。
摘要:本文介绍了阿里MQTT物联网平台关于“规则引擎”中“云产品流转”设置方法,以及利用“云产品流转”消息转发机制,选用两片ESP32,使用ARDUINO软件编程实现MQTT设备远程互连互通。项目包含硬件说明、平台设置、ARDUINO代码及演示资料。
资源下载地址:阿里MQTT物联网平台“云产品流转”实战(设备间远程互操作)-C++文档类资源-CSDN下载
目录
一、硬件说明:
二、平台设置。
(一)、创建产品和设备。
1、创建产品。
2、创建自定义Topic。
3、创建设备
4、获取设备密钥(设备三元组信息)
(二)、“规则引擎”——“云产品流转”设置。
1、创建规则。
2、“处理数据”设置。
3、“转发数据”设置。
4、启用规则。
三、ARDUINO代码编写烧录。
1、软件环境搭建。
2、程序代码。
之前写过两篇关于阿里MQTT物联网平台的相关文章,其中有连接阿里MQTT物联网的相关资源,但仅仅是设备与云的连接。可以在平台上进行调试,但还远远没有达到MQTT实用化目的。要想让MQTT真正地实用化,必须进行“设备——云——设备”互连互通。这种互连互通可以是物联网设备与电脑(包括云平台服务)之间的互连互通,也可以是物联网设备与手机之间的互连互通,还可以是两个物联网设备之间的互连互通。而电脑和手机编程涉及到复杂的系统性编程知识,不在本文讨论范围,本文主要使用ARDUINO编程,实现两个物联网设备(两片ESP32)间的互连互通。利用ESP32板载LED和按键,实现远程互操作。即利用A板按键控制B板LED,使用B板按键控制A板LED,并可以互传消息。实现了设备间的数据传输、消息收发、协调控制。是学习阿里MQTT物联网运用的很好的案例。
一、硬件说明:
某宝购买两片ESP32最小系统板,板载一个LED,一个烧录键,一个复位键,USB电源接口。外加2根USB数据线,将模块用数据线连接到电脑上,既可以方便地烧录程序,又不必另外提供电源,就可以实现本项目的实验了。
二、平台设置。
平台地址:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
扫码登陆后,注意上边的站点默认显示为“华东2(上海)”,其站点域名为“cn-shanghai”,如果你选择其他站点,MQTT连接的时候,需要修改站点域名,与其一致。
(一)、创建产品和设备。
1、创建产品。
现在点“公共实例”,如果还没有免费开通,请先开通。
左边导般栏点“设备管理”下的“产品”,然后点“创建产品”进入创建产品设置界面:
这里设置“产品名称”:ESP32_1;“所属品类”:自定义品类;“节点类型”:直连设备;其余默认值,点“确认”创建产品成功。
2、创建自定义Topic。
左边导般栏点“设备管理”下的“产品”,就会在产品列表里看到我们刚创建的产品“ESP32_1”。 点其后的“查看”,进入“产品详情”设置页面。依次点“Topic 类列表”、“自定义Topic”,然后点“定义Topic类”,进行自定义Topic设置。
“设备操作权限”选“发布”;“Topic 类”填“post”;“描述”填“数据上行”,点“确认”完成。
照此方法再建一个自定义Topic。“设备操作权限”选“订阅”;“Topic 类”填“set”;“描述”填“数据下行”。
最后点右上角的“发布”,接下来的界面中三步确认全部打勾,点“发布”完成。(右上角的“发布”变成了“撤消发布”,如果以后要修改产品,需要点右上角的“撤消发布”)
3、创建设备
左边导航栏点“设备管理”下的“设备”,然后点“添加设备”进入添加设备界面。
“产品”列表中选我们刚刚创建的产品“ESP32_1”;“DeviceName”下输入“ESP32_1_0”;“备注名称”里填“第一个设备”,点“确认”,接下来再点“完成”。
至此,我们创建了产品“ESP32_1”,并创建了其设备实例 “ESP32_1_0”。照此方法再建一个产品“ESP32_2”,并创建其设备实例 “ESP32_2_0”。注意两种产品都建立了相同的自定义Topic。(将来设置“云产品流转”需要用到)
4、获取设备密钥(设备三元组信息)
导航栏点“设备管理”下面的“设备”,点设备列表右边的“查看”
上边文字“DeviceSecret”后边显示为几个星号,点其右边的“查看”,如下图,你就得到设备证书信息(三元组)。将其保存好,MQTT连接必须使用这些信息。
这里总结一下,本步骤中需要用到的信息包括五个:
(1)、站点域名:“cn-shanghai”。
(2)、自定义Topic。(包括发布Topic: /user/post。订阅Topic:/user/set。)
(3)、设备三元组信息(你创建的设备信息与之类似,但不会完全相同。):
productKey:a1Ptlr1aTzy
deviceName:ESP32_1_0
deviceSecret:193260d46730301dea3874a920fc4c2e
(二)、“规则引擎”——“云产品流转”设置。
为了使两片ESP32模块两两互通,还必须进行消息发布和订阅的流转设置。这里特别强调:阿里MQTT设备实例只能订阅自身的Topic,不能订阅其他设备的Topic,要想收到其他设备发布的消息,必须进行“云产品流转”设置。其实就是消息转发,也就是通过平台将一台设备发布的消息转发到另一设备订阅的Topic上。两台设备消息互通,就必须做双向的发布和订阅的转发规则。
1、创建规则。
左边导航栏点“规则引擎”下的“云产品流转”,如下图:
点“创建规则”,如下图: 填入规则名称:1TO2,数据格式:JSON,规则描述:设备一发消息给设备二。点“确认”,创建规则成功。
2、“处理数据”设置。
进入规则设置界面,点“处理数据”栏后面的“编写SQL”,如下图:
“字段”里输入一个“*”号,表示所有字段;“Topic”选择“自定义”;接下来选产品“ESP32_1”,T选择设备“ESP32_1_0”,Topic余下部分选user/post。点“确认”,生成“规则查询语句”:SELECT * FROM "/a1Ptlr1aTzy/ESP32_1_0/user/post。
3、“转发数据”设置。
然后,点“转发数据”栏后面的“添加操作”,如下图:
“选择操作”选“发布到另一个Topic”,“Topic”下选“自定义”,选择产品:“ESP32_2”,选择设备:“ESP32_2_0”,Topic余下部分选user/set。点“确认”完成规则创建。
4、启用规则。
左侧导航栏点“规则引擎”下的“云产品流转”,你就会看到刚建立的规则:1TO2,其后有个“启动”,点击并“确认”,此条规则生效,就完成了将设备1发布消息转给设备2的设置工作了。
照此方法再建一条规则:2TO1,进行反向消息转发,两设备就可以互连互通了。
至此,平台设置大功告成,就等我们烧写程序,连上平台,进行两设备的远程互操作了。
三、ARDUINO代码编写烧录。
1、软件环境搭建。
请自行百度完成。这里提供一些关键软件资源,可以参考:
(1)ESP32开发环境资源(解决开发板不能下载的问题):ARDUINO编译ESP32开发环境文件。_esp32文件-C++文档类资源-CSDN下载
(2)阿里MQTT连接库及示例代码:ESP32连接阿里云MQTT物联网平台的Arduino支持库及示例代码。_esp32连接阿里云,esp32mqtt阿里云-C++文档类资源-CSDN下载
我之前写的相关文章:《ESP32连接阿里云MQTT物联网平台》ESP32连接阿里云MQTT物联网平台_悟渔的博客-CSDN博客_esp32连接阿里云
2、程序代码。
虽然本项目只是实现简单的按键传送和LED控制,但实现代码仍然比较长,其中连接阿里MQTT平台的代码封装为一个库:ALIMQTT.C,按键状态机封装为一个库:KEYS.C,ESP32板载资源封装为一个库:ESP32OBJ.C,所有代码为本人参考各种资源,耗费大量时间写成,全部加了中注文释,包括下面要讲到的主程序文件,一并打包。需要的可以下载:
阿里MQTT物联网平台“云产品流转”实战(设备间远程互操作)-C++文档类资源-CSDN下载
主程序说明:
引用相关库,建立需要的操作对象:
#include"ALIMQTT.C"
#include"KEYS.C"
#include"ESP32OBJ.C"
ALIMQTT mqtt;
ESP32_KEYS keys;
ESP32OBJ esp32;
mqtt对象负责物联网平台连接和消息收发;keys对象负责处理按键;esp32对象负责WIFI连接,LED控制等。
void setup() {Serial.begin(115200);esp32.begin("ShuFang","12345678");//请修改WIFI信息与您正在使用的WIFI信息一致.mqtt.begin("a1Ptlr1aTzy","ESP32_1_0","193260d46730301dea3874a920fc4c2e","cn-shanghai");//mqtt.begin("a1hFJKTMj3p","ESP32_2_0","4adbd6fe103f6fb92b04e6499cb1b9dd","cn-shanghai");//以下回调可以自己定义.与MQTT消息体中的JSON键值对KEY对应.mqtt.addItemCallback("COMMAND",mqttCommand);//mqtt属性回调函数.(接收对方指令)mqtt.addItemCallback("MESSAGE",mqttMessage);//mqtt属性回调函数.(接收对方消息)mqtt.addItemCallback("KEYS",mqttKeys);//mqtt属性回调函数.(接收键值)keys.begin(0,false);
}
启动过程setup()首先设置串口波特率,注意调试时设置相关软件的波特率,使其一致。然后连接WIFI,注意修改相关信息与你所在环境WIFI一致(如果你不提供WIFI信息,程序将自动转入微信配网模式,你可以使用安信可微信公众号进行配网,从而正确连接WIFI)。然后是MQTT对象信息设置,请使用前面创建的设备相关信息。烧录前确认,两片ESP32要使用不同的信息烧录,如果两片ESP32烧录完全一样,平台会把它们当着一台设备,后者上线将迫使前者下线,就达不到两设备同时在线,互连互通了,切记!紧接着注册回调函数,这里使用了mqtt对象的属性回调注册,可以添加多个回调函数(最多可以达20个,可以进ALIMQTT.C里修改)。注意这里没有订阅Topic代码,因为在ALIMQTT.C文件的连接成功代码里加了自动订阅,你可以进入该文件修改相关代码,使订阅的Topic与你平台添加的自定义Topic保持一致。过程中WIFI连接和MQTT连接会在串口输出相应信息,可以使用串口调试程序观察,便于掌握程序执行情况。保证设备连上WIFI,连上平台。最后初始化按键状态机(本项目使用定时器0设置按键状态机,可以实现按键的单击、双击、三连击、长按等功能)。
void loop() {int keyNum;mqtt.loop();keyNum=keys.getKey();if(keyNum){mqtt.add("KEYS",keyNum);//加入消息队列.mqtt.add("MESSAGE","呵呵!板载按钮键值传给你,怎么处理看着办!");//加入消息队列.if(keyNum==255){mqtt.add("COMMAND","RESET");}//长按发送复位指令.其实mqtt.add("KEYS",keyNum);已经传过去信息,对方可以判断键值255复位,这里只是演示可以用不同的方式传输信息.mqtt.send();//立即发送}}
loop()过程里必须加入mqtt.loop();以使MQTT连接保持心跳,如果不加这句,就接收不到消息。keys.getKey();获取按键信息,如果有按键信息,则发送给对方,本项目演示了发送int型数据,发送字符串数据,发送控制指令。mqtt.add()将要发送的消息内容添加到MQTT发送缓冲区,该方法有两个参数,第一个参数表示设备属性,在消息体中表示JSON键值对的键名KEY,第二个参数为发送的数据,在消息体中表示JSON键值。mqtt.send()将发送缓冲区中的内容发布出去。
阿里MQTT物联网平台接收到设备发来的消息,会根据“云产品流转”设置将消息转发出去,订阅该消息的设备就会收到消息。
消息接收成功,就会根据mqtt.addItemCallback()方法注册的回调函数,查询消息体中是否有相应的JSON键,如果有,则会产生回调事件,并将相应键值传给回调函数处理。
本案例注册了三个回调函数:
void mqttCommand(JsonVariant params){//注意参数params是以指针方式进行传递的,不要对参数params指向的内容进行改变(清除),否则会影响其他属性调用(一条消息传递多个属性会调用多个属性回调函数).String command="";serializeJson(params["COMMAND"], command);command=command.substring(1,command.length()-1);//去掉字符串首尾的引号.command.toLowerCase();if(command=="reset"||command=="restart"){ESP.restart();}//板块复位.
}
void mqttMessage(JsonVariant params){//注意参数params是以指针方式进行传递的,不要对参数params指向的内容进行改变(清除),否则会影响其他属性调用(一条消息传递多个属性会调用多个属性回调函数).String message="";serializeJson(params["MESSAGE"], message);message=message.substring(1,message.length()-1);//去掉字符串首尾的引号.Serial.println(message);//显示接收到的消息.
}
void mqttKeys(JsonVariant params){//注意参数params是以指针方式进行传递的,不要对参数params指向的内容进行改变(清除),否则会影响其他属性调用(一条消息传递多个属性会调用多个属性回调函数).int keyNum=0;if(params.containsKey("KEYS")){//测试JSON是否存在相应键值对.if(params["KEYS"].is<int>()){//测试键值对类型是否相符.keyNum=params["KEYS"].as<int>();//取键值.}}switch(keyNum){case 0://按键未按下.break;case 1://单击.esp32.light();//改变LED显示状态.if(esp32.getLed()==0){mqtt.add("MESSAGE","处理结果:LED 已熄灭!");}else{mqtt.add("MESSAGE","处理结果:LED 已点亮!");}//向对方反馈LED状态.mqtt.send();break;case 2://双击.break;case 3://三连击.break;case 255://长按状态.break;default://其他情况.break;}
}
mqttCommand()回调函数处理对方发来的字符串指令,根据指令进行相应控制(如复位模块等)。
mqttMessage()回调函数处理对方发来的提示信息,将其发送给串行调试软件,以直观检测系统通信处理情况。
mqttKeys()回调函数处理对方发来的按键信息,根据按键信息进行相应处理,就像是远程键盘一样。
将下载的两个目录直接复制到ARDUINO程序文件夹下,打开.ino后缀文件(主程序文件),分别编译烧写(注意setup()过程里的注释行,两块ESP32使用不同的设备信息进行烧录)。成功后,两块ESP32都接上USB电源,会看到LED闪烁后常亮,如果使用串行调试助手,会看到串口信息提示WIFI连接情况、MQTT连接情况、消息接收情况。
两块ESP32模块都连接成功,按一下设备上的按键(烧写键),另一设备上的LED灯灭了,再按一下,另一设备上的LED又亮了,反之亦然。如果长按,你就会看到另一设备复位重启,LED灯闪烁,重新连接WIFI,连接阿里MQTT物联网平台……
总结:本案例成功的关键在阿里MQTT物联网平台的“云产品流转”设置,也就是消息转发设置。目前,平台已经上线新的消息转发处理机制,大家可以使用旧版(就像本文),也可以使用新的消息处理转发机制,平台设备界面里点右上角“体验新版”就可以开启新的旅程了。
这篇关于阿里MQTT物联网平台“云产品流转”实战——两片ESP32通过物联网平台实现远程互操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!