我是靠谱客的博主 整齐眼神,最近开发中收集的这篇文章主要介绍MQTT快速上手前言一、MQTT是什么?二、探索过程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言

任务是在固件中实现MQTT协议
本文从自己学习的角度为大家展示从无到有的整个过程,希望能帮助大家快速上手MQTT的使用


提示:以下是本篇文章正文内容,具体案例会实际操作展示给大家看

一、MQTT是什么?

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
MQTT入门介绍

第一次阅读MQTT通信协议的pdf文档

二、探索过程

1.用EC20怎么实现

EC20模块自带的AT指令实现MQTT

移远的EC20模块实现MQTT连接阿里云

发现有AT指令可以直接用,那么肯定有对应的手册,找到它

Quectel_LTE_Standard_MQTT_应用指导_V1.0.pdf

  1. AT+QMTCFG 配置 MQTT 可选参数
  2. AT+QMTOPEN 打开 MQTT 客户端网络
  3. AT+QMTCLOSE 关闭 MQTT 客户端网络
  4. AT+QMTCONN 连接客户端到 MQTT 服务器
  5. AT+QMTDISC 客户端断开与 MQTT 服务器的连接
  6. AT+QMTSUB 订阅主题
  7. AT+QMTUNS 退订主题
  8. AT+QMTPUBEX 发布消息
  9. AT+QMTRECV 从缓存中读取消息

2.使用阿里云

自己去申请账号,获得一个免费试用的机会:
物联网络管理平台
帮助文档

接下来用EC20模块和串口工具来做个测试吧!
使用到的是在阿里云中创建的产品:测试产品2下的设备:test2的三元组信息
{
“ProductKey”: “a1QHCozmnX5”,
“DeviceName”: “test2”,
“DeviceSecret”: “ad9b1cdcda86fabe00933ec51e666461”
}
具体指令如下:

AT+QMTCFG=“aliauth”,0,“a1QHCozmnX5”,“test2”,“ad9b1cdcda86fabe00933ec51e666461”
AT+QMTOPEN=0,“iot-as-mqtt.cn-shanghai.aliyuncs.com”,1883
AT+QMTCONN=0,“test2”
AT+QMTPUB=0,0,0,0,"/sys/a1QHCozmnX5/test2/thing/event/property/post","{params:{CurrentTemperature:20.25}}"
AT+QMTPUBEX=0,0,0,0,"/sys/a1QHCozmnX5/test2/thing/event/property/post",32
{“params”:{“PM25Value”:18.05}}

收到服务器下发的数据

“+QMTRECV:0,0,”/sys/a1QHCozmnX5/test2/thing/service/property/set","{“method”:“thing.service.property.set”,“id”:“1315741788”,“params”:{“LEDSwitch”:1},“version”:“1.0.0”}""

PS:这里用到的是阿里云的域名,可以根据域名得到IP地址
根据域名得到IP地址

阿里云看起来很好,但因为看不到实际的报文,当出现不符合我们预期的现象时,就抓瞎了,不知道哪里的问题,或者说不利于我们更具体的认识MQTT协议。

3.使用MQTT.fx

使用MQTT.fx接入物联网平台

同样看不到报文,但是文章里详细介绍了阿里云连接报文的组成规则,那么再重新仔细阅读MQTT通信协议的pdf文档.

注意:UTF-8 [RFC3629] 是一个高效的Unicode字符编码格式,为了支持基于文本的通信,它对ASCII字符的编码做了优化。每一个字符串都有一个两字节的长度字段作为前缀,它给出这个字符串UTF-8编码的字节数,它们在图例 1.1 UTF-8编码字符串的结构 中描述。因此可以传送的UTF-8编码的字符串大小有一个限制,不能超过 65535字节。

4.不使用EC20自带的MQTT功能

在实际使用中要考虑加密的环节,那么我们需要拿到MQTT的原始报文,经过加密芯片处理后,才能交给EC20模块去发送,就是要自己实现MQTT协议嘛,这是不是很难呀,MQTT介绍文档里写着,使用 TCP/IP 提供网络连接的,即EC20仅仅作为网络连接的工具用的,那么先用网络调试助手写报文试试吧!
以下报文对照MQTT协议

连接报文
10 10 00 04 4D 51 54 54 04 00 00 00 00 04 45 43 32 30
10 10 固定报头
00 04 4D 51 54 54 协议名:长度+MQTT
04 00 协议级别:level4,
连接标志:usernameflag passwordflag willretain willQos(2) willflag cleansession reserved
00 00 保持连接时长
00 04 45 43 32 30 长度 + ClientID(EC20)

10 72 00 04 4D 51 54 54 04 C2 02 58 00 27 31 32 33 34 35 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C 00 13 74 65 73 74 4E 6F 31 26 61 31 52 52 55 73 7A 31 44 54 35 00 28 39 41 35 34 46 43 31 32 41 36 31 37 38 39 43 45 34 35 30 38 33 43 37 39 35 39 35 32 32 31 43 39 35 36 35 30 42 43 43 44
客户端标识符:ClientID
12345|securemode=3,signmethod=hmacsha1| len=39=0x27
31 32 33 34 35 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C
用户名:testNo1&a1RRUsz1DT5 len=19=0x13
74 65 73 74 4E 6F 31 26 61 31 52 52 55 73 7A 31 44 54 35
密码:9A54FC12A61789CE45083C79595221C95650BCCD len=40=0x28
39 41 35 34 46 43 31 32 41 36 31 37 38 39 43 45 34 35 30 38 33 43 37 39 35 39 35 32 32 31 43 39 35 36 35 30 42 43 43 44

