阿里MQTT物联网平台“云产品流转”实战——两片ESP32通过物联网平台实现远程互操作

本文主要是介绍阿里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通过物联网平台实现远程互操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/213126

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time