无法将云到设备消息发送到 Azure IoT 中心

Posted

技术标签:

【中文标题】无法将云到设备消息发送到 Azure IoT 中心【英文标题】:Not able to send Cloud to Device Message to Azure IoT hub 【发布时间】:2022-01-14 01:58:47 【问题描述】:

所以,我正在尝试使用 Python 将消息发送到 Azure IoT 中心。我正在关注this 文档,但是当我运行脚本时:

from azure.iot.hub import IoTHubRegistryManager

RECEIVED_MESSAGES = 0

CONNECTION_STRING = "<IoT Hub Connection String>"
DEVICE_ID = "<IoT Edge Device ID>"

def iothub_messaging_sample_run():
    
    # Create IoTHubRegistryManager
    registry_manager = IoTHubRegistryManager(CONNECTION_STRING)
    i = 0

    while True:
        i += 1
        print(f'Sending message: i')
        data = f'NodeId : Nodei, Message : Messagei'
        registry_manager.send_c2d_message(DEVICE_ID, data)

if __name__ == '__main__':
    print('Starting the Python IoT Hub C2D Messaging service sample...')

    iothub_messaging_sample_run()

它首先打印这个: Sending message: 1 然后抛出这个错误: Exception: C2D message send failure 其余错误日志不包含任何其他信息,仅包含对 Azure IoT 中心包文件的引用。

我已经在防火墙上启用了Inbound Port 8883,但我仍然无法将数据发送到 Azure IoT Hub。

配置:

Python 版本 - 3.7.3 包 - azure-iot-hub==2.6.0 操作系统 - Windows 10 家庭版 IoT 中心 - 标准层 S1 Azure 订阅 - Azure 学生版 IoT 中心单元数量 - 1 IoT 中心位置 - 美国东部 最低 TLS 版本 - 1.0 设备数量 - 1(IoT Edge 设备)

【问题讨论】:

【参考方案1】:

通过链接的教程工作,我注意到您的实现完全不同。尽管如此,当我复制您的代码时,它确实可以在我的机器上运行,但我知道有两个原因会导致此错误:

    您输入了错误的设备 ID。 设备的 C2D 队列已满。 C2D 消息队列有 50 条消息的限制。确保您的设备(或教程中的设备 Python 文件)正在侦听清空队列。您的代码没有延迟,因此您可以在几秒钟内填满队列,下次启动程序时,它可能会在收到第一条消息时崩溃。

我还注意到你写道:

DEVICE_ID = "<IoT Edge Device ID>"

Azure IoT Edge 设备不支持 C2D 消息,虽然不会导致错误,但您将无法在设备上接收消息。

【讨论】:

所以这个过程不能在我的 IoT 中心的 Azure IoT 设备和相当简单的设备上执行? 相反,只能在 Azure IoT 设备上执行。只是不是Azure IoT Edge 设备。

以上是关于无法将云到设备消息发送到 Azure IoT 中心的主要内容,如果未能解决你的问题,请参考以下文章

Azure IoT 中心 - 使用 IoT 中心将文件从 Azure blob 下载到 IoT 设备

如何通过azure设备配置服务从azure功能向iot设备发送自定义错误消息?

Azure 流分析错误:无法反序列化来自 IOT 中心的输入事件

Azure IoT 技术研究系列2-设备注册到Azure IoT Hub

Azure IoT Hub 十分钟入门系列 - 使用模拟设备发送设备到云(d2c)的消息

我如何知道我在 Azure IoT Hub 中的设备是不是可以访问?