Azure IoT中心运营监控

时间:2017-04-19 08:40:44

标签: c# azure iot azure-iot-hub

我有一个连接设备的Azure IoT中心。我想启用监控来监控连接和断开集线器的设备。

我在Iot中心的监​​控类别中为Connections启用了详细信息:

enter image description here

我的设备连接到我的Hub并在设备资源管理器中显示:

enter image description here

然后我将Azure功能设置为将我的数据从Operations Monitoring记录到Azure SQL数据库:

using System;
using System.Configuration;
using System.Data.SqlClient;
using Newtonsoft.Json;

public static void Run(string myEventHubMessage, TraceWriter log)
{
    log.Info(myEventHubMessage);

    try
    {
        var connectionString = ConfigurationManager.ConnectionStrings["iotAzureSQLDb"].ConnectionString;

        log.Info(connectionString);
        var message = JsonConvert.DeserializeObject<MonitoringMessage>(myEventHubMessage);

        using (var connection = new SqlConnection(connectionString))
        {
            var sqlStatement = "insert into [dbo].[DeviceStatuses] " +
                                "(DeviceId, ConnectionStatus, ConnectionUpdateTime)" +
                                "values " +
                                "(@DeviceId, @ConnectionStatus, @ConnectionUpdateTime)";
            using (var dataCommand = new SqlCommand(sqlStatement, connection))
            {
                dataCommand.Parameters.AddWithValue("@ConnectionStatus", message.operationName);
                dataCommand.Parameters.AddWithValue("@DeviceId", message.deviceId);
                dataCommand.Parameters.AddWithValue("@ConnectionUpdateTime", message.time);

                connection.Open();
                dataCommand.ExecuteNonQuery();
                connection.Close();

                log.Info($"Device {message.deviceId} changed state: {message.operationName}");
            }
        }
    }
    catch (Exception ex)
    {
        log.Info(ex.Message);
    }
}

public class MonitoringMessage
{
    public string deviceId { get; set; }
    public string operationName { get; set; }
    public int? durationMs { get; set; }
    public string authType { get; set; }
    public string protocol { get; set; }
    public DateTimeOffset? time { get; set; }
    public string category { get; set; }
    public string level { get; set; }
    public int? statusCode { get; set; }
    public int? statusType { get; set; }
    public string statusDescription { get; set; }
}

如果我在Operations Monitoring中启用了设备身份操作,我会记录创建事件。所以我相信这个功能的输入是正确的。但是,没有为Connections ???创建任何东西

我也可以将消息发送到我连接的设备。我只是看到没有关于连接/断开的事件。

我还尝试过创建一个Stream Analytics并对输入进行采样一段时间,我知道我有连接/断开连接但没有找到任何内容。

3 个答案:

答案 0 :(得分:0)

我通过强制我的设备在开发环境中通过MQTT进行连接来解决这个问题,现在我看到它连接和断开连接。

不幸的是,我无法在生产中使用MQTT。

有人知道连接/断开事件是否只能在MQTT中与AMQP相对吗?

答案 1 :(得分:0)

如果您只想获得设备连接状态,请改用REST。

https://docs.microsoft.com/en-us/rest/api/iothub/deviceapi#DeviceApi_GetDevices

此外,这是一个监控设备连接状态的在线工具。

https://iotdevtool.com/registry/ enter image description here

答案 2 :(得分:0)

我们发明了一种数据流来确定设备状态&#34;。我们创建了一个流分析作业,连接到Operations monitoring(IOT输入定义中的Endpoint类型)。我们有Stream Analytics查询SELECT INTO一个ServiceBus队列。我们有一个WebJob处理程序,用于排队和更新持久存储(SQL表,Azure表,您的选择),我们写下状态。然后,UI(或WebAPI控制器)可以检查该持久存储。

到目前为止,我们已将Monitoring categories(在IOT Hub Portal刀片中)设置为Verbose,但稍后可能会将其拨号。

我们确实获得了数据。