将 mosquitto 代理与 Azure IoT 中心桥接时出现意外连接重置

Unexpected connection reset when bridging mosquitto broker with Azure IoT Hub

我正在尝试与 Azure IoT 中心建立桥梁。 mosquitto bridge配置如下:

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.

发布的任何消息

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

据我所知,以前没有人可以连接到我们的 IoT Hub,所以创建的 Hub 可能存在问题。不幸的是,docs.microsoft.com 看起来更像是一个任务而不是帮助。 已编辑:将配置中的主题参数从“in”更正为“out”。

根据评论推断。

问题是 2 个网桥会生成相同的客户端 ID。

客户端 ID 在连接到代理的所有客户端中必须是唯一的。如果第二个客户端使用相同的客户端 ID 连接,规范说明代理必须断开第一个客户端。

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

几乎所有连接错误都通过准确设置证书和代理配置得到解决。除了一个及其描述如下。 我们使用上述凭据(证书,SAS login/password/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 发出大约一百条消息而没有任何抱怨,但只有一条消息 /devices/foo/foobar 会导致立即出现套接字错误。 可能有一些限制,但我找不到任何限制,除了一天内的最大消息总数。