热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Mosquitto上建立到EMQX的桥接

EMQX节点可以被其他类型的MQTT消息中间件桥接,实现跨平台的消息订阅和发送。本文我们以一个配置实例来说明如何配置Mosquitto到EMQX的桥接。Mosqui

EMQ X 节点可以被其他类型的 MQTT 消息中间件桥接,实现跨平台的消息订阅和发送。本文我们以一个配置实例来说明如何配置 Mosquitto 到 EMQ X 的桥接。

Mosquitto 是一个小型轻量的开源 MQTT Broker,由 C/C++ 语言编写。Mosquitto 采用单核心单线程架构,支持部署在资源有限的嵌入式设备,接入少量 MQTT 设备终端,并实现了 MQTT 5.0 和 3.1.1版本协议。

EMQ X 与 Mosquitto 均完整支持了 MQTT 协议特性,但 EMQ X 支持更多通信协议以及私有协议接入。应用层的功能拓展方面,Mosquitto 缺乏开箱即用的如认证鉴权、规则引擎、数据持久化与高性能消息桥接(EMQ X 企业版)等业务相关功能; 监控运维与可视化管理方面, EMQ X 有完整的现有功能和拓展方案支持;基础功能上 Mosquitto 集群功能羸弱,官方和第三方实现的集群方案均难以支撑物联网大规模海量连接的性能需求。

因此 Mosquitto 并不适合用来做规模化服务的 MQTT Broker,但由于其足够轻量精简,可以运行在任何低功率单片机包括嵌入式传感器、手机设备、嵌入式微处理器上,是物联网边缘消息接入较好的技术选型,结合其桥接功能可以实现消息的本地处理与云端透传。

场景描述

假设我们有一个 EMQ X 服务器集群 emqx1,和一台 Mosquitto 服务器,我们需要在 Mosquitto 上创建一条桥接,把所有 传感器(sensor) 主题消息转发至 emqx1 集群,并从 EMQ X 订阅所有控制(control)主题。

在这里插入图片描述

EMQ X

集群集群地址监听端口
emqx1192.168.1.1001883

Mosquitto

地址监听端口
192.168.1.1011883

配置 Mosquitto 服务器

配置 Mosquitto 的桥接需要在安装后修改 mosquitto.conf 文件。对于每一个桥接,需要配置的基本内容有:

  • 远端的 EMQ X 服务器的地址和端口;
  • MQTT 协议参数,如协议版本,keepalive, clean_session等(如不配置则使用默认值);
  • EMQ X 需要的客户端登录信息;
  • 需要桥接的消息的主题;
  • 配置桥接主题映射(默认无映射)。

一个简单的配置例

新建桥接

打开 mosquitto.conf 文件,增加一个 connection 以建立一个新的桥接,connection 关键字后的字符串同时也是远端节点上使用的client id:

connection emqx1

配置桥接远端节点的地址和端口

address 192.168.1.100:1883

配置协议版本
Mosquitto桥接使用的 MQTT 协议版本默认为3.1,要使用3.1.1协议需要在配置中指定。

bridge_protocol_version mqttv311

配置远端节点用户名

remote_username user

配置远端节点密码

remote_password passwd

指定需要桥接的主题
桥接主题的配置格式为 topic 主题模式 方向 QoS 本地前缀 远端前缀,它定义了桥接转发和接收的规则。其中:

  • 主题模式指定了需要桥接的主题,支持通配符;
  • 方向可以是 in, out 或者 both
  • QoS 为桥接的QoS级别, 如不指定则使用被转发消息原QoS
  • 本地和远程前缀用于主题映射,在转发和接收的消息主题上加上相应前缀,以便应用可以识别消息来源。

以下配置例添加了两条桥接规则:

topic sensor/# out 1
topic control/# in 1

在配置完成后,需要重新启动Mosquitto使桥接配置生效。

配置 EMQ X 服务器

在安装 EMQ X 服务器后,为了使 Mosquitto 桥接可以接入,需要视情况决定是否配置相应的用户认证和鉴权信息。或者在实验阶段为了简化测试,可以使用允许匿名登录和 acl_nomatch 跳过认证和鉴权。

测试配置

我们使用 mosquitto_submosquitto_pub 工具来测试桥接的配置是否成功。

测试桥接的 out 方向

在’emqx1’上订阅订阅’sensor/#'主题,该主题将接收到 Mosquitto 上报的数据:

$ mosquitto_sub -t "sensor/#" -p 1883 -d -q 1 -h 192.168.1.100Client mosqsub|19324-Zeus- sending CONNECT
Client mosqsub|19324-Zeus- received CONNACK
Client mosqsub|19324-Zeus- sending SUBSCRIBE (Mid: 1, Topic: sensor/#, QoS: 1)
Client mosqsub|19324-Zeus- received SUBACK
Subscribed (mid: 1): 1

在Mosquitto上发布消息:

mosquitto_pub -t "sensor/1/temperature" -m "37.5" -d -h 192.168.1.101 -q 1
Client mosqpub|19325-Zeus- sending CONNECT
Client mosqpub|19325-Zeus- received CONNACK
Client mosqpub|19325-Zeus- sending PUBLISH (d0, q1, r0, m1, 'sensor/1/temperature', ... (4 bytes))
Client mosqpub|19325-Zeus- received PUBACK (Mid: 1)
Client mosqpub|19325-Zeus- sending DISCONNECT

在’emqx1’上应能收到该消息:

Client mosqsub|19324-Zeus- received PUBLISH (d0, q1, r0, m1, 'sensor/1/temperature', ... (4 bytes))
Client mosqsub|19324-Zeus- sending PUBACK (Mid: 1)
37.5

测试桥接的 in 方向

在 Mosquitto上订阅 ‘control/#’ 主题,该主题将接收到 EMQ X 上发布的消息:

$ mosquitto_sub -t "control/#" -p 1883 -d -q 1 -h 192.168.1.101
Client mosqsub|19338-Zeus- sending CONNECT
Client mosqsub|19338-Zeus- received CONNACK
Client mosqsub|19338-Zeus- sending SUBSCRIBE (Mid: 1, Topic: control/#, QoS: 1)
Client mosqsub|19338-Zeus- received SUBACK
Subscribed (mid: 1): 1

在 'emqx1’上发布消息,消息将在 ‘emqx1’ 集群中传递,同时桥接到 Mosquitto 本地:

$ mosquitto_pub -t "control/1" -m "list_all" -d -h 192.168.1.100 -q 1
Client mosqpub|19343-Zeus- sending CONNECT
Client mosqpub|19343-Zeus- received CONNACK
Client mosqpub|19343-Zeus- sending PUBLISH (d0, q1, r0, m1, 'control/1', ... (8 bytes))
Client mosqpub|19343-Zeus- received PUBACK (Mid: 1)
Client mosqpub|19343-Zeus- sending DISCONNECT

在 Mosquitto上应能收到该消息:

Client mosqsub|19338-Zeus- received PUBLISH (d0, q1, r0, m2, 'control/1', ... (8 bytes))
Client mosqsub|19338-Zeus- sending PUBACK (Mid: 2)
list_all


推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
author-avatar
瑶瑶bao呗
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有