去年做过一点上云的实践,现在把它记录下,协议这块懂得不是很多,也不是学网络的,仅作为一个记录
MQTT协议基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,是构建构建于TCP/IP协议上,最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
框图如下所示:
这里关注一点就是:A订阅了主题1,B订阅了主题1,如果A向主题1发布了信息1,那么A和B都会收到信息1
这个up主讲的非常好,我总结下怎么用,同时规避一些错误(采坑)
https://www.bilibili.com/video/BV1fu411y77M?spm_id_from=333.999.0.0
首先是用到的工具,其实叫esp8266,只不过这个模块是最便宜的,基本上4块钱就能搞定,建议选用01s,好像是引脚多了个上拉,其实也是16年的老版本了
下载固件,这里用的是安信可的固件,其实买来会有个默认固件,我们用的就是那个固件,所以如果是新买的就不用管,当然如果想要学习怎么下载固件也可以试试,固件地址:https://docs.ai-thinker.com/esp8266/sdk
还有一本关于这个模块的说明,讲的也很详细,我放到gitee里面了 https://gitee.com/lx2035/data-manual/tree/master/ESP
文中说明他怎么下载固件
后面我又查官方资料他有三种模式可选,可以根据这个接线来选择下载固件的模式:
模式 | EN | RST | GPIOO | GPIO2 |
---|---|---|---|---|
UART模式 | 高 | 高 | 低 | 低 |
flash运行模式 | 高 | 高 | 高 | 低 |
当然如果比较懒的话,可以直接买下载器,本质也是个usb-ttl工具,就是他把这些引脚都给你接好了
接好线就可以下载了,选择的固件如下
官方那个网页里同样提供了下载工具,这里注意下,建议先点擦除,再点下载,如果下载过程出现了提示复位这样的信息,然后一直等在那里不要慌,这个是很正常的,不要把他从USB口拔掉再插进去,这是没有用的,只要把接RST的这根线拔掉,接上GND,在接回去就可以了,之后就是顺利下载了
之后把其他的都拔掉,就可以使用AT指令了,关于AT指令推荐这篇文章,总结的很到位
https://blog.csdn.net/csdnhuaong/article/details/67011585
这里在总结一点,使用AT指令的时候,需要勾选发送新行,就是多发送 \r\n,然后默认波特率是115200
这里挑几个重要的说,发送AT会有OK回应
发送AT+GMR打印版本信息
AT+UART=115200,8,1,0,0
下面尝试连接MQTT服务器,用的是这个服务器
test.mosquitto.org
电脑打开命令行ping一下,可以看到正常连接
先使用下面的命令配置ESP01S
AT+CWMODE_DEF=3 //设置为STA+AT模式
AT+CWJAP_DEF="ZTE-tbua","88888888" //连接WIFI
AT+SAVETRANSLINK=1,"test.mosquitto.org",1883,"TCP" //进入透传模式,连接MQTT服务器
下面开始连接MQTT服务器,这里现用mqttfx工具给他连上
新建连接如下所示
熟悉这个软件常用功能如下所示
现在我们来编辑报文,分别是连接报文和订阅报文
连接报文如下,用户名和密钥不写就是00 00,这里要特别注意我用的用户名还有主题变化的话其他的两个长度都要做相应的改变,这里我用的是lx
10 | 12 | 00 04 | 4D 51 54 54 | 04 C2 | 00 78 | 00 02 | 6C 78 | 00 00 | 00 00 |
---|---|---|---|---|---|---|---|---|---|
协议 | 后面长度 | 协议长度 | MQTT | 版本 | 120(心跳) | 客户端id(长度) | lx | 用户名id(长度) | 密匙(长度) |
订阅报文
82 | 07 | 00 02 | 00 02 | 6C 78 | 00 |
---|---|---|---|---|---|
报头 | 长度 | 未知 | 主题长度 | lx | 未知 |
这里我把hex贴上
10 12 00 04 4D 51 54 54 04 C2 00 78 00 02 6C 78 00 00 00 00
82 07 00 02 00 02 6C 78 00
C0 00 //根据心跳的保活,就是在心跳时间内发一条命令告诉服务器我还连着
这里根据要求是设置透传模式后需要断开重连,我这里实测好像不需要,反正如果不行可以在设置为透传模式之后断开重连试试。
然后还要注意的一点就是设置为透传模式之后,AT指令就失效了,如果要关闭的话,发送+++这个指令即可,不要点发送新行,等一等就会出现CLOSE这个字符,就是关闭透传,这个时候在发送AT就有效了
发送连接命令,注意是16进制发送,看到返回最后是00
发送订阅,也返回结尾00
为了看的更清楚,我改用了VOFA+这个串口助手来测试,可以看到他返回了名称和主题
之后我们用之前的mqtt.fx订阅主题并发送试试,可以看到顺利接收
软件如下所示
可以当作一个很方便的调试工具使用,就是可以用它来链连接设备,然后接收下发的数据,连接还有订阅什么的,比较方便,是一个很好的测试工具:下载链接
http://www.mqttfx.jensd.de/index.php/download
下面开始尝试连接onenet,onenet好像出了个新版的,目前还没有试过,等以后试了在记录,这里还是用旧版的思路,然后跟我们这个上云相关的都是在控制台里面
进入MQTT物联网套件
添加产品后按照提示创建设备,整个过程比较简单,这里不进行赘述
点击设备可以查看设备
官方文档里面有关于这个设备的详细;连接的详细描述,如下所示,链接如下
https://open.iot.10086.cn/doc/mqtt/
下面我挑重点的说,如果不想看官方文档,可以直接看我下面说的
一般连每个云都需要一个账号和密码,一般都是一些字符串添加变化什么的,官方也一般会提供一些工具,这里onenet提供的工具如下所示,进入下载即可
下面先把这个工具用起来,把我们需要的做好,具体东西我在下面都填好了
关于unix时间戳,就是一个时间转换工具,这里的用处就是一旦时间超过了这个时间的话,服务器就会把连接的设备踢出去,生成时间戳的工具可以用如下网址
http://www.usey.cn/timestamp
下面编辑MQTT.fx工具
下面进行连接
查看设备也已经变为在线
下面尝试上传数据,文档如下,可以看到即可以上传数据点也可以上传数据命令
根据要求编写并进行订阅,可以看到订阅成功
订阅消息,数据格式是官方提供的,如下所示
{
"id": 123,
"dp": {
"temperatrue": [{
"v": 30,
"t": 1552289676
}],
"power": [{
"v": 4.5,
"t": 1552289676
}],
"status": [{
"v": {
"color": "blue"
},
"t": 1552289677
},
{
"v": {
"color": "red"
},
"t": 1552289678
}
]
}
}
进入云平台并刷新查看
下面尝试下发命令,官方描述如下所示
订阅如下
进入下发页面
编辑命令发送
进入软件可以看到收到了下发的命令
下面对命令进行一下回复
就是下发命令后立即把数据后面的cmdid获取然后在发布页面粘贴进去发布,可以看到下面返回接收成功,已经OK了
上述用到的信息资料
产品ID 489122
设备ID 893388762
设备名称 lx2035
$sys/{pid}/{device-name}/dp/post/json 数据点上传格式
$sys/{pid}/{device-name}/cmd/request/{cmdid} 设备下发格式
$sys/{pid}/{device-name}/cmd/response/{cmdid} 设备下发应答格式
$sys/489122/lx2035/dp/post/json/+
$sys/489122/lx2035/cmd/request/+
$sys/489122/lx2035/cmd/response/23e0bd09-e385-4a64-8fd4-4fe955fa25ba
选择多协议接入,这个好像是找的到的资料最多的一个了,很多都选择这个方式接入,例程也很丰富
注:这个我用mqttfx没连接成功,原因暂且不明,等以后成功了在更新这篇文章,用的是官方工具
官方文档地址:
https://open.iot.10086.cn/doc/multiprotocol/book/develop/mqtt/device/doc-tool.html
创建产品和设备
之后在官方文档下载需要的工具
编辑进行连接
进入设备页面,可以看到连接成功
下面进行数据的传输测试,订阅一个主题,名字是任意的
编辑数据上次
数据json格式如下:
{
"datastreams": [
{
"id": "temp",
"datapoints": [
{
"value": 36.5
}
]
}
]
}
可以看到已经收到了数据
下面进行数据下发测试,进入下发命令
成功接收
网址如下,这个常要登陆,跟微信关系挺大的,要是不行,请拿手机登陆,他这个云是很大的一个云,我们用的只是其中一个很小的部分
https://console.cloud.tencent.com/iotexplorer
之后进入公共实例,然后创建项目
之后进入产品创建,是一系列的过程
这里我们建两个自定义功能,标准功能就是谁都有的那种。一个普通变量然后一个布尔值
如下所示
其他这几个看着办吧,我呀不太清楚,随便设置下
最后所有的都打上钩就OK了
好,下面又进入看文档时间,读了这个文档就知道怎么接入云端了
https://cloud.tencent.com/document/product/1081/46507
这里他也提供了一个配网工具帮助我们接入
下载是个压缩包,然后只需要关注它里面个网页就行了
需要的数据从这里获取
然后在MQTTfx下面填入,有不懂的可以看看数据长度什么的,差不多就说明你填对了
参数说明在文档里也有
点击连接可以看到设备在线
设备下行数据。官方文档描述如下,一定要看我红字部分
订阅后如下所示
发布一个可以看到数据
MQTT端如下所示,接收数据正常
下面进行设备属性上报,文档描述如下
需要添加的东西在物模型协议里面,下面是我用的样例,因为我用了两个变量
{
"method":"report",
"clientToken":"123",
"timestamp":1628646783,
"params":{
"data1":20.5,
"data2":1
}
}
网址:https://iot.console.aliyun.com/lk/summary/new
先说位置,或者尝试直接搜索:物联网平台
公共实例下面创建设备
跟腾讯云一样,加两个参数,开始上报
阿里云这里做的特别好,直接复制,点击MQTT连接参数
可以看到,啥工具都不需要了,直接复制
一对一粘贴
之后连接就会显示在线了
下面进行设备的下发数据,格式在产品里面有说明
/a1xZ1EhVjDH/${deviceName}/user/get 模版
/a1xZ1EhVjDH/test1/user/get
点击发布
可以看到成功接收到消息
下面是上传数据,用这个自定义topic
模版如下
/a1xZ1EhVjDH/${deviceName}/user/update
/a1xZ1EhVjDH/test1/user/update
发送
因为还不是物模型的模版,可以在日志里面看到我们的消息
下面用官方的命令来试试,还是两个命令
设备下发
可以看到数据成功接收
下面进行本地发送到云端,数据模版如下
{
"method": "thing.service.property.set",
"id": "1469549558",
"params": {
"led": 0,
"temp": 36.5
},
"version": "1.0.0"
}
切换到发布页面,发布如下
进入查看,可以看到修改成功!
然后stm32其实也就是这样订阅发送这些模版数据进行更新的,下次再写,等我优化下代码。