【问题标题】:Azure IoTHub python sdkv2 connection issueAzure IoT 中心 python sdk v2 连接问题
【发布时间】:2023-03-16 18:19:01
【问题描述】:

我想使用 Python 中的 IotHub sdkv2 在我的 Rpi4 设备与 IoTHub Owner(不是 IOTHub 设备)之间建立稳定的连接。

在 Azure IoTHub sdk1 中,iothub_service_client 的类 (IotHubMessaging) 用于在 IoTHub Owner 和提供稳定连接的设备之间建立连接。

from iothub_service_client import IoTHubMessaging, IoTHubMessage, IoTHubError

但在较新的 IotHub sdkv2 中,此类不再可用。

我尝试从基于 AMQP 构建的 sdkv2 中的IoTHubRegistryManager 建立相同的连接,但换向不稳定并在 10 - 15 分钟后断开连接

registry_manager = IoTHubRegistryManager.from_connection_string(connection_str)

我可以使用 sdkv2 中的 IoTHubMessaging 类的稳定替代品吗?

【问题讨论】:

    标签: python azure azure-iot-hub azure-iot-edge azure-sdk-python


    【解决方案1】:

    要建立稳定的连接,我们需要将具体的参数传递给连接字符串。

    检查 TestFromConnectionString python 类以了解传递参数。

    下面的代码块帮助我们理解如何将参数传递给连接字符串。

    pytest.param(
                    "HostName={hostname};DeviceId={device_id};SharedAccessKeyName={skn};SharedAccessKey={sk}".format(
                        hostname=fake_hostname,
                        device_id=fake_device_id,
                        skn=fake_shared_access_key_name,
                        sk=fake_shared_access_key,
                    ),
                    id="connection string with HostName, DeviceId, SharedAccessKeyName, and SharedAccessKey",
                ),
    pytest.param(
                    "HostName={hostname};SharedAccessKeyName={skn};SharedAccessKey={sk}".format(
                        hostname=fake_hostname,
                        skn=fake_shared_access_key_name,
                        sk=fake_shared_access_key,
                    ),
                    id="connection string without DeviceId"
                )
    

    为了更好的理解,请参考source code

    为使用RegisterManager中的类、模块添加所需的Imports,try catch是捕获异常的可能方式:

    from azure.iot.hub import IoTHubRegistryManager
    
    connection_str = os.getenv("IOTHUB_CONNECTION_STR")
    device_id = os.getenv("IOTHUB_DEVICE_ID")
    
    try:
        # Create Manager
        registry_manager = IoTHubRegistryManager.from_connection_string(connection_str)
        print("Conn String: {0}".format(connection_str))
    
        # Send Message 
        send_message = "Sending c2d message 1"
        registry_manager.send_c2d_message(device_id, send_message)
    
    except Exception as ex:
        print("error {0}".format(ex))
    except KeyboardInterrupt:
        print("iothub_registry_c2d stopped")
    

    除了所有这些连接之外,我们还经常遇到连接问题,它们通常取决于我们使用的语言。

    要更好地理解,请参阅 Microsoft 的 documentation,它让我们深入了解连接问题

    由于我们使用 Python SDK 建立连接,下面的屏幕截图为我们提供了基于语言的可靠性信息。有关这方面的更多详细信息,请参阅Manage connectivity and reliable messaging by using Azure IoT Hub device SDKs

    Reliability for Python SDK

    【讨论】:

    • 谢谢@Saikarri-MT
    【解决方案2】:

    我们最近还发布了对 sdk 的更新,以帮助解决断开连接问题。

    https://pypi.org/project/azure-iot-device/

    【讨论】:

      猜你喜欢
      • 2020-10-09
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2017-08-03
      • 2017-06-09
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      相关资源
      最近更新 更多