有关EMQX桥接的配置工作

2023-11-10

前言

桥接是一种连接多个 EMQ X 或者其他 MQTT 消息中间件的方式。不同于集群,工作在桥接模式下的节点之间不会复制主题树和路由表。桥接模式所做的是:

  • 按照规则把消息转发至桥接节点;
  • 从桥接节点订阅主题,并在收到消息后在本节点/集群中转发该消息。

环境:

emqx1 | v4.1.2 | 192.168.5.207:2883 | 节点node
emqx2 | v3.1.1 | 192.168.5.209:2883 | 远程broker

用Docker在两个服务器上面各自跑了一个emqx的容器,暴露在宿主机的端口分别都是2883;

桥接

前提

使用桥接方式之前,需要了解到的一点是,基于Docker的运行方式,如果需要使用桥接的功能,那么需要修改emqx.conf文件,该文件在容器的具体目录为/opt/emqx/etc/emqx.conf,需要挂载该文件出来,但是EMQX版本需要大于v3.1.1,如果处于并且小于这个版本,那么是无法挂载该文件的,这是emqx的一个bug,也即是在v3.1.2才可以挂载emqx.conf文件,所以我们用了当前最新的v4.1.2版本;

该版本有关桥接部分的配置已被插件化,所以需要挂载另一个配置文件进行配置,容器内的/opt/emqx/etc/plugins/emqx_bridge_mqtt.conf文件需要被挂载;

docker-compose.yml文件配置如下所示:

volumes:
      - ./mqtt/volumes/plugins/emqx_bridge_mqtt.conf:/opt/emqx/etc/plugins/emqx_bridge_mqtt.conf
      - ./mqtt/volumes/data/loaded_plugins:/opt/emqx/data/loaded_plugins

emqx_bridge_mqtt.conf文件在容器中的具体位置如图所示:

在这里插入图片描述

emqx_bridge_mqtt.conf文件内容如下:

##====================================================================
## Configuration for EMQ X MQTT Broker Bridge
##====================================================================

##--------------------------------------------------------------------
## Bridges to aws
##--------------------------------------------------------------------

## Bridge address: node name for local bridge, host:port for remote.
##
## Value: String
## Example: emqx@127.0.0.1,  127.0.0.1:1883
## 修改要转发到哪个服务器上
bridge.mqtt.aws.address = 192.168.5.209:2883

## Protocol version of the bridge.
##
## Value: Enum
## - mqttv5
## - mqttv4
## - mqttv3
bridge.mqtt.aws.proto_ver = mqttv4

## Start type of the bridge.
##
## Value: enum
## manual
## auto
bridge.mqtt.aws.start_type = manual

## Whether to enable bridge mode for mqtt bridge
##
## This option is prepared for the mqtt broker which does not
## support bridge_mode such as the mqtt-plugin of the rabbitmq
##
## Value: boolean
bridge.mqtt.aws.bridge_mode = true

## The ClientId of a remote bridge.
##
## Value: String
bridge.mqtt.aws.clientid = bridge_aws

## The Clean start flag of a remote bridge.
##
## Value: boolean
## Default: true
##
## NOTE: Some IoT platforms require clean_start
##       must be set to 'true'
bridge.mqtt.aws.clean_start = true

## The username for a remote bridge.
##
## Value: String
bridge.mqtt.aws.username = user

## The password for a remote bridge.
##
## Value: String
bridge.mqtt.aws.password = passwd

## Topics that need to be forward to AWS IoTHUB
##
## Value: String
## Example: topic1/#,topic2/#
bridge.mqtt.aws.forwards = topic1/#,topic2/#

## Forward messages to the mountpoint of an AWS IoTHUB
##
## Value: String
#这一句最好注释,不注释的话自己解决转发不成功的问题
#bridge.mqtt.aws.forward_mountpoint = bridge/aws/${node}/

## Need to subscribe to AWS topics
##
## Value: String
 bridge.mqtt.aws.subscription.1.topic = get/#

## Need to subscribe to AWS topics QoS.
##
## Value: Number
 bridge.mqtt.aws.subscription.1.qos = 1

