相关文章推荐
性感的人字拖  ·  WPF学习系列014: 2.8.1 ...·  9 月前    · 
爱看球的太阳  ·  Android ...·  10 月前    · 
风流倜傥的台灯  ·  settings.json end of ...·  1 年前    · 

背景一:
本次海外设备开发,物联网设备和平台之间切换使用新的物模型协议对接,该格式基于MQTT实现,所以需要连接MQTT和物模型基本概念和原理。(缺一张实际应用框架图)

背景二:
车路协同设备和平台之间通过MQTT协议对接,理论和实际代码结合,输出一份资料记录一下,做个基础普及。

带着问题来学习

  1. MQTT是什么?只知道是协议。那MQTT协议由谁制定?在哪一年制定?现在有哪些版本?主推版本是哪个?版本是否兼容?
  2. MQTT出现背景?解决了什么问题?
  3. MQTT应用场景?优缺点?
  4. 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标准协议

  1. MQTT Version 3.1 英文版 HTML
  2. MQTT协议中文版 3.1.1
  3. MQTT Version 3.1.1 英文版 HTML
  4. MQTT Version 5.0 英文版 HTML
  5. MQTT协议5.0中文版
  6. 版本兼容性和更新说明
  7. MQTT 5.0 新特性

MQTT V5.0基于早期的v3.1.1标准,它具有重要的更新,同时最大限度地减少与现有版本的不兼容性。

关键节点

  1. IBM 1999年撰写了该协议的第一个版本。
  2. IBM 2013年提交MQTT 3.1 版规范。
  3. 2019年3月7号发布MQTT 5.0版规范-最新标准。
  1. MQTT百度百科

ISO:国际标准化组织、非政府组织
IEC:国际电工委员会
IBM:国际商业机器公司或万国商业机器公司
OASIS:结构化信息标准促进组织

  1. MQTT中文网

MQTT 3.1.1 协议中文版
MQTT 5.0 协议中文版
软件、资料

目标 :掌握基本概念、原理、场景使用、如何开发。

三、MQTT嵌入式开发

嵌入式设备一般是作为订阅者或发布者存在的,也就是TCP Client。

MQTT是标准化的协议,网上有很多封装好的开源库,只需交叉编译移植到设备中,应用调用开源库API即可。

  1. MQTT标准协议 :熟悉大概的原理、流程。
  2. MQTT开源库 :参考开源库sample移植开发。(注意同步和异步之分)

开源库选择: paho.mqtt.c

Linux下载安装(交叉编译根据README自行配置、这里仅贴一个示例)

git clone https://github.com/eclipse/paho.mqtt.c.git
cd paho.mqtt.c
sudo make install

3.1 paho.mqtt.c配置SSL/TLS加密认证

