EMQX创建MQTT连接器如何自定义clientID

我希望能将EMQX通过MQTT连接器与阿里物联网平台连接,但鉴权过程需要clientID的参与,似乎连接器配置中没有办法配置clientID,请问一下有办法配置吗?

你好,目前 MQTT 桥接的 Client ID 是我们内部根据节点名称、资源的名称生成的。具体可以参考代码

https://github.com/emqx/emqx/blob/dbe2baa4057aa0215501c003b0a56761bee07fac/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt_connector.erl#L436-L441

https://github.com/emqx/emqx/blob/dbe2baa4057aa0215501c003b0a56761bee07fac/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt_lib.erl#L27-L28

那就是目前没有办法自定义桥接的ClientID了吗

是的,暂不支持的。
由于底层我们有多个连接池、并且 EMQX 还可能有多个节点。所以,这些所有的客户端都使用同一个 ClientID 可能是不太正确的。

你那边如果要对接阿里云,对 Client ID 有什么样需求么?我感觉我们可以讨论,如果有必要可以在 EMQX 这边新增特性来完成

非常感谢您的回答,阿里云物联网平台这边的连接的clientID需要包含以下几个内容:ProductKey(阿里云提供),DeviceName(阿里云提供),剩下就是securemode=2,signmethod=hmacsha256,timestamp=1706601044427|

我记得,这个是他们物联网平台接设备的时候对设备的要求?而不是那种平台的级别 MQTT 消息服务。

这种格式的要求,看起来应用到 emqx 上的 MQTT 桥接感觉有点复杂。这相当于是需要完全的指定 Client ID 这个字符串了

CC @wivwiv 进行需求评估

我这边更换了mosquitto之后桥接配置齐全是可以连接上的

公有云的物联网平台(或者说所有 MQTT Broker)要求客户端 ID 是唯一的,否则会产生客户端之间的互踢问题。

EMQX 通常是通过集群部署,几个节点会使用相同的客户端 ID 连接造成互踢,所以 MQTT 桥接中没有开放固定设置客户端 ID 的选项。

我们计划在未来增加独享连接的支持,一个集群中的所有节点只会使用一个客户端连接。


目前没有太好的办法进行绕过,如果具有自己编译 EMQX 的能力,@heeejianbo 可以指导一下 v5.5.0 中怎么把后缀去掉编译一个自己的版本。
另外项目允许的话也可以尝试一下 NanoMQ,它也是单节点运行的。

  1. MQTT 连接器中连接池设置为 1
  2. 单节点模式部署


这方面的问题我理解了,感谢您的解答。我看了一眼NanoMQ的文档,似乎这个桥接配置也没有clientID的设置?

这个列的更全
https://nanomq.io/docs/en/latest/config-description/bridges.html