3

我正在尝试使用 M2MQTT 库将 MQTT 消息发送到 Azure IoT 中心。我已按照此处的指南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 中心。

我尝试通过 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();
}

如果有人对它关闭的原因或如何进行故障排除有任何想法,我全神贯注。

4

2 回答 2

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);

这是此页面上的建议,适用于我。

于 2016-07-18T15:35:21.237 回答
1

我没有使用 m2mqtt 库,而是 Paho C 库,我遇到了同样的问题。直到我在用户名中指定了最近的 API 版本,才成功将消息发布到 IoT Hub。

在我的情况下,用户名是:<iothubname>/<deviceid>/api-version=2016-11-14

我在这里偶然发现了这个问题及其解决方法:https ://blog.baeke.info/2017/05/16/iot-hub-device-twin-and-mqtt/

在 Microsoft 文档中找不到有关此问题的任何内容

于 2019-11-20T13:38:12.833 回答