将 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
会导致立即出现套接字错误。
可能有一些限制,但我找不到任何限制,除了一天内的最大消息总数。
我正在尝试与 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
会导致立即出现套接字错误。
可能有一些限制,但我找不到任何限制,除了一天内的最大消息总数。