MQTT Paho + Mosquitto 快速搭建 & 双向认证

2023-11-08

今天继续聊SOA的话题,前面聊过了SOME/IPDDS,很多文章提到SOA协议,还会把HTTP和MQTT也放进来讨论。但个人认为,目前只有SOME/IP和DDS适合作为车载SOA的中间件方案,而HTTP和MQTT则更适合应用于车联网云端交互的场景。

MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开放、简单、规范,因此易于实现。这些特点使得它对很多场景来说都是很好的选择,包括受限的环境如机器与机器的通信(M2M)以及物联网环境(IoT),这些场景要求很小的代码封装或者网络带宽非常昂贵。

MQTT运行在TCP/IP之上,它有以下特点:

  • 使用发布/订阅消息模式,提供了一对多的消息分发和应用之间的解耦。

  • ​消息传输不需要知道负载内容。

  • 提供三种等级的服务质量:“最多一次”,尽操作环境所能提供的最大努力分发消息。消息可能会丢失。例如,这个等级可用于环境传感器数据,单次的数据丢失没关系,因为不久之后会再次发送;“至少一次”,保证消息可以到达,但是可能会重复;“仅一次”,保证消息只到达一次。

  • 很小的传输消耗和协议数据交换,最大限度减少网络流量。

  • 连接异常断开时,能通知到相关各方。

如图,不管对于CP还是AP Autosar,都没有提供MQTT的支持。因此,对于跑Autosar的ECU来说,很难实施MQTT Client,更不要说Broker了。对于非Autosar的ECU来说,MQTT Client的实施是容易的,但是能不能作为Broker就得打个问号了。前面讨论过几种通信模型,MQTT是典型的Broker模型:

互联网通常具备性能强大的后端服务器,完全有能力部署Broker,承受百万级别的连接,还可以支持身份认证、动态主题、主题过滤、集群等,尤其是主题的管理,我认为是不可或缺的功能点,ECU可以实现吗?即使可以,我想对性能的挑战也会不小。因此,对于非Autosar的ECU来说,MQTT更多的应用场景是实现MQTT的客户端,与云端进行通信,可能还需要进行云端消息与车载SOA消息间的转化,从而实现远程控制、远程升级、大数据采集等常见功能。

下面我以初步体验一下MQTT作为小目标,快速搭建了一个Paho MQTT Client + Mosquitto MQTT Broker的试验环境,先简单介绍一下它俩:

Eclipse Mosquito 是一个开源(EPL/EDL许可)消息代理,它实现了MQTT协议版本5.0、3.1.1和3.1。Mosquito是轻量级的,适用于从低功耗单板机到全服务器的所有设备。

Eclipse Paho 以各种编程语言提供了MQTT客户端的开源(EPL/EDL许可)实现:

以前觉得Eclipse是做IDE的,还不咋好用,又肤浅了。

下面以Paho C 同步接口为例,实现两个客户端,一个订阅主题,一个发布主题消息,通过Broker进行通信,关于下载和安装,依然写在README中,关注公众号回复“演示代码”就可以看到完整Demo代码的Github链接。运行结果如下:

从这个示例,可以看出,两个客户端之间彼此独立,它们只分别与Broker进行通信,代码比较简单,按照官方示例的调用顺序,配置通信参数就可以了,用Wireshark抓取数据包(3.4.2版本完美支持MQTT协议):

现在问题来了,在互联网环境中,这样的通信是非常不安全的,所有消息几乎都在裸奔,并且只要连接建立起来,任何应用都可以订阅/发布任何主题的任何消息,显然,这是不能接受的。那么,如何实现常用的双向认证呢?首先,在编译Paho C++ Client库时需要打开PAHO_WITH_SSL开关,接下来用脚本(在生产环境中,可以定制生成证书的脚本)简单制作测试用的CA:

mkdir myCA
wget https://github.com/owntracks/tools/raw/master/TLS/generate-CA.sh
chmod +x generate-CA.sh
# 生成服务端证书
./generate-CA.sh server
# 用生成的CA,生成客户端证书
openssl genrsa -out client.key 2048
openssl req -new -out client.csr -key client.key -subj "/CN=client/O=example.com"
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAserial ./ca.srl -out client.crt -days 3650 -addtrust clientAuth

简单测试一下,CA是否可用:

openssl verify -CAfile ca.crt server.crt
openssl verify -CAfile ca.crt client.crt

创建配置文件ca_test.conf:

listener 8883
cafile /home/lxl/Develop/myCA/ca.crt
certfile /home/lxl/Develop/myCA/server.crt
keyfile /home/lxl/Develop/myCA/server.key
require_certificate true
use_identity_as_username true

