Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅从单个设备处理Azure IoT集线器事件_Azure_Azure Eventhub_Azure Iot Hub - Fatal编程技术网

仅从单个设备处理Azure IoT集线器事件

仅从单个设备处理Azure IoT集线器事件,azure,azure-eventhub,azure-iot-hub,Azure,Azure Eventhub,Azure Iot Hub,我试图解决部署数千台物联网设备,将所有事件记录到Azure物联网中心,然后只能读取单个设备ID创建的事件的问题 我一直在使用EventProcessorHost来实现类似的功能,但到目前为止,我只能看到一种从all设备读取all消息的方法 读取所有消息并过滤客户端消息不是一个可行的解决方案,因为可能会有数百万条消息。如果您对Java/Scala没有异议,此示例显示了如何创建客户端并按设备Id过滤消息: 不过,底层客户端从中心读取所有消息 你也可以考虑使用IoT集线器消息路由,这里有更多的信息:

我试图解决部署数千台物联网设备,将所有事件记录到Azure物联网中心,然后只能读取单个设备ID创建的事件的问题

我一直在使用
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"
          }
        }
       }
    }