diff --git a/JiShe.ServicePro b/JiShe.ServicePro index 8df0a54..6a5258a 160000 --- a/JiShe.ServicePro +++ b/JiShe.ServicePro @@ -1 +1 @@ -Subproject commit 8df0a54f551a1f894014c9b0e8eca5d7c5c4f51b +Subproject commit 6a5258a04fbeec29f3dae96f375230204ab2047b diff --git a/src/JiShe.IoT.Application.Contracts/DeviceAggregation/Dto/DeviceCommandForApiInput.cs b/src/JiShe.IoT.Application.Contracts/DeviceAggregation/Dto/DeviceCommandForApiInput.cs index 2905958..e77046d 100644 --- a/src/JiShe.IoT.Application.Contracts/DeviceAggregation/Dto/DeviceCommandForApiInput.cs +++ b/src/JiShe.IoT.Application.Contracts/DeviceAggregation/Dto/DeviceCommandForApiInput.cs @@ -1,4 +1,5 @@ -using JiShe.ServicePro.Enums; +using JiShe.ServicePro.Core; +using JiShe.ServicePro.Enums; using System.ComponentModel.DataAnnotations; namespace JiShe.IoT.DeviceAggregation @@ -7,26 +8,8 @@ namespace JiShe.IoT.DeviceAggregation /// /// 设备命令 /// - public class DeviceCommandForApiInput - { - /// - /// 表通信地址 - /// - [Required(ErrorMessage = "设备地址不能为空")] - public string DeviceAddress { get; set; } - - /// - /// 物联网平台类型 - /// - [Required(ErrorMessage = "物联网平台类型不能为空")] - public IoTPlatformTypeEnum IoTPlatform { get; set; } - - /// - /// 设备在物联网平台中对应的产品Id - /// - [Required(ErrorMessage = "产品Id不能为空")] - public string IoTPlatformProductId { get; set; } - + public class DeviceCommandForApiInput:IdInput + { /// /// 设备在物联网平台中发送的命令内容,JSON格式 /// diff --git a/src/JiShe.IoT.Application/DeviceAggregation/DeviceAggregationService.cs b/src/JiShe.IoT.Application/DeviceAggregation/DeviceAggregationService.cs index ba7a5b2..6d13f23 100644 --- a/src/JiShe.IoT.Application/DeviceAggregation/DeviceAggregationService.cs +++ b/src/JiShe.IoT.Application/DeviceAggregation/DeviceAggregationService.cs @@ -267,6 +267,8 @@ namespace JiShe.IoT.DeviceAggregation RedisProvider.Instance.HSet(RedisConst.CacheAllDeviceInfoHashKey, input.DeviceAddress, deviceCacheInfos); + + return input.Adapt(); } @@ -279,13 +281,13 @@ namespace JiShe.IoT.DeviceAggregation { try { - var deviceInfo = await deviceAppService.FindByDeviceAddressAsync(input.DeviceAddress); + var deviceInfo = await deviceAppService.FindByIdAsync(input); //将指令存储Kafka的OneNET主题中 var commandRequest = new OpenApiRequest() { Message = new ReceiveCommandInfoDto() { - DeviceAddress = input.DeviceAddress, + DeviceAddress = deviceInfo.DeviceAddress, Commands = input.CommandContent.Deserialize>(), DeviceType = DeviceTypeEnum.Focus,//todo 设备类型 需要跟设备统一什么情况下知道具体设备类型 SourceType = DeviceTelemetrySourceTypeEnum.AdminSystem, @@ -294,8 +296,7 @@ namespace JiShe.IoT.DeviceAggregation if (deviceInfo.IoTPlatform == IoTPlatformTypeEnum.OneNET) { - await producerService.ProduceAsync(KafkaTopicConsts.OneNETCommandIssuedEventName, $"{GuidGenerator.Create()}", commandRequest); - return true; + return await DeviceCommandInfoToOneNET(deviceInfo, commandRequest); } else if (deviceInfo.IoTPlatform == IoTPlatformTypeEnum.CTWing) { @@ -568,6 +569,45 @@ namespace JiShe.IoT.DeviceAggregation throw; } } + + /// + /// 发送OneNET平台设备指令 + /// + /// + /// + /// + /// + public async Task DeviceCommandInfoToOneNET(DeviceManagementInfoDto deviceInfo, OpenApiRequest commandRequest) + { + try + { + //检查下设备是否在线 + var deviceOnlineStatus = await oneNETDeviceService.DeviceInfoDetailAsync(new DeviceInfoDetailInput() + { + DeviceName = deviceInfo.IoTPlatformDeviceOpenInfo, + OneNETAccountId = deviceInfo.IoTPlatformAccountId, + ProductId = deviceInfo.IoTPlatformProductId, + }); + + if (deviceOnlineStatus == null || deviceOnlineStatus.Code != ResponeResultEnum.Success) + { + throw new UserFriendlyException("获取平台设备信息失败"); + } + + if (deviceOnlineStatus.Data.Status != 1) + { + throw new UserFriendlyException("设备不在线"); + } + + await producerService.ProduceAsync(KafkaTopicConsts.OneNETCommandIssuedEventName, $"{GuidGenerator.Create()}", commandRequest); + return true; + } + catch (Exception) + { + + throw; + } + } #endregion #region CTWing 设备操作 diff --git a/src/JiShe.IoT.Application/Subscribers/ServiceCommunicationChannelSubscriberService.cs b/src/JiShe.IoT.Application/Subscribers/ServiceCommunicationChannelSubscriberService.cs index 1cbfaab..2a5b3f1 100644 --- a/src/JiShe.IoT.Application/Subscribers/ServiceCommunicationChannelSubscriberService.cs +++ b/src/JiShe.IoT.Application/Subscribers/ServiceCommunicationChannelSubscriberService.cs @@ -83,6 +83,13 @@ namespace JiShe.ServicePro.OneNETManagement.Subscribers return SubscribeAck.Fail(); } + //更新设备数据缓存到Redis + DeviceCacheInfos deviceCacheInfos = deviceEntity.Adapt(); + deviceCacheInfos.IoTPlatformResponse = null; + deviceCacheInfos.PlatformPassword = null; + + RedisProvider.Instance.HSet(RedisConst.CacheAllDeviceInfoHashKey, deviceEntity.DeviceAddress, deviceCacheInfos); + return SubscribeAck.Success(); } catch (Exception) diff --git a/src/JiShe.IoT.HttpApi/Controllers/DeviceAggregationController.cs b/src/JiShe.IoT.HttpApi/Controllers/DeviceAggregationController.cs index 62b6d1d..9f49886 100644 --- a/src/JiShe.IoT.HttpApi/Controllers/DeviceAggregationController.cs +++ b/src/JiShe.IoT.HttpApi/Controllers/DeviceAggregationController.cs @@ -66,11 +66,25 @@ namespace JiShe.IoT.Controllers /// /// /// - [HttpPost("RepushDeviceInfoToIoTPlatform")] + [HttpPost(nameof(RepushDeviceInfoToIoTPlatform))] [SwaggerOperation(summary: "重新推送设备信息到物联网平台", Tags = new[] { "AggregationDevice" })] public Task RepushDeviceInfoToIoTPlatform(IdInput input) { return _deviceAggregationService.RepushDeviceInfoToIoTPlatform(input); } + + + /// + /// 发送设备指令信息 + /// + /// + /// + [HttpPost(nameof(DeviceCommandForApiAsync))] + [SwaggerOperation(summary: "发送设备指令信息", Tags = new[] { "AggregationDevice" })] + public Task DeviceCommandForApiAsync(DeviceCommandForApiInput input) + { + return _deviceAggregationService.DeviceCommandForApiAsync(input); + } + } }