用这个配置文件启动mosquitto:

mosquitto -c ./ca_test.conf

用mosquitto提供的测试程序,验证SSL连接是否成功:

mosquitto_sub -h 127.0.0.1 -p 8883 -t "TestTopic" --cafile /home/lxl/Develop/myCA/ca.crt --cert /home/lxl/Develop/myCA/client.crt --key /home/lxl/Develop/myCA/client.key
mosquitto_pub -h 127.0.0.1 -p 8883 -t "TestTopic" -m "this is SSL" --cafile /home/lxl/Develop/myCA/ca.crt --cert /home/lxl/Develop/myCA/client.crt --key /home/lxl/Develop/myCA/client.key

验证OK后,可以着手改代码了,主要是在建立连接前配置SSL选项的参数(具体可以查看完整代码):

MQTTClient_SSLOptions ssl_opts = MQTTClient_SSLOptions_initializer;
conn_opts.ssl = &ssl_opts;
conn_opts.ssl->trustStore = "/home/lxl/Develop/myCA/ca.crt";
conn_opts.ssl->keyStore = "/home/lxl/Develop/myCA/client.crt";
conn_opts.ssl->privateKey = "/home/lxl/Develop/myCA/client.key";
conn_opts.ssl->enableServerCertAuth = true;

运行效果和前面基本一致,再用Wireshark捕获一下数据包看看:

Nice,终于不再裸奔啦~ 

双向认证只是安全措施的一种,还可以加持其他措施,如身份认证、针对主题的权限管理等,以增强安全性。

