我已经开发了一个azure函数来处理消息进入IoTHub时的解压缩。
函数连接到消息传递端点中内置的IoTHub,因此它可以像EventHub一样运行。
我想要做的是让函数将解压缩的内容输出回IoTHub,这样我运行的Stream Analytics和其他作业就不必连接到不同的端点来继续接收遥测。
似乎有大量关于Azure功能的文档并将它们连接到IoTHubs,但其中一些来自去年,我知道事情已经发生了很大的变化。
这是我当前连接字符串,用于读取和写入相同的IoTHub:
Endpoint=sb://iothub-ns-34997-5db385cb1f.servicebus.windows.net/;SharedAccessKeyName=iothubowner;SharedAccessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=;EntityPath=IoTHub
现在我已将输出设置为转到IoTHub端点并且我收到错误
Exception while executing function: Functions.DecompressionJS. Microsoft.Azure.WebJobs.Host: Error while handling parameter _binder after function returned:. Microsoft.ServiceBus: Unauthorized access. 'Send' claim(s) are required to perform this operation. Resource: 'sb://iothub-ns-34997-5db385cb1f.servicebus.windows.net/iothub'. TrackingId:e85de1ed565243bcb30bc622a2cab252_G4, SystemTracker:gateway6, Timestamp:6/22/2017 9:20:16 PM.
所以我认为连接字符串有问题所以我修改它以包含异常告诉我使用的/ iothub,因为端点的其余部分与当前连接字符串匹配。
一旦我更新了连接字符串并重新启动了该函数,我得到了一个不同的例外:
Exception while executing function: Functions.DecompressionJS. Microsoft.Azure.WebJobs.Host: Error while handling parameter _binder after function returned:. Microsoft.ServiceBus: Invalid EventHub address. It must be either of the following. Sender: <EventHubName>. Partition Sender: <EventHubName>/Partitions/<PartitionNumber>. Partition Receiver: <EventHubName>/ConsumerGroups/<ConsumerGroupName>/Partitions/<PartitionNumber>. TrackingId:ecb290822f494a86a61c21712656ea4c_G0, SystemTracker:gateway6, Timestamp:6/22/2017 8:44:14 PM.
所以在这一点上,我认为IoTHub端点仅用于读取消息,并且无法将解压缩的内容返回到IoTHub。
我希望有人可以证明我的错误,并帮助我配置我的连接字符串,这样我就可以有一个闭环,并在没有中介的情况下从IoTHub检索和发送消息。
答案 0 :(得分:0)
Azure IoT Hub是设备和Azure云后端解决方案之间的双向网关。与Azure IoT Hub的通信是通过面向设备和面向服务的端点完成的。查看更多详情here。
您的方案需要在设备事件传递到遥测流管道之前对其进行解压缩。基本上,典型Azure流管道中的遥测预处理可以在 Azure功能(或工作者角色)和/或 Azure流分析(ASA)工作中完成,就像是如下图所示:
如您所见,AF和/或ASA作业正在更改流管道中的实时遥测数据,其状态存储在下一个实体(如事件中心)中。这是实时流管道和推送模型的常见和推荐模式。
您的方案还需要保留与未压缩设备事件相同的遥测路径(源),因此存在“非标准”解决方案。以下屏幕截图显示了此解决方案的示例:
上述解决方案的概念基于后端侧的设备仿真器。 Azure IoT Hub Routes会将其预处理的所有事件转发到自定义端点(如Event Hub)。
在此背后,Azure功能将负责解压缩已摄取事件并为该设备创建新事件,例如模拟设备。现在,这个模拟设备可以像其他真实设备一样向Azure IoT Hub发送D2C消息。
请注意,模拟设备使用的是Https协议(少连接)和Azure IoT Hub授权。
来自Azure IoT Hub中模拟设备的事件将路由到默认事件中心,例如默认遥测路径。
请注意,上述解决方案允许根据路由/规则选择事件预处理,并且其使用取决于业务模型。