我尝试使用M2MQTT库将MQTT消息发送到Azure IoT Hub。我已按照此处的指导IoT Hub MQTT support为该文章的本机MQTT部分提供了正确的连接参数等。
我使用以下代码成功连接(CONNACK返回值0):
_publishClient = new MqttClient(_hostName, 8883, true, null, null,MqttSslProtocols.TLSv1_2);
_publishClient.MqttMsgPublished += _client_MqttMsgPublished;
_publishClient.ConnectionClosed += _client_ConnectionClosed;
var connack = _publishClient.Connect(_publishDeviceId, string.Format("{0}/{1}",
_hostName, _publishDeviceId), _publishSas,true,3600);
但是一旦我发布了一个发布呼叫(其中deviceid是我的设备ID):
var pubresult = _publishClient.Publish("/devices/{deviceid}/messages/events/", Encoding.UTF8.GetBytes("Hello"), MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE, false);
M2MQTT断开连接并引发OnConnectionClosed事件,并且消息永远不会传递到Azure IoT Hub。
我已尝试单步执行M2MQTT MqttClient类代码,并且断开连接来自ReceiveThread,其中的注释听起来像是关闭连接的Azure IoT Hub端:
// zero bytes read, peer gracefully closed socket
else
{
// wake up thread that will notify connection is closing
this.OnConnectionClosing();
}
如果有人对它为什么关闭或如何排除故障有任何想法,那么我的所有耳朵/眼睛都是。
答案 0 :(得分:2)
您可能希望删除发布主题字符串中的第一个“/”,而不是
var pubresult = _publishClient.Publish("/devices/{deviceid}/messages/events/", Encoding.UTF8.GetBytes("Hello"), MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE, false);
使用
var pubresult = _publishClient.Publish("devices/{deviceid}/messages/events/", Encoding.UTF8.GetBytes("Hello"), MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE, false);
这是page的建议,对我有用。
答案 1 :(得分:0)
我没有使用m2mqtt库,但是Paho C库和我遇到了同样的问题。 直到成功将消息发布成功发布到物联网中心后,我才在用户名中指定了最新的API版本。
在我的情况下,用户名为:click()
我在这里偶然发现了此问题及其解决方法:https://blog.baeke.info/2017/05/16/iot-hub-device-twin-and-mqtt/
在Microsoft文档中找不到有关此问题的任何信息