最后,和HTTP相比,MQTT是为物联网而生的协议,主要体现在:它比HTTP更加轻量,协议更精简,消息头更短,这些都提高了它的响应时间和吞吐量,并降低了开销和功耗。MQTT也有不适用的场景,比如大文件、音视频等,就要考虑其他传输方案了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MQTT Paho + Mosquitto 快速搭建 & 双向认证 的相关文章

  • 如何通过互联网使用 MQTT?

    目前 我正在成功运行一个 mosquitto 代理 订阅主题并与本地网络中的客户端发布消息 如何与位于不同 IP 地址的另一个本地网络进行通信 我应该设置 2 个 mosquitto 经纪人 每个本地网络一个吗 其他本地网络中的 PC 需要
  • 如何使用 MQTT Paho 在 RabbitMQ 队列中订阅

    我正在尝试从我的 Android 应用程序连接到一个名为 消息 的队列 生产者 AMQP 协议下的一种 Web 服务 已连接 可以通过 RabbitMQ 管理面板进行检查 为了从我的 Android 设备进行连接 我正在这样编码 priva
  • 最大 MQTT 连接数

    我需要创建一个服务器场 可以处理 5 100 万个连接 5 00000 个主题 每个客户端一个 每秒处理 300k 消息 我尝试了解各种消息代理的功能 因此我目前使用两个 RHEL EC2 实例 r3 4xlarge 来获取大量可用资源 所
  • 事件驱动架构和事件结构

    我是 EDA 新手 我已经阅读了很多有关其优点的内容 并且可能有兴趣在我的下一个项目中应用它 但仍然不明白一些东西 引发事件时 哪种模式最适合 将事件命名为 CustomerUpdate 并包含有关客户的所有信息 更新或未更新 将事件命名为
  • 面向服务的架构建议

    出于个人和大学研究的原因 我正在考虑使用面向服务的架构构建一个简单的 CRM 其意义只是解释架构本身 并非商业用途 我正在考虑实施一个 CRM 提供简单的分析服务和客户服务 用户存储 个人评论和其他一些东西 我正在设计的架构定义 WebGU
  • ESB 应该如何打包/部署?

    我正在尝试了解 Apache Camel 它似乎是一个轻量级的 ESB 如果我正确理解 Camel ESB 那么您可以将 Camel Route 视为节点和边的图 每个节点都是路由上的端点 可以消耗 产生消息 每条边都是两个不同端点 1 个
  • 什么是SOA(面向服务的架构)?

    如果你愿意的话 可以叫我巨魔 但我是认真的 新的 SOA 趋势与我 15 年前构建的客户端服务架构究竟有何不同 我一直听到 SOA 但我不明白它与我们一直以来所做的有什么不同 早在 10 年前 我的公司就有多个客户 使用多种语言 使用相同的
  • Eclipse Californium CoAP 通配符作为 url 路径

    我正在使用 Eclipse Californium 开发一个 CoAP 应用程序 它将仅显式声明根资源路径 其余资源应通过通配符提供和解析 root 就像在 REST API 或 servlet 上一样 有什么办法可以实现这一点吗 好吧 我
  • 如何快速了解 SOA? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Spring集成MQTT发布订阅多个主题

    我正在尝试构建一个订阅多个 mqtt 主题的应用程序 获取信息 处理它并形成 xml 并在处理时触发一个事件 以便这些可以发送到某个云服务器 并将成功的响应从那里发送回MQTT 通道
  • React Native 上的 MQTT?

    将 MQTT 添加到我的反应原生项目时 我很难找到正确的方法 该项目需要在 iOS 和 Android 上运行 因此理想情况下 MQTT 可以在 javascript 端处理 我意识到移动节点和经典节点的网络巢穴是不同的 所以我开始沿着分叉
  • 如何为 HTTP GET 的多个 Key-Value 参数设计 REST URI

    我正在设计一个 RESTful API 一项服务应该提供多个键值对的查询功能 例如 客户端可以使用一个 HTTP GET 请求来查询不同的产品及其关联的数量 客户想要查询金额为 44 的产品 1 和金额为 55 的产品 2 我实际上不希望我
  • SOA架构数据访问

    在我的 SOA 架构中 我有几个世界碳基金服务 我的所有服务都需要访问数据库 我应该创建一个专门的 WCF 服务来负责所有数据库访问吗 或者 如果我的每个服务都有自己的数据库访问权限 可以吗 在一个版本中 我在一项服务中只实例化了一个实体层
  • 面向服务的架构通信标准

    我过去致力于构建使用面向服务的架构构建的数据处理应用程序 我有一系列服务 这些服务全部由主服务管理 该主服务将串行调用所有服务来处理我的数据 我遇到了一些我不喜欢的事情 因为服务必须向主服务提供状态和错误反馈 而我必须从头开始编写所有代码
  • 将消息从 AWS Lambda 发布到 AWS IoT

    我正在尝试使用 Nodejs 将消息从 AWS Lamba 发布到 AWS IoT 我已压缩该项目并上传到 AWS IoT 下面是代码片段 var awsIot require aws iot device sdk var device a
  • Android,在连接wifi的情况下与移动数据通信,无需上网

    我有一个汽车配套应用程序 需要与 WiFi 和移动数据网络进行通信 我的车辆控制单元提供了一个无需互联网访问的 WiFi 网络 它公开了我们可以从应用程序调用的 API 服务 除此之外 我们还需要使用手机移动数据 3G 4G 与另一个可通过
  • 生成单调递增整数(最大 64 位)

    作为新项目的一部分 我们需要一个可以生成单调递增整数的服务 该服务的要求是 服务不需要生成连续的整数 只要它生成单调递增的整数就应该没问题 它应该产生 64 位整数 该服务应该具有高可用性 服务应该能够适应故障 或重新启动 我本来打算使用r
  • 当代理关闭并启动时,Node JS mqtt 客户端未收到订阅的消息

    我创建了一个 mqtt Node js 客户端 我的连接选项如下 mqttOptions clientId 100 keepAlive 1000 clean false reconnectPeriod 1000 will willMessa
  • DDD 和 SOA 真的可以很好地协同工作吗?

    如果我完全破坏了 DDD 概念 请轻轻地告诉我 但这就是我的困境 假设我有以下域模型 Teacher IList
  • 使用 WCF 的契约优先 SOA

    这个问题更多的是探索人们在社区中 在实际情况中所做的事情 而不是一个有针对性的问题 我对此进行了相当广泛的搜索 虽然我发现很多博主都提倡契约优先的服务设计 并且有一些评论支持它们 但我还没有找到很多关于使用 WCF 实现契约优先的实用信息

