M2MQTT在发布时与Azure IoT中心断开连接

时间:2016-07-17 16:04:37

标签: azure mqtt azure-iot-hub

我尝试使用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();
}

如果有人对它为什么关闭或如何排除故障有任何想法,那么我的所有耳朵/眼睛都是。

2 个答案:

答案 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文档中找不到有关此问题的任何信息