## A mountpoint that receives messages from AWS IoTHUB
##
## Value: String
## bridge.mqtt.aws.receive_mountpoint = receive/aws/


## Bribge to remote server via SSL.
##
## Value: on | off
bridge.mqtt.aws.ssl = off

如果不知道怎么修改的情况下,那么直接把bridge.mqtt.aws.address的地址和mqtt的远程端口修改为你需要转发的地址和端口,如207服务器的mqtt broker是作为转发节点的,209是作为接收端的mqtt broker,那么就填入bridge.mqtt.aws.address = 192.168.5.209:2883(这里的209的mqtt端口我使用的是2883,默认是1883)

## Bridge address: node name for local bridge, host:port for remote.
##
## Value: String
## Example: emqx@127.0.0.1,  127.0.0.1:1883
bridge.mqtt.aws.address = 192.168.5.209:2883

设置需要转发的topic,转发topic1和topic2主题,也就是任何一个向207发布topic1主题和topic2主题的mqtt消息都会转发到209mqtt broker去;

这里需要注意一个点,就是mountpoint配置,该配置在官网介绍是作为一个消息发布的主题前缀信息来配置的,但是这里测试的时候发现如果这句配置不注释,那么转发会不成功;

向209订阅主题,如有人向209的主题发布消息,那么207broker相应的也会收到消息并发布给向207订阅了该主题的对象,这里207向209订阅了test/#主题,qos为1;

## Topics that need to be forward to AWS IoTHUB
##
## Value: String
## Example: topic1/#,topic2/#
bridge.mqtt.aws.forwards = topic1/#,topic2/#

## Forward messages to the mountpoint of an AWS IoTHUB
##
## Value: String
#bridge.mqtt.aws.forward_mountpoint = bridge/aws/${node}/

## Need to subscribe to AWS topics
##
## Value: String
 bridge.mqtt.aws.subscription.1.topic = test/#

## Need to subscribe to AWS topics QoS.
##
## Value: Number
 bridge.mqtt.aws.subscription.1.qos = 1

## A mountpoint that receives messages from AWS IoTHUB
##
## Value: String
## bridge.mqtt.aws.receive_mountpoint = receive/aws/

配置文件启动插件(loaded_plugins)

说完emqx_bridge_mqtt.conf,我们来看看loaded_plugins文件,默认启动emqx的时候,emqx_bridge_mqtt插件是不启动的,需要在控制面板中的插件那里点击启动才行,如何使其在启动emqx启动的时候,bridge插件随之启动呢,我们在emqx.conf配置文件中找到这段一个配置,有关插件的,这里提示,插件自启动的配置在/opt/emqx/data/loaded_plugins这里,如图:
在这里插入图片描述

然后修改loaded_plugins文件,将emqx_bridge_mqtt的自启动设置为true即可
在这里插入图片描述

将emqx_bridge_mqtt的自启动设置为true之后,运行容器的时候,该插件就默认启动了,如果没有修改该配置的话,那么就得进入emqx的控制台界面去自己启动该插件,每一次都要人为启动的话,效率不高,所以这里设置了自启动,以下截图为控制台启动该插件的图示:在这里插入图片描述

启用配置好的桥接网络

bridge插件启动之后,还得进入容器对已配置好的桥接网络进行启动,这里就不进入容器内操作了,直接宿主机执行容器内指令,如下操作:在这里插入图片描述

容器外执行容器内指令,可使用docker的exec指令。emqx是可以在配置文件里面配置多个桥接网络的,通过bin目录下面的emqx_ctl可以查询配置了哪些桥接网络,还可以启动配置好的桥接网络,转发的主题和订阅的主题等操作;

# 查询配置了哪些桥接网络
docker exec emqx /bin/sh -c "bin/emqx_ctl bridges list"
# 启动配置好的aws桥接网络
docker exec emqx /bin/sh -c "bin/emqx_ctl bridges start aws"
# 查询已启动的aws桥接网络转发的主题
docker exec emqx /bin/sh -c "bin/emqx_ctl bridges forwards aws"
# 查询已启动的aws桥接网络订阅的主题
docker exec emqx /bin/sh -c "bin/emqx_ctl bridges subscriptions aws"

