【问题标题】:Publish with Python to Azure IoT Hub - Subscribe with C# not working使用 Python 发布到 Azure IoT 中心 - 使用 C# 订阅不起作用
【发布时间】:2019-07-30 23:20:54
【问题描述】:

我在设备上使用 M2MQTT Paho Python 库发布如下:

    msg = "POS {} {} {} {} {} {} {}"

    msgtosend=msg.format(tagNum, tagID, x_pos, y_pos, z_pos, qos, unk)
    print(msgtosend)
    # qos=1 - (must be when clean_session is False) 
    mqttinfo=rpiclient.publish("dwm/position", msgtosend, 1) 
    if mqttinfo.rc != 0:
        print("Publishing message with ID {) failed. Error Code={}".format(mqttinfo.mid, mqttinfo.rc))

然后,我尝试使用 M2MQTT C# 库(成功连接到 Azure IoT Hub 后)再次读取 C# 应用程序中的数据,如下所示:

    tpc[0] = "devices/MasterTag/messages/devicebound/#";
    tpc[1] = "$iothub/twin/PATCH/properties/desired/#";
    tpc[2] = "$iothub/methods/POST/#";
    tpc[3] = "$iothub/twin/res/#";

    mqttClient.Subscribe(tpc, qosArray);

其中 qosArray 只有一项,它是 0 或 1。 ...然而,我没有收到任何消息。事实上,我的回调 MqttClient_MqttMsgSubscribed 也没有被调用,这意味着订阅不成功,但我没有收到错误消息或异常......

【问题讨论】:

  • 我建议阅读hivemq.com/blog/mqtt-client-library-encyclopedia-m2mqtt 以了解使用 C# 的 M2Mqtt - MQTT 客户端库。
  • 我很熟悉。这不是我正在做的第一个经纪人类型。我为 Raspi 上的 Mosquitto Broker 和 CloudMQTT 上的 Mosquitto 提供了完整的解决方案。这完全取决于代理本身以及他们使用/要求的身份验证差异。 Azure IoT Hub 和 AWS IoT 的文档和解释不够清楚,尤其是微软,它总是必须特别和更好......就像在这种情况下,它几乎是博士如何发布主题......
  • 顺便说一句。 Azure IoT 中心不是通用通信代理。对于您的实施问题:M2MQTT 客户端是第 3 方库,推荐的文档显示了如何使用 C# 订阅主题,并且客户端连接的位置无关紧要。换句话说,在您的示例中,qosArray 必须有 4 个项目并且不依赖于 Azure IoT Hub,您必须遵循 M2MQTT 客户端 API,例如我推荐的文档。
  • 您的 rpiclient(发布者)和 mqttClient(订阅者)是 Azure IoT Hub 中的不同设备吗?请注意,MQTT 协议是一个面向连接的协议,Azure IoT 中心不支持同一 iot 中心命名空间内的同一 deviceId 的多个 MQTT 连接。换句话说,第二个连接将断开第一个连接。
  • 我的发布者是在 Raspi 上运行的 M2MQTT Paho Python,它通过串行从设备获取数据并尝试将其推送到 Azure IoT Hub(或其他选择的服务)。订阅者是在 Win10 笔记本电脑上运行的完整 C# 应用程序。此时,我在 Raspi 上有一个单独的 python 脚本,它充当每个大型服务的发布者(CloudMQTT 工作,Azure IoT Hub 和 AWS IoT 还没有,Google 稍后)。我的 C# 应用程序托管多个 Mqtt 客户端(按需),每个客户端都在需要时连接到不同的服务,同时...顺便说一句,我将尝试使用 QOS 提出您的建议...

标签: c# python-3.x publish-subscribe azure-iot-hub


【解决方案1】:

尝试以下修复:

tpc = new string[] { 
    "devices/MasterTag/messages/devicebound/#",
    "$iothub/twin/PATCH/properties/desired/#",
    "$iothub/methods/POST/#", 
    "$iothub/twin/res/#"
    };

qosArray = new byte[] { 
    MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE, 
    MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE, 
    MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE,
    MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE
   };

var subCode = mqttClient.Subscribe(tpc, qosArray); 

【讨论】:

  • 尝试了上面的方法:结果是一样的——没有错误/异常,回调没有被调用。顺便说一句,返回值为 1。显然没有收到来自 Azure 的数据消息。
  • 我想我知道发生了什么——尽管我的软件中的 GUI 指示器显示已连接,但我刚刚检查了 mqttClient 对象并且 IsConnected 值为 false。所以之前的连接代码不起作用..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 2018-12-26
  • 1970-01-01
相关资源
最近更新 更多