连接回复
20 02 00 00
断开连接
E0 00

其他报文分析(简单示意,不连接阿里云,自定义topic)

订阅主题:alldata_i1
82 0F 00 0A 00 0A 61 6C 6C 64 61 74 61 5F 69 31 00
取消订阅:alldata_i1
A2 0E 00 0A 00 0A 61 6C 6C 64 61 74 61 5F 69 31
取消订阅回复
B0 02 00 0A

连接报文:客户端ID1:EC20,无用户名密码
10 10 00 04 4D 51 54 54 04 00 00 00 00 04 45 43 32 30
订阅主题:/a1RRUsz1DT5/testNo1/user/reset
82 24 00 0A 00 1F 2F 61 31 52 52 55 73 7A 31 44 54 35 2F 74 65 73 74 4E 6F 31 2F 75 73 65 72 2F 72 65 73 65 74 00
发布消息: alldata_i1{params:{“TempretureLine”:20.15}}
32 2a 00 0a 61 6C 6C 64 61 74 61 5F 69 31 7B 70 61 72 61 6D 73 3A 7B 22 54 65 6D 70 72 65 74 75 72 65 4C 69 6E 65 22 3A 32 30 2E 31 35 7D 7D
A2 23 00 0A 00 1F 2F 61 31 52 52 55 73 7A 31 44 54 35 2F 74 65 73 74 4E 6F 31 2F 75 73 65 72 2F 72 65 73 65 74
订阅I1协议回复报文
device/heart_i1/reply
64 65 76 69 63 65 2F 68 65 61 72 74 5F 69 31 2F 72 65 70 6C 79
82 1A 00 0A 00 15 64 65 76 69 63 65 2F 68 65 61 72 74 5F 69 31 2F 72 65 70 6C 79 00

客户端ID2:i1reply : 69 31 72 65 70 6C 79
10 13 00 04 4D 51 54 54 04 00 00 00 00 07 69 31 72 65 70 6C 79
订阅主题 :alldata_i1
82 0F 00 0A 00 0A 61 6C 6C 64 61 74 61 5F 69 31 00
发布消息:
/a1RRUsz1DT5/testNo1/user/reset{“params”:{“UnderVoltThreshold”:40}}
32 45 00 1F 2F 61 31 52 52 55 73 7A 31 44 54 35 2F 74 65 73 74 4E 6F 31 2F 75 73 65 72 2F 72 65 73 65 74 7B 22 70 61 72 61 6D 73 22 3A 7B 22 55 6E 64 65 72 56 6F 6C 74 54 68 72 65 73 68 6F 6C 64 22 3A 34 30 7D 7D
订阅device/heart_i1
82 15 00 0A 00 10 64 65 76 65 69 63 65 2F 68 65 61 72 74 5F 69 31 00
订阅device/algorithm_i1
82 18 00 0A 00 13 64 65 76 69 63 65 2F 61 6C 67 6F 72 69 74 68 6D 5F 69 31 00
订阅device/meter_i1
82 14 00 0A 00 0f 64 65 76 69 63 65 2F 6D 65 74 65 72 5F 69 31 00
订阅device/line_tmp_i1
82 17 00 0A 00 12 64 65 76 69 63 65 2F 6C 69 6E 65 5F 74 6D 70 5F 69 31 00
订阅device/packet_i1
82 15 00 0A 00 10 64 65 76 69 63 65 2F 70 61 63 6B 65 74 5F 69 31 00

5.MQTT服务器

考虑到阿里云使用有限制,会收费,我们自己来搭建个免费的MQTT服务器吧!
apollo服务器的搭建

apollo.xml配置文件
配置文件
启动apollo服务器
apollo服务器启动

apollo服务器
连接情况示意(设备作为一个客户端和python模拟另一个客户端,实现I1协议交互)
连接情况
两个客户端订阅的topic列表
已订阅的topics
apollo服务器启动的异常情况:端口占用

据说apollo的MQTT服务器很早就已经停止维护了…所以

6.另一个MQTT服务器

软件组提供的MQTT服务器
EMQ X Broker

EMQ X Broker文档

7.固件中使用的MQTT库文件

参考正点原子STM32F4探索者开发板和阿里云平台的MQTT通信项目
博客地址
MQTT客户端库
常用MQTT客户端库简介

固件中要考虑的问题:

  • 兼容I1协议,两种协议使用的切换
  • 连接报文中各个标记位的控制(要联系现场实际情况而定)
  • topic订阅的条件:考虑到要接收I1协议的回复内容,所以连接后先订阅相关topic;
  • 新增报文上传间隔的设置的topic
  • TCP连接之后,CONNECT连接报文的超时等异常情况
  • 收到心跳回复后的对时操作等

最后

以上就是整齐眼神为你收集整理的MQTT快速上手前言一、MQTT是什么?二、探索过程的全部内容,希望文章能够帮你解决MQTT快速上手前言一、MQTT是什么?二、探索过程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部