如何在 Python 中接收 Azure 设备遥测?
Posted
技术标签:
【中文标题】如何在 Python 中接收 Azure 设备遥测?【英文标题】:How can I receive Azure Device telemetry in Python? 【发布时间】:2018-06-27 18:06:28 【问题描述】:如何使用 Python 在事件中心接收设备消息?我看到来自事件中心的摘要消息,但缺少详细的设备消息。
使用 Azure IOT 远程监控示例(https://github.com/Azure/azure-iot-remote-monitoring、https://www.azureiotsolutions.com/Accelerators)和 IOT Hub Explorer https://github.com/Azure/iothub-explorer 提供如下消息:
==== 来自:'chiller-01.0' at '2018-06-27T17:35:13.835Z' ==== “温度”:74.8813305672404, “温度单位”:“F”, “湿度”:67.345695720448, “湿度单位”:“%”, “压力”:155.648674178239, “压力单位”:“psig” ---- 应用程序属性 ---- "iothub-message-schema": "chiller-sensors;v1", “iothub-creation-time-utc”:“2018-06-27T17:35:13.5066336Z”, "$$CreationTimeUtc": "2018-06-27T17:35:13+00:00", "$$MessageSchema": "chiller-sensors;v1", "$$ContentType": "JSON"
为了在 python 中获取这些消息,我使用 azure-event-hubs-python 库和https://github.com/Azure/azure-event-hubs-python 的示例使用为操作中的 IOT 中心指定的事件中心连接字符串从事件中心读取 IOT 消息标签。用 Node JS 编写的 IOT Hub Explorer 使用 IOT Hub 连接字符串,但是使用 python 编写相应的代码失败并且 EventHubClient.from_connection_string 失败,因为 'EndPoint' 不在连接字符串中。将连接字符串中的“HostName”更改为“EndPoint”会导致 connection.pyx 出现错误:
文件“./src/connection.pyx”,第 20 行,在 uamqp.c_uamqp.create_connection 类型错误:预期字节,找到无类型
将协议 sb:// 预挂到端点抱怨未指定 EventHub:
ValueError:未指定 EventHub
添加 ;EntityPath= 会更进一步,但会因 CBS 令牌身份验证错误而失败:
azure.eventhub.EventHubError:接收失败:CBS 令牌身份验证失败。 状态码:401 说明:b'指定的 SAS 令牌具有无效签名。它与主键或辅助键都不匹配。'
使用 IOT 中心的事件中心连接字符串连接并接收消息可修复这些错误,但仅接收摘要数据而没有任何设备遥测,例如:
"count": 0,
"total": 0,
"minimum": 0,
"maximum": 0,
"average": 0,
"resourceId": "/SUBSCRIPTIONS/SUBSCRIPTION/RESOURCEGROUPS/RESOURCEGROUP/PROVIDERS/MICROSOFT.DEVICES/IOTHUBS/IOTHUB",
"time": "2018-06-27T16:59:00.0000000Z",
"metricName": "jobs.failed",
"timeGrain": "PT1M"
由于设备数据丢失,我不确定是否将正确的参数传递给 Python EventHubClient,或者客户端是否没有返回它们。一年前的此堆栈交换How can I receive from Azure IoT Hub messages sent by devices? 表明无法使用 Python 读取遥测数据,但由于 Python EventHub SDK 已经存在,我希望这已得到修复。
【问题讨论】:
【参考方案1】:是的,最新的 EventHubs SDK 可以使用 python 读取遥测数据。 不知道大家有没有提到 GitHub 上的issue(#28)。我认为 annatisch 在 4 月 28 日发表的评论对这个问题很有帮助。
【讨论】:
谢谢,迈克尔,这真的很有帮助。我现在正在阅读第 28 期的说明。 如果有任何问题,请随时告诉我。 迈克尔,我还是有问题。如前面的问题陈述所示,我能够使用事件中心命名空间地址、共享访问密钥和共享访问密钥值连接到事件中心,但我只看到事件的摘要数据和没有详细数据。 ADDRESS = 'amqps://eventhub-namespace-name.servicebus.windows.net/event-hub-name' SHARED_ACCESS_KEY_NAME = 'RootManageSharedAccessKey' SHARED_ACCESS_KEY_VALUE = '共享访问密钥值' client = EventHubClient(ADDRESS, SHARED_ACCESS_KEY_NAME, SHARED_ACCESS_KEY_VALUE) 使用问题 #28 示例,我使用 CLI 获取端点并构造 EventHubClient,如下所示:code
ADDRESS = 'amqps://iothub-ns-code
以上是关于如何在 Python 中接收 Azure 设备遥测?的主要内容,如果未能解决你的问题,请参考以下文章
Azure IOT PnP 数字孪生 API/SDK 用于检索设备/孪生的属性、命令和遥测定义