随机推荐

  • 从编译流程看变量在内存中的存储位置

    1 编译流程 https blog csdn net williamgavin article details 83867408 参考的详细过程 gcc E main c o main i 预编译 将源代码main c处理生成main i
  • 简单的Java代码实现斗地主

    简单的Java代码实现斗地主 斗地主综合分析 1 准备牌 54张牌存储到一个集合中 特殊牌 大王 小王 其他52张牌 定义一个数组 集合 存储4种花色 定义一个数组 集合 存储13个序号 循环嵌套遍历两个数组 集合 组装52张牌 2 洗牌
  • k次方 求1个数的n次方的前三位数和后三位数

    K次方 Time Limit 2000 1000ms Java Other Memory Limit 65535 32768K Java Other Total Submission s 34 Accepted Submission s 1
  • nmea0183 c语言源码,NMEA-0183parser - 源码下载

    GPS NMEA 0183 Debug GPS NMEA 0183 exe GPS NMEA 0183 ilk GPS NMEA 0183 pdb NMEA log NMEA2 log NMEA3 log parserInfo NMEADa
  • 前端使用mqtt协议

    前端调用 mqtt协议 简单介绍下mqtt他就是和websocket基本类似 但实质上还是不同的 这个可以查阅更准确的内容 这个js用在react还是vue中没有实质的区别都是类似了 以下的代码我用在了react中 mqtt协议主要流程 1
  • No accessible constructors were found for the type‘XXXXXX‘

    abp框架新建了一个模版项目 启动报错 报错实例 Autofac Core Activators Reflection NoConstructorsFoundException No accessible constructors were
  • java学习的准备

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 Java JavaEE JavaSE JavaME的区别 二 JDK JRE JVM 三 JDK目录 四 Java程序开发运行流程 五 注释 前言 突然发
  • vue项目SEO优化方案——prerender-spa-plugin插件实现预渲染

    安装插件 npm install prerender spa plugin save 代码应用 vue config js const PrerenderSPAPlugin require prerender spa plugin cons
  • 卡尔曼滤波系列(五)——奇异值鲁棒的卡尔曼滤波算法

    目录 1 简介 2 原理 3 实验 4 参考文献 1 简介 传统的卡尔曼滤波算法假定了噪声服从高斯分布 而实际应用场景中 由于传感器受到各种因素的影响 可能存在部分远偏离预期值的观测结果 称为奇异值 此时观测噪声不再是高斯分布的 而类似于s
  • 通信线路工程设计

    目录 通信线路工程设计 施工与维护 第一 四章部分内容 第一章 通信线路基础知识 第二章 通信线路工程设计要点 第三章 通信线路工程勘测 第四章 光缆线路工程设计 else 分光器和分纤盒 单模光纤和多模光纤 通信线路工程设计 施工与维护
  • 编程对小学生重要吗?看完小学生机器人编程学习线路图就知道了

    孩子步入小学阶段以后 很多家长都会把大部分时间经精力用在孩子的学科辅导上 过于看中孩子的学习分数 往往会忽视孩子的兴趣培养和综合能力的提升 近两年 少儿编程赛道受到了资本的广泛关注 伴随着诸多教育新政和利好政策的出台 很多家长已经把孩子的编
  • springboot+vue前后端分离项目,拦截器获取不到session的问题,和解决思路

    前后端分离的项目 浏览器发送请求给服务器通常都要发送两次 其中一次是options类型的请求 可打开network查看 主要是为了验证服务器是否可用 而options请求又不会携带我们自定义的header数据 所以必然会被拦截器给拦截 导致
  • vue3父组件给子组件传值

    父组件
  • Could not acquire change log lock. Currently locked by XXXXXX

    最近公司项目使用到了flowable 为了方便业务开发人员使用流程设计器画流程图 使用了flowable的原生流程设计器modeler 用docker部署非常方便 参考flowable流程设计器部署官网文档 用docker部署flowabl
  • JAVA 10

    重写 一 重写是父类与子类之间多态的一种表现 二 重写方法的参数列表必须与被重写的方法完全相同 三 重写方法的访问符一定要大于被重写方法的访问修饰符 要保证public gt protected gt default gt private
  • Node-包管理工具整套下载使用讲解(nvm、npm、yarn、cnpm、pnpm、nrm)

    前言 包管理工具npm Node Package Manager 就是Node包管理器 现在已经不仅仅是node的包管理器了 我们前端项目也都会用它来进行管理项目依赖的包 如何下载和安装npm工具 npm属于node的一个管理工具 所以我们
  • 管螺纹如何标注_螺纹画法图解,你了解多少?

    螺纹是机械产品中常见的联接件 在绘制机械图纸时 螺纹的画法是有讲究的 国家机械制图标准中对螺纹画法做出了详细的规定 不同螺纹画法也不尽相同 螺纹的画法图解 01 外螺纹 外螺纹不论其牙形如何 螺纹的牙顶 大径 及螺纹终止线用粗实线表示 螺杆
  • merge into 的用法

    1 语法 merge into 的语法如下所示 MERGE INTO target table T USING source table sql S ON conditional expression and WHEN MATCHED TH
  • apache-Tomcat 8.5.39安装包 安装过程以及启动文件详解

    1 apache tomcat8 5 39 安装包地址 链接 https pan baidu com s 1 EIftvG A XM8VEfkDlJLQ 提取码 fxpp 复制这段内容后打开百度网盘手机App 操作更方便哦 说明 tomca
  • MQTT Paho + Mosquitto 快速搭建 & 双向认证

    今天继续聊SOA的话题 前面聊过了SOME IP和DDS 很多文章提到SOA协议 还会把HTTP和MQTT也放进来讨论 但个人认为 目前只有SOME IP和DDS适合作为车载SOA的中间件方案 而HTTP和MQTT则更适合应用于车联网云端交