我有一个连接设备的Azure IoT集线器。我想启用监控,以监控连接和断开集线器的设备。
我已经在Iot集线器的监控类别中启用了详细的连接:
我的设备连接到集线器并在设备资源管理器中显示:
然后,我设置了一个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; }
}
如果在Operations Monitoring中启用Device Identity操作,则会记录创建事件。所以我相信函数的输入是正确的。然而,从来没有为连接创建任何东西???
我也可以发送消息到我连接的设备很好。我只是没有看到连接/断开的事件。
我还尝试创建一个流分析,并在一段时间内对输入进行采样,在这段时间内,我知道我有连接/断开,但什么都没有发现。
我通过强制我的设备在dev环境中通过MQTT连接来解决这个问题,现在我看到它正在连接和断开连接。
不幸的是,我不能在生产中使用MQTT。
有人知道连接/断开事件是否只有在MQTT中才可能发生,而不是在AMQP中?
如果您只是想获取设备的连接状态,请使用REST。
https://docs.microsoft.com/en-us/rest/api/iothub/deviceapi#deviceapi_getdevices
此外,这里还有一个在线工具来监控设备的连接状态。
我们发明了一个数据流来确定“设备状态”。我们创建了一个流分析作业,连接到操作监视
(即IOT输入定义中的端点
类型)。我们有Stream Analytics查询Select into
一个ServiceBus队列。我们有一个WebJob处理队列并更新一个持久存储(SQL表,Azure表,您的选择),在那里我们记录状态。UI(或WebAPI控制器)然后可以检查持久存储。
到目前为止,我们已经将所有监控类别
(在IOT Hub Portal blade中)设置为verbose
,但以后可能会将其拨号。
我们确实有数据。