将mosquito broker与Azure IoT Hub桥接时意外重置连接



我正试图与Azure IoT Hub建立一座桥梁。蚊子桥的配置如下:

connection Azure
address <my_hub_name>.azure-devices.net:8883
# error | information | notice | warning | all | debug
log_dest stdout
log_type all
## Auth Info
remote_username <my_hub_name>.azure-devices.net/<my_dev_name>/?api-version=2018-06-30
remote_password <SAS>
remote_clientid <my_dev_name>
bridge_cafile cert.pem
## some config
try_private false
cleansession true
start_type automatic
bridge_insecure false
bridge_protocol_version mqttv311
bridge_tls_version tlsv1.2
notifications false
## Topics
topic devices/<my_dev_name>/messages/events/# out

我得到以下输出:

Opening ipv6 listen socket on port 1883.
Bridge local.<my_dev_name> doing local SUBSCRIBE on topic devices/<my_dev_name>/messages/events/#
Connecting bridge Azure (<my_hub_name>.azure-devices.net:8883)
Bridge <my_dev_name> sending CONNECT
Received CONNACK on connection local.<my_dev_name>.
Bridge local.<my_dev_name> sending UNSUBSCRIBE (Mid: 1, Topic: devices/<my_dev_name>/messages/events/#)
Received UNSUBACK from local.<my_dev_name>
Socket error on client local.<my_dev_name>, disconnecting.
Bridge local.<my_dev_name> doing local SUBSCRIBE on topic devices/<my_dev_name>/messages/events/#
Connecting bridge Azure (<my_hub_name>.azure-devices.net:8883)
Bridge <my_dev_name> sending CONNECT
Received CONNACK on connection local.<my_dev_name>.
Bridge local.<my_dev_name> sending UNSUBSCRIBE (Mid: 1, Topic: devices/<my_dev_name>/messages/events/#)
Received UNSUBACK from local.<my_dev_name>
Socket error on client local.<my_dev_name>, disconnecting.
...

Wireshark显示,由于未知原因,Azure向我发送了一个设置了FIN位的数据包,结果导致连接重置。

同时,mosquitto_pub能够发送具有相同参数(主机、用户名、密码(的数据包。实用程序mosquitto_sub也可以正常工作,但不会接收mosquitto_pub发布的任何消息。

花了几天时间试图找出正确的配置,但没有成功(当然,包括在stackoverflow上搜索(。如有任何提示,我将不胜感激。

据我所知,以前没有人能连接到我们的物联网中心,所以创建的中心可能存在问题。不幸的是,learn.microsoft.com看起来更像是一种探索,而不是一种帮助。编辑:将配置中的主题参数从";在";至";输出";。

根据注释推断。

问题是,这两个网桥将生成相同的客户端id。

客户端ID需要在连接到代理的所有客户端中都是唯一的。如果第二个客户端与同一个客户端id连接,规范规定代理必须断开第一个客户端的连接。

然后,断开连接的客户端尝试重新连接,这导致另一个代理被踢开,然后开始一个反馈循环,每个客户端在重新连接时踢开另一个。

几乎所有的连接错误都通过准确设置证书和代理配置来解决。除了一个及其描述如下。我们用上面的凭据(证书、SAS登录名/密码/clientid(创建了一个桥-一切都很好。网桥配置有以下主题规则:

topic # both 0 /devices/ devices/<my_dev_name>/messages/events/

如果我向我的本地经纪人发布以下内容:

mosquitto_pub 
-h 10.0.2.15 -p 1883 
-t "/devices/foobar" 
-m "{"foo" : "bar"}" 
-d

一切都很好。但如果我发布一个更长的主题

mosquitto_pub 
-h 10.0.2.15 -p 1883 
-t "/devices/foo/foobar" 
-m "{"foo" : "bar"}" 
-d

我得到连接重置错误:

1607623721: Received PUBLISH from mosq-52yqOrz6C6riwvUUF3 (d0, q0, r0, m0, '/devices/foo/foobar1', ... (16 bytes))
1607623721: Sending PUBLISH to local.<my_dev_name> (d0, q0, r0, m0, 'devices/<my_dev_name>/messages/events/foo/foobar1', ... (16 bytes))
1607623721: Received DISCONNECT from mosq-52yqOrz6C6riwvUUF3
1607623721: Client mosq-52yqOrz6C6riwvUUF3 disconnected.
1607623721: Socket error on client local.<my_dev_name>, disconnecting.

我不明白Azure为什么断开我的桥接。我可以在2-3秒内向主题/devices/foobar发送大约100条消息,而不会有任何抱怨,但只有一条向/devices/foo/foobar发送的消息会立即导致套接字错误。可能有一些限制,但我找不到任何限制,除了一天内的最大消息总数。