提交 3c13b9de 编写于 作者: 麦壳饼's avatar 麦壳饼

重构设备状态部分。

上级 269eb638
......@@ -201,6 +201,7 @@ namespace IoTSharp.Contracts
[JsonConverter(typeof(StringEnumConverter))]
public enum MountType
{
None=-1,
/// <summary>
/// 原始数据
/// </summary>
......@@ -220,11 +221,11 @@ namespace IoTSharp.Contracts
/// <summary>
/// 在线
/// </summary>
Online = 4,
Connected = 4,
/// <summary>
/// 离线
/// </summary>
Offline = 5,
Disconnected = 5,
/// <summary>
/// 遥测数据, key value type datetime
/// </summary>
......@@ -235,6 +236,14 @@ namespace IoTSharp.Contracts
Alarm = 7,
DeleteDevice = 8,
CreateDevice = 9,
/// <summary>
/// 活动事件
/// </summary>
Activity = 10,
/// <summary>
/// 非活跃状态
/// </summary>
Inactivity = 11
}
/// <summary>
/// 折叠数据
......
using DotNetCore.CAP;
using Amazon.Runtime.Internal.Transform;
using DotNetCore.CAP;
using EasyCaching.Core;
using IoTSharp.Contracts;
using IoTSharp.Data;
......@@ -61,5 +62,16 @@ namespace IoTSharp.EventBus.CAP
{
await CreateDevice(deviceId);
}
[CapSubscribe("iotsharp.services.platform.connect")]
public async Task connect(Guid devid, ConnectStatus devicestatus)
{
await Connect(devid, devicestatus);
}
[CapSubscribe("iotsharp.services.platform.active")]
public async Task active(Guid devid, ActivityStatus activity)
{
await base.Active(devid, activity);
}
}
}
\ No newline at end of file
......@@ -21,6 +21,8 @@ namespace IoTSharp.EventBus.Shashlik
{
}
}
public class EventAttributeDataHandler : IEventHandler<AttributeDataEvent>
......
......@@ -8,26 +8,52 @@ using System.Threading.Tasks;
namespace IoTSharp.EventBus
{
/// <summary>
/// 消息发布扩展类
/// </summary>
public static class EventBusPublisher
{
public static void PublishAttributeData(this IPublisher cap, Device device, Dictionary<string, object> keyValues)
/// <summary>
/// 将指定字典发布到指定设备中
/// </summary>
/// <param name="_queue"></param>
/// <param name="device"></param>
/// <param name="keyValues"></param>
public static void PublishAttributeData(this IPublisher _queue, Device device, Dictionary<string, object> keyValues)
{
cap.PublishAttributeData(new PlayloadData() { DeviceId = device.Id, MsgBody = keyValues, DataSide = DataSide.ClientSide, DataCatalog = DataCatalog.AttributeData });
_queue.PublishAttributeData(new PlayloadData() { DeviceId = device.Id, MsgBody = keyValues, DataSide = DataSide.ClientSide, DataCatalog = DataCatalog.AttributeData });
}
public static void PublishTelemetryData(this IPublisher cap, Device device, Dictionary<string, object> keyValues)
/// <summary>
/// 发布属性数据
/// </summary>
/// <param name="_queue"></param>
/// <param name="device"></param>
/// <param name="_data"></param>
public static void PublishAttributeData(this IPublisher _queue, Device device, Action<PlayloadData> _data)
{
var dat = new PlayloadData() { DeviceId = device.Id, MsgBody = new Dictionary<string, object>(), DataSide = DataSide.ClientSide, DataCatalog = DataCatalog.AttributeData };
_data?.Invoke(dat);
_queue.PublishAttributeData(dat);
}
/// <summary>
/// 发布字典到遥测数据
/// </summary>
/// <param name="_queue"></param>
/// <param name="device"></param>
/// <param name="keyValues"></param>
public static void PublishTelemetryData(this IPublisher _queue, Device device, Dictionary<string, object> keyValues)
{
cap.PublishTelemetryData(new PlayloadData() { DeviceId = device.Id, MsgBody = keyValues, DataSide = DataSide.ClientSide, DataCatalog = DataCatalog.TelemetryData });
_queue.PublishTelemetryData(new PlayloadData() { DeviceId = device.Id, MsgBody = keyValues, DataSide = DataSide.ClientSide, DataCatalog = DataCatalog.TelemetryData });
}
[Obsolete]
public static void PublishSubDeviceOnline(this IPublisher _queue, Guid _gatewaydevid, Device subdev)
/// <summary>
/// 发布设备状态到属性当中。
/// </summary>
/// <param name="_queue"></param>
/// <param name="device"></param>
/// <param name="status"></param>
public static void PublishStatus(this IPublisher _queue, Device device, DeviceStatus status)
{
//如果是_dev的子设备, 则更新状态。
if (subdev.DeviceType == DeviceType.Device && subdev.Id != _gatewaydevid)
{
_queue.PublishDeviceStatus(subdev.Id, DeviceStatus.Good);
}
_queue.PublishAttributeData(device, msg => msg.MsgBody.Add("Status", status));
}
}
......
......@@ -6,8 +6,6 @@ using IoTSharp.Extensions;
using IoTSharp.Storage;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Dynamic;
......@@ -36,8 +34,11 @@ namespace IoTSharp.EventBus
_caching = factory.GetCachingProvider(_hc_Caching);
_eventBusOption = eventBusOption;
}
public async Task StoreAttributeData(PlayloadData msg)
{
await StoreAttributeData(msg, MountType.Attribute);
}
public async Task StoreAttributeData(PlayloadData msg, MountType _event)
{
try
{
......@@ -55,7 +56,10 @@ namespace IoTSharp.EventBus
_logger.LogError($"{ex.Key} {ex.Value} {Newtonsoft.Json.JsonConvert.SerializeObject(msg.MsgBody[ex.Key])}");
});
_logger.LogInformation($"更新{device.Name}({device.Id})属性数据结果{result2.ret}");
await RunRules(msg.DeviceId, dc.ToDynamic(), MountType.Attribute);
if (_event!= MountType.None)
{
await RunRules(msg.DeviceId, dc.ToDynamic(), _event);
}
}
}
}
......@@ -68,7 +72,7 @@ namespace IoTSharp.EventBus
}
private async Task RunRules(Guid deviceId, object obj, MountType attribute)
public async Task RunRules(Guid deviceId, object obj, MountType attribute)
{
await _eventBusOption.RunRules(deviceId, obj, attribute);
}
......@@ -120,12 +124,12 @@ namespace IoTSharp.EventBus
{
if (status.DeviceStatus != DeviceStatus.Good)
{
await RunRules(dev.Id, status, MountType.Offline);
await RunRules(dev.Id, status, MountType.Disconnected);
//真正离线
}
else if (status.DeviceStatus == DeviceStatus.Good)
{
await RunRules(dev.Id, status, MountType.Online);
await RunRules(dev.Id, status, MountType.Connected);
//真正掉线
}
var result2 = await _dbContext.SaveAsync<AttributeLatest>(status.ToDictionary(), dev.Id, DataSide.ServerSide);
......@@ -165,5 +169,28 @@ namespace IoTSharp.EventBus
await RunRules(deviceId, new object(), MountType.CreateDevice);
}
public async Task Active(Guid devid, ActivityStatus activity)
{
var msg = new PlayloadData();
msg.DeviceId = devid;
msg.DataCatalog = DataCatalog.AttributeData;
msg.DataSide = DataSide.ServerSide;
msg.MsgBody.Add(activity == ActivityStatus.Activity ? "LastActivityDateTime" : "InactivityAlarmDateTime ", DateTime.Now);
msg.MsgBody.Add("Active", activity == ActivityStatus.Activity);
await StoreAttributeData(msg, activity == ActivityStatus.Activity ? MountType.Activity : MountType.Inactivity);
}
public async Task Connect(Guid devid, ConnectStatus devicestatus)
{
var msg = new PlayloadData();
msg.DeviceId = devid;
msg.DataCatalog = DataCatalog.AttributeData;
msg.DataSide = DataSide.ServerSide;
msg.MsgBody.Add(devicestatus == ConnectStatus.Connected ? "LastConnectDateTime" : "LastDisconnectDateTime", DateTime.Now);
await StoreAttributeData(msg, devicestatus == ConnectStatus.Connected ? MountType.Connected : MountType.Disconnected);
}
}
}
\ No newline at end of file
......@@ -13,5 +13,7 @@ namespace IoTSharp.EventBus
public Task StoreTelemetryData(PlayloadData msg);
public Task DeleteDevice(Guid deviceId);
public Task CreateDevice(Guid deviceId);
public Task Connect(Guid devid, ConnectStatus devicestatus);
public Task Active(Guid devid, ActivityStatus activity);
}
}
\ No newline at end of file
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.TestHost;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace IoTSharp.Test
{
[TestClass]
public class PrimeWebDefaultRequestShould
{
private TestServer _server;
private HttpClient _client;
[TestInitialize()]
public void TestServerInitialize()
{
_server = new TestServer((IWebHostBuilder)Program.CreateHostBuilder(null));
_client = _server.CreateClient();
}
[TestMethod]
public async Task ReturnHelloWorld()
{
// Act
var response = await _client.GetAsync("/");
response.EnsureSuccessStatusCode();
var responseString = await response.Content.ReadAsStringAsync();
// Assert
Assert.AreEqual("Hello World!", responseString);
}
}
}
......@@ -48,20 +48,20 @@ namespace IoTSharp.Services.MQTTControllers
public Task UpdateStatus(DeviceStatus status)
{
_logger.LogInformation($"重置状态{device.Id} {device.Name}");
_queue.PublishStatus(device, status);
if (device.DeviceType == DeviceType.Device && device.Owner != null && device.Owner?.Id != null && device.Owner?.Id != Guid.Empty)//虚拟设备上线
{
_queue.PublishActive(device.Id, ActivityStatus.Activity);
_queue.PublishActive(device.Owner.Id, ActivityStatus.Activity);
_queue.PublishDeviceStatus(device.Id, status);
_queue.PublishDeviceStatus(device.Owner.Id, status != DeviceStatus.Good ? DeviceStatus.PartGood : status);
_logger.LogInformation($"重置网关状态{device.Owner.Id} {device.Owner.Name}");
}
else
{
_queue.PublishDeviceStatus(device.Id, status);
_queue.PublishActive(device.Id, ActivityStatus.Activity);
}
return Ok();
}
}
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册