测试桥接网络

通过图示描述,如下图手绘所示:在这里插入图片描述

  • fx1:mqttfx客户端,向207服务器订阅sub主题,推送to1和to2主题到207服务器;
  • 207服务器:转发任何客户端push过来的to1、to2主题的消息到209服务器,向209服务器订阅sub主题,接收209服务器推送过来的sub主题,向那些订阅了sub主题的客户端推送sub主题;
  • 209服务器:接收207服务器转发过来的to1、to2主题的消息,向所有订阅了sub主题的客户端推送消息,向所有订阅了to1、to2主题的客户端推送消息;
  • fx2:mqttfx客户端,向209服务器订阅to1、to2主题,推送sub主题;

如上述过程无异常,即为测试成功;

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

有关EMQX桥接的配置工作 的相关文章

  • Docker 未知标志 --mount

    我想使用 mount 将目录从主机挂载到容器flag over volume但我得到 这仅在使用安装标志时才会出现 而不是在使用卷时出现 Command docker run d it name devtest mount type bin
  • yum update / apk update / apt-get update 在代理后面不起作用

    我使用代理 无法构建 Docker 映像 我尝试过FROM ubuntu FROM centos and FROM alpine but apt get update yum update apk update failed 我的主机操作系
  • java.library.path 中没有字体管理器

    以下代码在我的桌面上运行得很好 BufferedImage image new BufferedImage width height BufferedImage TYPE INT RGB Graphics g image getGraphi
  • 为什么 docker-compose ps 与 docker ps 不同?

    为什么 docker compose 创建的容器只能从 docker compose ps 访问 并且在杀死正在运行的容器后仍然存在 事实并非如此 docker ps只显示正在运行的容器 docker compose ps显示与当前撰写文件
  • 如何访问docker镜像?

    我试图在不运行的情况下访问 docker 映像 我只想知道它包含什么内容以进行验证 我无法 ssh 进入容器 因为它会在一秒钟内结束 所以我需要探索图像而不是容器 或者 在完成之前是否可以访问容器 明白了 命令如下 docker run i
  • 如何在 kubernetes 中传递命令行参数?

    需要在 pod yaml 中传递 docker 容器 appContainer1 和 appContainer2 的命令行参数 pod yaml apiVersion v1 kind Pod metadata name microservi
  • 如何在 Mac 上升级 Docker? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我尝试了 docker machine升级 并做了一些工作 但我似乎没有最新的 CLI 如果我执行 docker 版本 我会得到 Clie
  • 使用 docker stack 部署主机环境变量

    我想知道是否有一种方法可以使用从部署容器的主机获取的环境变量 而不是从容器所在的主机获取的环境变量docker stack deploy命令被执行 例如想象以下docker compose yml在三节点 Docker Swarm 集群上启
  • Azure Web 应用程序中 Docker 中的 Laravel 无法从已安装的文件存储中提供图像

    我有一个 azure web 应用程序 带有一个运行 apache 的自定义容器 带有 laravel 的 php 7 4 和一个安装的 azure 文件存储 从已安装的存储提供 png 文件确实适用于我在 docker 桌面中的本地构建
  • Docker 错误:无法找到包 git

    我正在使用图像nginx这是基于dockerfile ubuntu 连接到 docker 容器的 shell docker exec it
  • 启动 docker 容器时向主机 /etc/hosts 文件添加条目

    我希望能够将主机名添加到映射到 docker 容器的笔记本电脑 etc hosts 中 由于容器 ip 不是静态的 因此我启动 重新启动容器的每个站点都需要手动更新 etc hosts 文件 这不太实用 我正在寻找一种简单的方法来解决这个问
  • 是否可以对不同的服务使用不同的 .env?

    我遇到一种情况 最好有多个 env 文件 每个 env 文件对应 docker compose yml 中的每个服务 有什么方法可以指定要使用的不同文件名吗 这可以在个人服务层面上做到吗 我尝试使用env file不幸的是 这设置了在 Do
  • JFrog Artifactory 将什么令牌端点用于其 Docker 注册表?

    我正在尝试编写基本上可以执行以下操作的代码docker inspect发布到私人 JFrog Artifactory 的图像 而无需自己实际提取图像 我一直在使用一个名为在不拉取的情况下检查 Docker 镜像 https ops tips
  • 如何从 ubuntu 14.04 中完全删除 docker

    我不久前在 Ubuntu 上安装了 Docker 但是当我尝试删除时 Docker 仍然存在于系统中 我跟着这个https stackoverflow com a 31313851 2340159 https stackoverflow c
  • 在azure应用程序服务中使用docker-compose

    我的平均堆栈代码在 docker compose 配置中工作 如果我跑docker compose up在我的电脑上 然后我可以成功登录我的应用程序localhost如果转到应用程序服务并单击 docker compose 预览选项并上传我
  • APT:Post-Invoke 在 debian:bookworm-slim 上失败

    我有一个 Jenkins 管道 它使用docker dind 20 在这个过程中我做 FROM ruby 3 2 slim bookworm apt get update 当我尝试使用我的本地构建映像 MacOS ventura 时dock
  • 如何在多个端口上运行 FastAPI 应用程序?

    我有一个 FastAPI 应用程序 正在使用 Uvicorn 以编程方式在端口 30000 上运行 现在我也想在端口 8443 上运行相同的应用程序 相同的应用程序需要在这两个端口上运行 我怎样才能在Python代码中做到这一点 最小可重现
  • nginx docker 容器:502 错误网关响应

    我有一个服务监听 8080 端口 这不是一个容器 然后 我使用官方镜像创建了一个 nginx 容器 docker run name nginx d v root nginx conf etc nginx conf d p 443 443 p
  • 运行命令后存在来自 rocker/r-ver:4.0.4 的容器

    这是我的 Dockerfile FROM rocker r ver 4 0 4 在 cmd 中我构建 docker build t myfolder myimage 它塑造的形象很好 然后我跑 docker run myfolder myi
  • 使用反向代理进行过多重定向

    Setup 云flare DNS docker 撰写 nginx 反向代理 WordPress 的 fpm Nginx PHP 处理程序 Problem 重定向太多 如以下日志所示 Attaching to wp db wp wp web

