仅从单个设备处理Azure IoT集线器事件
我试图解决部署数千台物联网设备,将所有事件记录到Azure物联网中心,然后只能读取单个设备ID创建的事件的问题 我一直在使用仅从单个设备处理Azure IoT集线器事件,azure,azure-eventhub,azure-iot-hub,Azure,Azure Eventhub,Azure Iot Hub,我试图解决部署数千台物联网设备,将所有事件记录到Azure物联网中心,然后只能读取单个设备ID创建的事件的问题 我一直在使用EventProcessorHost来实现类似的功能,但到目前为止,我只能看到一种从all设备读取all消息的方法 读取所有消息并过滤客户端消息不是一个可行的解决方案,因为可能会有数百万条消息。如果您对Java/Scala没有异议,此示例显示了如何创建客户端并按设备Id过滤消息: 不过,底层客户端从中心读取所有消息 你也可以考虑使用IoT集线器消息路由,这里有更多的信息:
EventProcessorHost
来实现类似的功能,但到目前为止,我只能看到一种从all设备读取all消息的方法
读取所有消息并过滤客户端消息不是一个可行的解决方案,因为可能会有数百万条消息。如果您对Java/Scala没有异议,此示例显示了如何创建客户端并按设备Id过滤消息: 不过,底层客户端从中心读取所有消息 <>你也可以考虑使用IoT集线器消息路由,这里有更多的信息:
Azure IoT Hub的主要用途是将大量事件从设备接收到云流管道,以实时方式进行分析。默认遥测路径(热通道)通过内置事件中心,所有事件都临时存储在EH分区中。 除了默认端点(事件),还可以根据规则(条件)将事件消息路由到自定义端点 请注意,自定义端点的数量限制为10,规则的数量限制为100。如果这个限制与你的商业模式相匹配,你可以很容易地将10台设备单独流式传输,就像Davis的回答中所描述的那样 但是,如果基于超过此限制(10+1)的源(设备)拆分遥测流管道,则需要使用其他azure实体(组件) 下图显示了基于使用发布/订阅推送模型的设备拆分遥测流管道的解决方案 上述解决方案基于使用自定义主题发布服务器将流事件转发到Azure事件网格。事件网格事件的事件架构为。 事件网格的自定义主题发布器由Azure EventHubTrigger函数表示,其中每个流事件都映射到事件网格事件消息中,主题由注册设备指示 Azure事件网格是一个发布/订阅松散解耦的模型,在该模型中,事件根据订阅者订阅的内容交付给订阅者。换句话说,如果没有匹配的传递,事件消息将消失 注意,事件网格路由的能力是每个区域每秒1000万个事件。每个区域的订阅数量限制为1000 使用,可以动态创建、更新、删除订阅等 下面的代码片段显示了将流事件映射到EG事件消息的AF实现示例。正如您所看到的,这是一个非常简单的实现: run.csx:
#r "Newtonsoft.Json"
#r "Microsoft.ServiceBus"
using System.Configuration;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.EventGrid.Models;
using Microsoft.ServiceBus.Messaging;
using Newtonsoft.Json;
// reusable client proxy
static HttpClient client = HttpClientHelper.Client(ConfigurationManager.AppSettings["TopicEndpointEventGrid"], ConfigurationManager.AppSettings["aeg-sas-key"]);
// AF
public static async Task Run(EventData ed, TraceWriter log)
{
log.Info($"C# Event Hub trigger function processed a message:{ed.SequenceNumber}");
// fire EventGrid Custom Topic
var egevent = new EventGridEvent()
{
Id = ed.SequenceNumber.ToString(),
Subject = $"/iothub/events/{ed.SystemProperties["iothub-message-source"] ?? "?"}/{ed.SystemProperties["iothub-connection-device-id"] ?? "?"}",
EventType = "telemetryDataInserted",
EventTime = ed.EnqueuedTimeUtc,
Data = new
{
sysproperties = ed.SystemProperties,
properties = ed.Properties,
body = JsonConvert.DeserializeObject(Encoding.UTF8.GetString(ed.GetBytes()))
}
};
await client.PostAsJsonAsync("", new[] { egevent });
}
// helper
class HttpClientHelper
{
public static HttpClient Client(string address, string key)
{
var client = new HttpClient() { BaseAddress = new Uri(address) };
client.DefaultRequestHeaders.Add("aeg-sas-key", key);
return client;
}
}
function.json:
{
"bindings": [
{
"type": "eventHubTrigger",
"name": "ed",
"direction": "in",
"path": "<yourEventHubName>",
"connection": "<yourIoTHUB>",
"consumerGroup": "<yourGroup>",
"cardinality": "many"
}
],
"disabled": false
}
最后,以下屏幕片段显示了设备1的AF订阅服务器接收到的事件网格事件消息:
物联网中心是唯一的网关,而不是永久存储。例如,您应该将这些消息发送到以后可以查询的表存储中。正如在事件网格中提到的“对状态更改作出反应”,而不是将消息流式传输回感兴趣的订阅者。同时,原作者说将会有成千上万的设备。然而,即使网格也仅限于1000个订阅。如何为1000多个不同的设备获取消息?
{
"frameworks": {
"net46":{
"dependencies": {
"Microsoft.Azure.EventGrid": "1.1.0-preview"
}
}
}
}