【问题标题】:Azure IoT hub cloud to device message using Stream Analytics使用流分析的 Azure IoT 中心云到设备消息
【发布时间】:2018-05-09 14:11:22
【问题描述】:

我正在通过如下路径发送数据。

Android -> IoT 中心 -> 流分析 -> SQL

我在流分析的查询中调用机器学习功能。现在,我想将机器学习的结果返回到 Android 设备。为了在 Android 设备上接收云到设备的消息,我已经完成并使用设备资源管理器进行了测试。我正在查看官方教程,1,2,但仍然不知道如何使用流分析将云发送到设备消息。 He 表示使用服务总线和功能应用,但未提供详细信息。我是 Azure 的新手。希望有人能给我一些指导或任何链接,以便我可以更多地了解如何实施它。提前致谢。

【问题讨论】:

    标签: azure azure-iot-hub azure-stream-analytics


    【解决方案1】:

    您可以使用 Azure 函数(预览版) 输出 ASA 作业,以便通过 Azure IoT Hub 面向服务的端点发送云到设备消息。

    下面是这个函数的一个例子。

    运行.csx:

    #r "Newtonsoft.Json"
    
    using System.Configuration;
    using System.Text;
    using System.Net;
    using Microsoft.Azure.Devices;
    using Newtonsoft.Json;
    
    // create proxy
    static Microsoft.Azure.Devices.ServiceClient client = ServiceClient.CreateFromConnectionString(ConfigurationManager.AppSettings["myIoTHub"]);
    
    public static async Task<HttpResponseMessage> Run(string input, HttpRequestMessage req, TraceWriter log)
    {
        log.Info($"ASA Job: {input}");
    
        var data = JsonConvert.DeserializeAnonymousType(input, new[] { new { xyz = "", IoTHub = new { ConnectionDeviceId = ""}}});
    
        if(!string.IsNullOrEmpty(data[0]?.IoTHub?.ConnectionDeviceId))
        {
            string deviceId = data[0].IoTHub.ConnectionDeviceId;
            log.Info($"Device: {deviceId}");
    
            // cloud-to-device message 
            var msg = JsonConvert.SerializeObject(new { temp = 20.5 });
            var c2dmsg = new Microsoft.Azure.Devices.Message(Encoding.ASCII.GetBytes(msg));
    
           // send AMQP message
           await client.SendAsync(deviceId, c2dmsg);
        }
    
       return req.CreateResponse(HttpStatusCode.NoContent);
    }
    

    function.json:

    {
      "bindings": [
        {
          "authLevel": "function",
          "name": "input",
          "type": "httpTrigger",
          "direction": "in"
        },
        {
          "name": "$return",
          "type": "http",
          "direction": "out"
        }
      ],
      "disabled": false
    }
    

    project.json:

    {
       "frameworks": {
       "net46":{
          "dependencies": {
            "Microsoft.Azure.Devices": "1.3.2"
          }
        }
       }
    }
    

    附录 A

    出于测试目的,请执行以下步骤:

    1. 在您的 Azure Function App 中为您添加设置 myIoTHub Azure IoT 中心的连接字符串。
    2. 创建 HttpTrigger 函数,将其命名为 HttpASA_1
    3. 用上述内容更新run.csx、function.json和project.json文件
    4. 对测试请求正文使用以下示例:

    [ { "时间": "2017-11-26T12:52:23.4292501Z", “计数器”:57, “风速”:8.7358, “温度”:16.63, “湿度”:79.42, "EventProcessedUtcTime": "2017-11-26T12:52:21.3568252Z", “分区 ID”:2, "EventEnqueuedUtcTime": "2017-11-26T12:52:22.435Z", “物联网中心”:{ “消息 ID”:空, “CorrelationId”:空, "ConnectionDeviceId": "Device1", "ConnectionDeviceGenerationId": "636189812948967054", "入队时间": "2017-11-26T12:52:21.562Z", “流标识”:空 } } ]

    为您的实际 deviceId 更改值 Device1。

    1. 现在,AF 已准备好对其进行测试。按 Run 按钮运行示例并查看日志进度。
    2. 您应该会在您的设备上看到 AF 发送的 C2D 消息,或者您可以下载一个小测试器 Azure IoT Hub Tester 来模拟您的 MQTT 设备。以下屏幕 sn-p 显示了此测试器:

    1. 现在,在此步骤中,我们可以转到 ASA 作业以调用此 HttpASA_1 函数。请注意,ASA 作业仅调用 HttpTrigger 函数。以下屏幕 sn-p 显示为我们的 Azure 函数添加输出:

    当您在导入选项组合框中选择订阅时,您应该会在组合框中看到此功能。完成后,按保存按钮并观看屏幕上的通知消息。 ASA 将向您的 AF 发送验证消息,其响应状态应为 20x 代码。

    1. 最后,您可以转到 Query 为您的 AF 生成输出。以下屏幕显示了所有遥测数据到 AF 的简单输出:

    注意,inpsim 是我的 iothub 输入。

    ASA 以以下格式输出 HttpTrigger 函数的有效负载,请参见我的示例:

    [
      {
        "time": "2017-11-26T12:52:23.4292501Z",
        "counter": 57,
        "windSpeed": 8.7358,
        "temperature": 16.63,
        "humidity": 79.42,
    
        "EventProcessedUtcTime": "2017-11-26T12:52:21.3568252Z",
        "PartitionId": 2,
        "EventEnqueuedUtcTime": "2017-11-26T12:52:22.435Z",
        "IoTHub": {
          "MessageId": null,
          "CorrelationId": null,
          "ConnectionDeviceId": "Device1",
          "ConnectionDeviceGenerationId": "636189812948967054",
          "EnqueuedTime": "2017-11-26T12:52:21.562Z",
          "StreamId": null
        }
      }
    ]
    

    请注意,我的遥测数据 (*) 是 counter、温度、湿度和时间戳时间,因此其他属性由 ASA 作业隐式创建。根据查询,您可以为 C2D 消息创建任何业务属性。

    【讨论】:

    • “myIoTHub”必须更改为我的 IoT 中心名称?如何在流分析中为这个 azure 应用设置输入?
    • 请参阅我的回答中的附录 A
    • 运行时出现错误。 2017-11-29T11:06:46.314 设备:Android 2017-11-29T11:06:46.330 执行函数时出现异常:Functions.HttpTriggerCSharp1。 Microsoft.Azure.WebJobs.Script:出现一个或多个错误。 f-HttpTriggerCSharp1__-1410912764:“Submission#0”的类型初始化程序引发了异常。 Microsoft.Azure.Devices:值不能为空。参数名称:iotHubConnectionString.
    • 您是否按照关于步骤进行操作?哪个步骤失败了,第 5 步。?
    • 是的,我在第5步失败了。以前我错过了第1步。现在,我将连接字符串添加到应用程序设置->连接字符串。连接字符串是iothubowner还是设备的连接?我都试过了,但仍然遇到同样的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 2017-08-30
    相关资源
    最近更新 更多