嵌入式设备MQTT开发,若使用paho.mqtt.c开源库,总会涉及到部分平台要使用TLS证书认证,具体库代码如何配置见:使用paho_mqtt_c库实现mqtt的ssl加密通讯

  1. 认证方式:非TLS和TLS单项认证、TLS双向认证。(非TLS使用tcp://,TLS使用ssl://)
  2. 证书配置参数

3.2 MQTT调试

实际开发过程中,设备端和平台端分别是由不同部门、甚至不同公司开发的,所以开发过程中的自测需要自己搭建测试环境或依托公司已有的测试环境,MQTT测试环境主要就是搭建代理服务器

MQTT测试环境

  • MQTT服务器:在线服务器或自己自建服务器。
  • MQTT嵌入式:paho.mqtt.c库下的demo 或者 设备应用程序。 (做开发端)
  • MQTT工具:MQTT.fx客户端。 (做调试验证)

设备调试内容主要有

  1. 登录认证(具体认证方式,根据平台和设备的协议来:用户名和密码、TLS单向证书认证……)
  2. 作为订阅者:订阅主题、由平台/其他工具发布该主题消息、验证设备应用是否可以收到。
  3. 作为发布者:通过平台/其他工具订阅指定主题、再由设备发布主题消息、验证平台/工具是否可以收到。
  4. 其他:平台提供信息后、可先通过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

四、MQTT对接

设备和平台若使用MQTT协议对接,当对方提供协议时、需关注如下信息:

  1. MQTT版本:常有版本3.1.1、3.1,部分对接使用5.0,设备默认使用3.1.1版本。
  2. 登录认证:匿名登录、用户名秘密认证、基于TLS 协议的双向证书的认证加密以及用户名密码认证、单向证书认证、
  3. Topic和content内容、程序当前是否都满足。
  4. QOS:部分代理限制或者不支持QOS=2。
  5. 调试提供:公网IP地址、端口(默认1883)、用户名和密码、CA证书(单向认证时需要)、CA证书和(双向认证时需要)

MQTT版本:代理可兼容3.1.1和5.0,但若是数据协议使用MQTT 5.0新特性时或代理仅支持5.0时,设备程序需要改代码。

五、MQTT代理服务器

5.1 MQTT登录认证方式

  1. 匿名登录:代理配置支持匿名登录,那么Client(订阅/发布者)可以不填写用户名和密码进行登录。
  2. 用户名和密码认证:Client需要填写在平台注册过的用户名和密码进行登录。
  3. TLS单向证书认证:Client需填写用户名和密码、以及CA证书。
  4. TLS双向证书的认证加密以及用户名密码认证:Client需要填写用户名和密码,以及CA证书文件、Client证书文件、Client秘钥文件。
  5. TLS双向证书的认证加密以及 客户端证书中的 CN 值作为用户名:Client填写CA证书文件、Client证书文件、Client秘钥文件。
  6. 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 使用步骤

  1. mosquitto 下载和安装
  2. mosquitto 启动服务器
  3. mosquitto 添加用户名和密码
  4. 修改mosquitto.conf配置、再重启服务(配置不同的登录认证方式)

注意:
1.配置TLS证书时,证书文件可以在借助linux下openssl生成,证书文件可以跨平台使用。
2.可以通过MQTT.fx来进行验证服务器配置是否生效。(切换配置时、最好更换端口

六、MQTT工具

  1. MQTT服务器:在线代理服务器、平台、自己搭建服务器、对方给的代理服务器。
  2. MQTT客户端:windows下的MQTT.fx。
  3. 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

文章目录背景一、简述二、设计规范三、主要特性四、MQTT协议原理4.1 MQTT协议实现方式4.2 网络传输与应用消息4.3 MTT客户端4.4 MQTT服务器4.5 MQTT协议中的订阅、主题、会话4.6 MQTT协议中的方法五、MQTT协议数据包结构5.1 MQTT固定头5.1.1 MQTT数据包类型5.1.2 标识位5.1.3 剩余长度(Remaining Length)5.2 MQTT可变头5.3 Payload消息体总结参考资料背景新嵌入式物联网设备开发,使用新的物模型协议格式,该格式是基于 第三章内容简介 • 第一节:基于STM32的节点端介绍 • 硬件平台,软件开发环境 • 第二节:使用Paho MQTT客户端协议栈直连阿里云IoT平台 • 适用于资源受限的节点设备 • 第三节:使用Linkkit C-SDK和TLS通过MQTT协议直连阿里云IoT平台 • 适用于资源丰富的节点设备 STM32-阿里云IoT 联合课件开发 第三章 . 第二节 基于Paho.MQTT直连阿里云IoT平台 第三章.第二节 内容简介 • 项目例程演示 • 项目例程流程图 • 演示视频 • MQTT协议介绍 • 协议特性 • 协议模型和报文格式 • 报文使用序列 • 阿里云IoT云平台侧MQTT协议实现 编译:将paho_mqtt_c/CMakeList.txt中:启用SSL编译 SET(PAHO_WITH_SSL TRUE CACHE BOOL "Flag that defines whether to build ssl-enabled binaries too. ") 编译为静态库: SET(PAHO_BUILD_SHAREDTRUECACHEBOOL"Buildsharedlib...
最近做物联网设备,需求长连接推送功能。当前物联网有一个标准协议是MQTT,对应有很多开源服务端,如何快速接入这个服务呢。有两种接入方案:   1.自己clone 代码修改维护。   2.找第三方服务,比如当前提供支持的有云巴,bat。bat目前都还处于公测中,at使用都需要申请设备,b可以直接接入。对比了价格,b最便宜,一个月免费消息1百万条。   最后决定先尝试使用百度云的MQTT服务后台,
最近做了个中移物联平台的项目,设备需要用到MQTTS来完成通讯,所以使用到了paho-mqtt-c的开源的MQTT协议栈库。 https://www.eclipse.org/paho/index.php?page=downloads.php 非常全,各种语言的源码都有,根据自己需求下载,我这里需要的是C/C++的协议栈。 由于我只需要做一个客户端,做的又是嵌入式设备,源码太多也没用,就精简了一下。 实际上只用了几个重要的 MQTTClient.h MQTTConnect.h MQTTFormat.h
目录Mosquitto 与 Eclipse Paho MQTT TLS使能备忘为什么使用MQTT原型系统构成服务端软件环境客户端软件环境使用OpenSSL构建TLS Mosquitto 与 Eclipse Paho MQTT TLS使能备忘 最近使用Mqtt协议为公司的分布式系统搭建了一个“简陋”的原型通信框架,实际使用下来效果还不错,因此打算对通信进行TLS加密,使其能够真正用于生产中。本文主要记录使用Mosquitto作为服务端及测试客户端,Paho MQTT(Python)作为客户端的使用配置下,用o
openssl 交叉编译 ./config no-asm shared linux-armv4 no-async – prefix=/home/openssl-master/nuc980 // linux-armv4 =>>target // no-async>undefined reference ***context paho mqtt-c 交叉编译 cmake … -DPAHO_BUILD_STATIC=TRUE -DPAHO_WITH_SSL=TRUE - DCMKAE