文章目录
一、背景
背景一:
本次海外设备开发,物联网设备和平台之间切换使用新的物模型协议对接,该格式基于MQTT实现,所以需要连接MQTT和物模型基本概念和原理。(缺一张实际应用框架图)
背景二:
车路协同设备和平台之间通过MQTT协议对接,理论和实际代码结合,输出一份资料记录一下,做个基础普及。
带着问题来学习
- MQTT是什么?只知道是协议。那MQTT协议由谁制定?在哪一年制定?现在有哪些版本?主推版本是哪个?版本是否兼容?
- MQTT出现背景?解决了什么问题?
- MQTT应用场景?优缺点?
- MQTT嵌入式开发?
二、MQTT介绍
MQTT(消息队列遥测传输) 是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 。
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。
MQTT 入门介绍
https://www.runoob.com/w3cnote/mqtt-intro.html
https://blog.csdn.net/qq_28877125/article/details/78325003
在MQTT通讯过程中,有三种身份,分别是发布者(publisher)、代理(broker)、和订阅者(subscriber)
MQTT标准协议
- MQTT Version 3.1 英文版 HTML
- MQTT协议中文版 3.1.1
- MQTT Version 3.1.1 英文版 HTML
- MQTT Version 5.0 英文版 HTML
- MQTT协议5.0中文版
- 版本兼容性和更新说明
- MQTT 5.0 新特性
MQTT V5.0基于早期的v3.1.1标准,它具有重要的更新,同时最大限度地减少与现有版本的不兼容性。
关键节点:
- IBM 1999年撰写了该协议的第一个版本。
- IBM 2013年提交MQTT 3.1 版规范。
- 2019年3月7号发布MQTT 5.0版规范-最新标准。
参考资料
ISO:国际标准化组织、非政府组织
IEC:国际电工委员会
IBM:国际商业机器公司或万国商业机器公司
OASIS:结构化信息标准促进组织
MQTT 3.1.1 协议中文版
MQTT 5.0 协议中文版
软件、资料
目标:掌握基本概念、原理、场景使用、如何开发。
三、MQTT嵌入式开发
嵌入式设备一般是作为订阅者或发布者存在的,也就是TCP Client。
MQTT是标准化的协议,网上有很多封装好的开源库,只需交叉编译移植到设备中,应用调用开源库API即可。
- MQTT标准协议:熟悉大概的原理、流程。
- MQTT开源库:参考开源库sample移植开发。(注意同步和异步之分)
开源库选择:paho.mqtt.c
Linux下载安装(交叉编译根据README自行配置、这里仅贴一个示例)
git clone https://github.com/eclipse/paho.mqtt.c.git
cd paho.mqtt.c
make
sudo make install
3.1 paho.mqtt.c配置SSL/TLS加密认证
嵌入式设备MQTT开发,若使用paho.mqtt.c开源库,总会涉及到部分平台要使用TLS证书认证,具体库代码如何配置见:使用paho_mqtt_c库实现mqtt的ssl加密通讯
关注点:
- 认证方式:非TLS和TLS单项认证、TLS双向认证。(非TLS使用tcp://,TLS使用ssl://)
- 证书配置参数
3.2 MQTT调试
实际开发过程中,设备端和平台端分别是由不同部门、甚至不同公司开发的,所以开发过程中的自测需要自己搭建测试环境或依托公司已有的测试环境,MQTT测试环境主要就是搭建代理服务器。
MQTT测试环境
- MQTT服务器:在线服务器或自己自建服务器。
- MQTT嵌入式:paho.mqtt.c库下的demo 或者 设备应用程序。 (做开发端)
- MQTT工具:MQTT.fx客户端。 (做调试验证)
设备调试内容主要有:
- 登录认证(具体认证方式,根据平台和设备的协议来:用户名和密码、TLS单向证书认证……)
- 作为订阅者:订阅主题、由平台/其他工具发布该主题消息、验证设备应用是否可以收到。
- 作为发布者:通过平台/其他工具订阅指定主题、再由设备发布主题消息、验证平台/工具是否可以收到。
- 其他:平台提供信息后、可先通过MQTT.fx等工具验证IP、端口、用户名和密码、证书是否可以使用(是否可以连接成功)。
补充资料:
paho.mqtt.c API接口描述
https://blog.csdn.net/guozhongwei1/article/details/85207169
Paho -物联网 MQTT C Cient的实现和详解
https://www.cnblogs.com/homejim/p/8196763.html
其他MQTT库:
https://github.com/eclipse/paho.mqtt.embedded-c
3.3 MQTT 遗嘱消息(Will Message)的使用
四、MQTT对接
设备和平台若使用MQTT协议对接,当对方提供协议时、需关注如下信息:
- MQTT版本:常有版本3.1.1、3.1,部分对接使用5.0,设备默认使用3.1.1版本。
- 登录认证:匿名登录、用户名秘密认证、基于TLS 协议的双向证书的认证加密以及用户名密码认证、单向证书认证、
- Topic和content内容、程序当前是否都满足。
- QOS:部分代理限制或者不支持QOS=2。
- 调试提供:公网IP地址、端口(默认1883)、用户名和密码、CA证书(单向认证时需要)、CA证书和(双向认证时需要)
MQTT版本:代理可兼容3.1.1和5.0,但若是数据协议使用MQTT 5.0新特性时或代理仅支持5.0时,设备程序需要改代码。
五、MQTT代理服务器
5.1 MQTT登录认证方式
- 匿名登录:代理配置支持匿名登录,那么Client(订阅/发布者)可以不填写用户名和密码进行登录。
- 用户名和密码认证:Client需要填写在平台注册过的用户名和密码进行登录。
- TLS单向证书认证:Client需填写用户名和密码、以及CA证书。
- TLS双向证书的认证加密以及用户名密码认证:Client需要填写用户名和密码,以及CA证书文件、Client证书文件、Client秘钥文件。
- TLS双向证书的认证加密以及 客户端证书中的 CN 值作为用户名:Client填写CA证书文件、Client证书文件、Client秘钥文件。
- TLS双向证书的认证加密以及 客户端证书中的完整主题值作为用户名:Client填写CA证书文件、Client证书文件、Client秘钥文件。
不同登录认证方式,设计MQTT代理的不同配置,可以在不同端口设置不同登录认证方式。
问题:
1.同一端口MQTT是否可以同时支持匿名登录与用户名和密码认证?
5.1 在线MQTT代理服务器
可以直接使用网络上的一些代理服务器+Client工具来进行设备功能调测。
5.2 自建MQTT代理服务器 (mosquitto)
这里只做基本介绍和使用步骤,详细操作看这里:mosquitto 测试MQTT TLS单向认证和双向认证
mosquitto 介绍
Eclipse mosquito是一个开源(EPL/EDL许可的)消息代理,它实现了MQTT协议版本5.0、3.1.1和3.1。mosquito是轻量级的,适用于所有设备,从低功耗的单板计算机到完整的服务器。
mosquitto 使用步骤
- mosquitto 下载和安装
- mosquitto 启动服务器
- mosquitto 添加用户名和密码
- 修改mosquitto.conf配置、再重启服务(配置不同的登录认证方式)
注意:
1.配置TLS证书时,证书文件可以在借助linux下openssl生成,证书文件可以跨平台使用。
2.可以通过MQTT.fx来进行验证服务器配置是否生效。(切换配置时、最好更换端口)
六、MQTT工具
- MQTT服务器:在线代理服务器、平台、自己搭建服务器、对方给的代理服务器。
- MQTT客户端:windows下的MQTT.fx。
- MQTT设备端:paho.mqtt.c下的sample、设备应用代码。
七、其他资料
MQTT协议-MQTT协议简介及协议原理
https://blog.csdn.net/jiesa/article/details/50635222
阿里云物联网平台:Paho-MQTT C接入示例
https://www.alibabacloud.com/help/zh/doc-detail/146611.htm#title-0a4-2nq-kat
Paho 项目介绍
http://wiki.eclipse.org/Paho
MQTT协议的优缺点
https://blog.csdn.net/anxianfeng55555/article/details/80908958
https://www.ebyte.com/new-view-info.aspx?id=1178