Azure 物联网中心事件进入功能

Azure 物联网中心事件进入功能,azure,azure-functions,azure-iot-hub,Azure,Azure Functions,Azure Iot Hub,我创建了一个非常简单的Azure函数,将其连接到IoT中心以捕获内置事件端点(使用自定义消费者组,但这不是问题所在) 我遇到的问题是发送到端点的消息。它无法识别哪个设备或模块,甚至无法识别事件是什么。是设备双更新、来自模块的消息、来自设备代码的模块双更新以及来自何处的模块双更新、模块代码?我是不是遗漏了什么?如何确定哪个设备/模块等发送了事件 屏幕截图显示了固定消息——基本上是获取事件消息并将其转储到日志(函数的默认构造函数) 随附的固定代码: using System; using Syste

我创建了一个非常简单的Azure函数,将其连接到IoT中心以捕获内置事件端点(使用自定义消费者组,但这不是问题所在)

我遇到的问题是发送到端点的消息。它无法识别哪个设备或模块,甚至无法识别事件是什么。是设备双更新、来自模块的消息、来自设备代码的模块双更新以及来自何处的模块双更新、模块代码?我是不是遗漏了什么?如何确定哪个设备/模块等发送了事件

屏幕截图显示了固定消息——基本上是获取事件消息并将其转储到日志(函数的默认构造函数)

随附的固定代码:

using System;
using System.Web.Http;
using Microsoft.Azure.Devices;
using Microsoft.Azure.Devices.Shared;

public static void Run(string myIoTHubMessage, TraceWriter log) {

    log.Info($"C# IoT Hub trigger function processed a message: {myIoTHubMessage}");

}


您应该将函数更改为接受
EventData
作为输入参数,而不是字符串。这将允许您访问事件元数据,例如从
SystemProperties
访问设备ID:

公共静态异步任务运行(EventData MyIoTubMessage、TraceWriter日志)
{
var deviceId=myIoTHubMessage.SystemProperties[“iothub连接设备id”];
log.Info($“C#IoT集线器触发器函数处理了来自{deviceId}的消息”);
}

有关系统属性的列表,请参阅。

您应该更改函数以接受
EventData
作为输入参数,而不是字符串。这将允许您访问事件元数据,例如从
SystemProperties
访问设备ID:

公共静态异步任务运行(EventData MyIoTubMessage、TraceWriter日志)
{
var deviceId=myIoTHubMessage.SystemProperties[“iothub连接设备id”];
log.Info($“C#IoT集线器触发器函数处理了来自{deviceId}的消息”);
}
有关系统属性的列表,请参阅。

另一个选项(无其他程序集):

使用系统;
公共静态无效运行(字符串MyIoTubMessage、IDictionary属性、TraceWriter日志)
{
log.Info($“C#IoT Hub触发器函数处理了一条消息:{myIoTHubMessage}”);
foreach(属性中的var属性)
log.Info($“\t{prop.Key}={prop.Value}”);
}
另一个选项(无附加组件):

使用系统;
公共静态无效运行(字符串MyIoTubMessage、IDictionary属性、TraceWriter日志)
{
log.Info($“C#IoT Hub触发器函数处理了一条消息:{myIoTHubMessage}”);
foreach(属性中的var属性)
log.Info($“\t{prop.Key}={prop.Value}”);
}

会有帮助吗?@Mikhail——我来试试。我想我没有意识到除了一个原始字符串之外还有更多的信息。让我来看看你的建议——也许可以为它创建一个答案,如果它对我有效,我可以将它标记为已回答。这不起作用——它取决于服务总线后端,而这不是我所拥有的——它只是一个普通的旧字符串——由在模板中创建它的shell basic完成。公共静态无效运行(字符串myIoTHubMessage,TraceWriter log){log.Info($“C#IoT Hub触发器函数处理了一条消息:{myIoTHubMessage}”);我更新了问题以显示更多细节。我没有意识到我粘贴了两次相同的图像。这不是服务总线,而是活动中心。看到我的答案了吗?会有帮助吗?@Mikhail——我来试一试。我想我没有意识到除了原始字符串之外,还有更多的消息。让我来看看你的建议——也许还可以创建答案,所以如果它对我有效,我可以将它标记为已回答。这不起作用——它取决于服务总线后端,而这不是我拥有的——它只是一个普通的旧字符串——由在模板中创建它的shell basic完成。public static void Run(string myIoTHubMessage,TraceWriter log){log.Info($“C#IoT Hub触发器函数处理了一条消息:{myIoTHubMessage}”);我更新了问题以显示更多细节。没有意识到我粘贴了两次相同的图像。它不是服务总线,而是事件集线器。请参阅我的答案。我需要添加一个引用吗?它不喜欢EventData,这是由默认的“IoT Hub”创建的“函数选项。它需要这个#r“Microsoft.ServiceBus”使用系统;使用Microsoft.ServiceBus.Messaging;我会播放并在看到我喜欢的数据后标记您的回答。谢谢,Mikhail——这是可行的——但仍然不能告诉我发生了什么。我只能确定它来自设备或模块,然后是一块JSON”。是否没有更简单的方法可以更清楚地捕获设备的两项更改?或者完整的消息正文?是否需要在此添加参考?它不喜欢EventData,这是由默认的“IoT Hub”功能选项创建的。它需要此#r“Microsoft.ServiceBus”使用System;使用Microsoft.ServiceBus.Messaging;一旦我看到喜欢的数据,我会播放并标记您的回答。谢谢,Mikhail——这是可行的——但仍然无法告诉我发生了什么。我只能确定它来自设备或模块——然后是“JSON块”.是否没有更简单的方法更清楚地捕获设备的两项更改?或完整的消息正文?
using System;

public static void Run(string myIoTHubMessage, IDictionary<string, object> properties, TraceWriter log)
{
   log.Info($"C# IoT Hub trigger function processed a message: {myIoTHubMessage}");
   foreach (var prop in properties)
      log.Info($"\t{prop.Key} = {prop.Value}");
}