本帖最后由 Kingdom 于 2022-3-3 18:47 编辑
本文主要是以自己的经验角度出发,为想要使用MQTT平台的各位提供些许参考与帮助,正所谓前人种树后人乘凉,感谢各路贴吧的朋友的支持,才有了本人这一帖子,此帖也算是自己在当前阶段的一个纪念吧!当然,讲解可能会有疏漏,并不能保证100%成功。好了,让我们进入主题。
1 硬件以及工具准备部分
图片1
首先准备工作当然是不可或缺的,从上图可知,想让自己的设备冲上云端的话,那么连接上云端MQTT就是我们上云的第一步,至于后面要怎么开发那么就各凭本事了。
[1] 硬件准备 最基础的配备:ESP8266模块,USB转TTL(有条件的话也可加一个固件下载烧录器,可以省事一点)
[2] 软件准备 串口调试助手、ESPFlashDownloadTool;
[3] 烧写固件 (如果购买的WIFI模块自带可支持MQTT的固件跳过这步即可) 注意:一般我们购买的ESP8266模块都是不具备上云的功能的,所以需要自己帮它换血,为其烧写新的固件。型号老一点的ESP8266比如:ESP8266-01S其flash为8Mbit;新一点的话可能flash就是32Mbit的。记得去官网下载适合自己的固件! 下面为本人的示例: ①使用模块型号为ESP8266-01S,适合的固件类型:
图片2
(使用固件烧写工具ESPFlashDownloadTool时一定要确保各项参数配置是符合自己的模块的,否则大概率会失败)
②使用的固件版本
图片3
③固件烧写工具界面
图片4
(顺便给各位一些自己的烧写经验吧,算是我经过一番踩坑后总结而来:我是直接使用USB转TTL进行固件烧录的,模块的IO0口在烧录时自己想办法将其接到一个GND电平上;固件信息以及串口端口都选对的话点击START烧写一般都会成功的。烧完记得把USB给拔了,模块IO0口接在GND的线也拨了,最后在重新将转串口接回电脑,打开串口助手对ESP8266进行AT指令测试,以此来检验自己是否烧写固件成功;)
2 串口调试助手下的AT指令使用部分 如果你已经配置好了阿里云的物联网平台,且已经创建好了自己的产品和设备,那么你一定可以得到下面几个参数: 三元组参数: { "ProductKey": "gte1bABzxJJ", "DeviceName": "Mqtt1", "DeviceSecret": "5bed6804e7c96bce0b68fc22e63add11" }
将三元数据数据导入到Aliyun配置工具,Clientld那一栏自己随便输入个(我的是:HKW)然后点击生成后得到以下参数:
图片5
连接域名、Clientld、Username、Password这四个参数是后面需要用到的,请好好记住!
以下就是通过串口调试助手向ESP8266发送AT指令连接阿里云的部分,那些标红的位置记得一定要根据自己的实际情况替换掉哈!
AT指令顺序如下:
AT+RST
AT+CWMODE=1 //设置客户端模式
AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com" // 设置时域和 SNTP 服务器
AT+CWJAP="WiFi名","WiFi密码" //连接wifi //使用之前保存的Username和Password,配置MQTT用户属性 AT+MQTTUSERCFG=0,1,"NULL","用户名","密码",0,0,""
//使用保存的clientId参数 //clientId参数中注意每个逗号前面加分隔符“\”!!!! AT+MQTTCLIENTID=0,"ClienId"
//连接我们的设备,注意将域名后的:1883端口号去掉,因为被提到后面了 AT+MQTTCONN=0,"连接域名",1883,1
//订阅指令 AT+MQTTSUB=0,"topic",1 //我的指令 AT+MQTTSUB=0,"/sys/${ProductKey}/${deviceName}/thing/service/property/set",1
//发布指令 AT+MQTTPUB=0,"topic","AJson格式内容",1,0 //我的指令 AT+MQTTPUB=0,"/sys/${ProductKey}/${deviceName}/thing/event/property/post","{\"method\":\"thing.service.property.set\"\,\"id\":\"2012934117\"\,\"params\":{\"temp\":50.5}\,\"version\":\"1.0.0\"}",1,0
Alink请求数据格式:
{ "id": "123", "version": "1.0", "params": { "temperature": "30.5" }, "method": "thing.service.property.set" }
(因为是以字符串的形式发送Json格式的数据,所以“,”和“””都需要用转义符号转换--->\<-----)
在线调试:
i.从调试功能下拉选项中,选择模块中要调试的服务。 服务调用 i.在输入框中,输入调用服务的入参,单击发送指令。 输入的服务入参数据,需为标准的JSON格式,如 {"Switch"∶0}。
图片6
(注意:其中Switch是每个功能特有的标识符,其中还对应着不同的数据类型,需要根据自已的服务功能进行更改!)
3 将已连接MQTT的设备的数据存入数据库 本人采用了使用物联网平台下的自定义topic将自己的数据利用规则引擎转到了RDS MySQL进行存储(开通需花费19.9元,有效期一年,呜呜呜……;有兴趣的朋友可以尝试一下,毕竟用来学习体验一下也不亏吧,嘿嘿!)。
图片7
那么话不多说,至于数据库的创建与表的建立我就不在此多说了,各位自行完成即可,让我们进入云产品流转,创建自己的数据源,数据目的和解析器吧,下面是我的示例:
1. 数据源
图片8
2. 数据目的
图片9
3. 解析器脚本(SQL语法) //通过payload函数,获取设备上报的消息内容,并按照JSON格式转换。 var data = payload("json");
//筛选出上报的温湿度值。 var t = data.temp; var h = data.humi; var l = data.led;
// RDS表结构为id[自增主键、deviceName、temperature、humidity、time,在writeRds方法中,可以按column:value的形式,将值写入对应的列。 writeRds(1000, {"temp":t, "humi":h, "led":l});
对应的JSON数据格式(到时我们硬件设备就采用这种形式上传云端即可): { "temp":13.5, "humi":75.6, "led":"OFF" }
(!!!上面这个脚本仅适用于我给出的示例的格式,如果需要定义别的形式也可以自己研究一下其平台的数据流转支持的函数,编写出自己风格的脚本函数,应该也不算太难。)
最后开启解析器即可。以上操作就算是完成规则引擎的设置了(注意:云数据库RDS下的创建数据库等我是没讲的,但我相信凭各位的聪明才智应该是能搞定的);那么接下来我们登录数据库,创建自己的表,用来存储数据;
表的列信息如下:
图片10
准备好后,保存执行即可。 (注意:列名应当与自己上传的JSON数据格式中标识符[temp、led、humi等一致)
下面就到了最后的测试环节了,确保设备已接上阿里云,规则引擎、数据库等都是开启状态,直接通过串口发送以下AT指令进行测试: AT+MQTTPUB=0,"/gte1bABzxJJ/Mqtt1/user/DATA","{\"temp\":\"10.5\"\,\"humi\":\"76.5\"\,\"led\":\"OFF\"}",1,0
顺利的话刷新一下表将会出现数据如下:
图片11
4 底层硬件程序部分 如果你是实实在在且顺利地完成了以上的三个部分,那么恭喜你已经算是MQTT初入门了。说实话,自己经过一番功夫后终于调试通了阿里云平台,但是发现调试终究只是调试,仅仅只能在自己使用串口调试助手发送AT指令才能把信息发上云端;如果想要跟上一层楼,为自己的硬件编写程序让其自己连上阿里云是必不可少的。
好了,下面由我简略介绍一下自己编写的程序:
本程序是基于STM32-F103-RCT6(正点原子开发板)进行编写的,仅供参考,WIFI的初始化信息请自行根据实际更改(毕竟各位也是经过上面三部考验的人了,嘿嘿……),涉及到的外设由以下初始化函数可知:
uart_init(115200); //串口1初始化波特率为115200
U3_Init(115200); //串口3初始化波特率为115200
LED_Init(); //初始化与LED连接的硬件接口
Adc_Init(); //ADC初始化
KEY_Init(); //KEY初始化
wifi_MQTT_init(); //wifi初始化
用来驱动ESP8266模块的是串口3,硬件连接如下: (RCT6) (ESP8266) PB10 < --------- > RX PB11 < --------- > TX VCC、GND自行接好;
图片12
上面这个函数就是将我们自己的数据上传到云端的部分了,其中temp,humi当然就是自己的ADC数据啦!
最后是测试方法:
通过按下不同的按键板子会做出不同的响应:
①KEY1:
翻转LED0的状态;
②KEY0: 翻转LED1的状态,同时发送数据到云端;
那么至此,底层硬件数据上传到云端在本文也算是告一段落了。人生苦短,时间真是过得太快了,不出意外这也应该是我在本科时期写的最后一篇与技术相关的文章了,希望日后有机会能与诸位江湖相遇吧……由于本人水平有限,所以难免会有疏漏之处,欢迎大家一起交流讨论。最后,感谢各位阅读本文! |