首页 > 解决方案 > 如何在 Python 中接收 Azure 设备遥测?

问题描述

如何使用 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": "冷却器传感器;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 TypeError: expected bytes, NoneType found

将协议 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,或者客户端是否只是没有返回它们。一年前的此堆栈交换如何接收来自 Azure IoT Hub 的设备发送的消息?表示无法使用 Python 读取遥测数据,但由于 Python EventHub SDK 已经存在,我希望这已得到修复。

标签: pythonazureazure-iot-hubazure-eventhubazure-iot-sdk

解决方案


是的,最新的 EventHubs SDK 可以使用 python 读取遥测数据。不知道大家有没有提到GitHub 上的issue(#28) 。我认为 annatisch 在 4 月 28 日发表的评论对这个问题很有帮助。


推荐阅读