Azure IoT 中心操作监控

Azure IoT Hub Operations Monitoring

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

我在我的 Iot 中心的监控类别中启用了 Verbose on Connections:

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

然后我设置了一个 Azure 函数来将我的数据从操作监控记录到 Azure SQL db:

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; }
}

如果我在操作监控中启用设备标识操作,我会记录创建事件。所以我相信函数的输入是正确的。但是,没有为 Connections 创建任何内容???

我也可以很好地向我连​​接的设备发送消息。我只是没有看到连接/断开连接的事件。

我还尝试创建一个流分析并对输入进行采样一段时间,我知道我有连接/断开连接但没有找到任何东西。

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

很遗憾,我无法在生产环境中使用 MQTT。

有谁知道连接/断开事件是否仅在 MQTT 而非 AMQP 中才有可能?

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

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

另外,这里有一个在线工具可以监控设备连接状态。

https://iotdevtool.com/registry/

我们发明了数据流来确定"device state"。我们创建了一个流分析作业,连接到 Operations monitoring(即 IOT 输入定义中的 Endpoint 类型)。我们有流分析查询 SELECT INTO ServiceBus 队列。我们有一个 WebJob 处理队列并更新持久存储(SQL Table,Azure Table,你的选择),我们在其中记下状态。 UI(或 WebAPI 控制器)然后可以检查该持久存储。

到目前为止,我们已将所有 Monitoring categories(在 IOT 中心门户边栏选项卡中)设置为 Verbose,但稍后可能会调低它。

我们确实得到了数据。