使用Stream Analytics将Azure IoT中心云到设备消息

时间:2017-11-26 01:51:44

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

我通过以下路径发送数据。

  

Android - > IoT Hub - >流分析 - > SQL

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

1 个答案:

答案 0 :(得分:3)

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

以下是此功能的示例。

run.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功能应用中添加 myIoTHub 设置 连接到Azure IoT Hub的连接字符串。
  2. 创建HttpTrigger函数,我们将其称为 HttpASA_1
  3. 使用上述内容更新run.csx,function.json和project.json文件
  4. 将以下示例用于测试请求正文:
  5. [       {     &#34;时间&#34;:&#34; 2017-11-26T12:52:23.4292501Z&#34;,     &#34; counter&#34;:57,     &#34; windSpeed&#34;:8.7358,     &#34;温度&#34;:16.63,     &#34;湿度&#34;:79.42,     &#34; EventProcessedUtcTime&#34;:&#34; 2017-11-26T12:52:21.3568252Z&#34;,     &#34; PartitionId&#34;:2,     &#34; EventEnqueuedUtcTime&#34;:&#34; 2017-11-26T12:52:22.435Z&#34;,     &#34; IoTHub&#34;:{       &#34; MessageId&#34;:null,       &#34; CorrelationId&#34;:null,       &#34; ConnectionDeviceId&#34;:&#34; Device1 &#34;,       &#34; ConnectionDeviceGenerationId&#34;:&#34; 636189812948967054&#34;,       &#34; EnqueuedTime&#34;:&#34; 2017-11-26T12:52:21.562Z&#34;,       &#34; StreamId&#34;:null     }   } ]

    更改实际deviceId的值 Device1

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

      1. 现在,在此步骤中,我们可以转到ASA作业来调用此HttpASA_1函数。请注意,ASA作业仅调用HttpTrigger函数。以下屏幕截图显示为Azure功能添加输出:
      2. outputs

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

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

          注意, 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
              }
            }
          ]
          

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