随机推荐

  • 【Linux系统编程(二)】Linux文件IO操作

    文章目录 Linux文件IO操作 1 系统调用 2 系统调用和库函数的区别 3 C库中IO函数工作流程 4 文件描述符 4 1 文件描述符表是如何管理文件描述符的呢 4 2 查看当前系统文件描述最大数量 5 文件IO的操作 5 1 open
  • 关于split(String agrex)

    split a b c 得到 a b c a b c 得到 a b c 前面的空格一个都不会省略 a b c 得到 a b c 中间空格省略一个 后缀的空格全部省略 不是以空格而是以某个String为划分依据时 现象相同 split a a
  • 2021-06-22安装docker-ce

    安装docker ce Docker 支持以下的 64 位 CentOS 版本 CentOS 7 CentOS 8 更高版本 使用官方安装脚本自动安装 安装命令如下 curl fsSL https get docker com bash s
  • VUE问题汇总(一)

    vue的起步教程与api https cn vuejs org v2 guide vue组件库 https element eleme cn zh CN component installation 1 解决vue中时间控件中获取时间少一天
  • 前端三大框架(vue、react、angular)对比(一)

    官网 vue https cn vuejs org react https react docschina org angular https angular cn 三者总体介绍 都是MVVM 从后端的MVC衍生 类型的框架 基本都用于构建
  • 时序数据库timescaleDB安装

    参考链接 时序数据库timescaleDB安装 http www lwops cn thread 300 1 1 html 本环境在Centos7 5采用编译安装的方式 主要介绍PostgreSQL 11 7 TimescaleDB 1 6
  • 机器学习理论笔记(一):初识机器学习

    文章目录 1 前言 蓝色是天的机器学习笔记专栏 1 1 专栏初衷与定位 1 2 本文主要内容 2 机器学习的定义 2 1 机器学习的本质 2 2 机器学习的分类 3 机器学习的基本术语 4 探索 没有免费的午餐 定理 NFL 5 结语 1
  • tkinter控件样式

    文章目录 以按钮为例 共有参数 动态属性 tkinter系列 GUI初步 布局 绑定变量 绑定事件 消息框 文件对话框 控件样式 扫雷小游戏 强行表白神器 以按钮为例 tkinter对控件的诸多属性提供了可定制的功能 下面以最常用的按钮作为
  • 学习 Spring Boot:(二十九)Spring Boot Junit 单元测试

    前言 JUnit 是一个回归测试框架 被开发者用于实施对应用程序的单元测试 加快程序编制速度 同时提高编码的质量 JUnit 测试框架具有以下重要特性 测试工具 测试套件 测试运行器 测试分类 了解 Junit 基础方法 加入依赖 在 po
  • Eclipse中的checkstyle插件

    一 Checkstyle工具 Checkstyle是一款检查Java程序源代码样式的工具 它可以有效的帮助我们检视代码以便更好的遵循代码编写标准 官方地址 http checkstyle sourceforge net 二 在Eclipse
  • PPT模板

    http www officeplus cn List shtml cat PPT tag 1
  • CH3-Android常见界面控件

    目标 掌握简单控件的使用 能够独立搭建一个注册界面 掌握ListView控件与RecyclerView控件的使用 能独立搭建列表界面 掌握自定义控件的定义方式 能够自定义一个简单的控件 几乎每一个Android应用都是通过界面控件与用户交互
  • Linux--多线程(1)

    目录 一 概念 二 理解 三 创建 退出 合并进程 man pthread create Compile and link with pthread 1 为什么没有fun函数 2 加上sleep来改进 3 线程结束会不会影响主线程运行 4
  • Java应用调试利器——BTrace教程

    http www jianshu com p 26f19095d396 背景 生产环境中可能出现各种问题 但是这些问题又不是程序error导致的 可能是逻辑性错误 这时候需要获取程序运行时的数据信息 如方法参数 返回值来定位问题 通过传统的
  • ZRANGEBYSCORE

    ZRANGEBYSCORE key min max WITHSCORES LIMIT offset count 返回有序集 key 中 所有 score 值介于 min 和 max 之间 包括等于 min 或 max 的成员 有序集成员按
  • Python Tkinter详解 (四)文本输入框的使用

    同样的 我们先创建出一个最最最最最简单的输入框 我们在进行信息交互的时候 会经常使用输入框为我们的系统键入信息 那么他又有哪些属性呢 import tkinter as tk window tk Tk tk Entry window wid
  • STM32 基础系列教程 20 - RTC

    前言 学习stm32 RTC 实时时钟 的使用 学会用RTC实现钟表功能 示例详解 基于硬件平台 STM32F10C8T6最小系统板 MCU 的型号是 STM32F103c8t6 使用stm32cubemx 工具自动产生的配置工程 使用KE
  • 二叉树的相关列题!!

    对于二叉树 很难 很难 笔者也是感觉很难 虽然能听懂课程 但是 对于大部分的练习题并不能做出来 所以感觉很尴尬 因此 笔者经过先前的那篇博客 已经开启了大脑奇迹 现在还热乎着 刚刚的更文 二叉树讲解https blog csdn net w
  • OC学习篇之---类的延展

    前一篇文章我们介绍了类的类目概念和使用 http blog csdn net jiangwei0910410003 article details 41775329 那么这篇文章我们继续来介绍一下OC中的一个特性 延展 其实说白了 延展就是
  • 有关EMQX桥接的配置工作

    前言 桥接是一种连接多个 EMQ X 或者其他 MQTT 消息中间件的方式 不同于集群 工作在桥接模式下的节点之间不会复制主题树和路由表 桥接模式所做的是 按照规则把消息转发至桥接节点 从桥接节点订阅主题 并在收到消息后在本节点 集群中转发