From db210633c72913440f563736fad030f3f8aa30a5 Mon Sep 17 00:00:00 2001 From: LiuXin Date: Sun, 17 Aug 2025 15:32:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=97=AE=E9=A2=98=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ResponeDto/EventEnvelopeDto.cs | 98 +++++++++++++++++++ .../DahAlarm/DahuaGeneralCtlService.cs | 98 ++++++++++++++++--- .../DahAlarm/IDahuaGeneralCtlService.cs | 4 + .../Controllers/AlarmController.cs | 23 +++++ .../AlarmService.API/appsettings.json | 2 +- .../DaHua/DaHApiResult.cs | 15 --- .../Dahvision/DahuaGeneralCtlService.cs | 1 + 7 files changed, 213 insertions(+), 28 deletions(-) diff --git a/WeiCloud.Fusion/AlarmService/Alarm.Application/ResponeDto/EventEnvelopeDto.cs b/WeiCloud.Fusion/AlarmService/Alarm.Application/ResponeDto/EventEnvelopeDto.cs index 101bb83..16b8c57 100644 --- a/WeiCloud.Fusion/AlarmService/Alarm.Application/ResponeDto/EventEnvelopeDto.cs +++ b/WeiCloud.Fusion/AlarmService/Alarm.Application/ResponeDto/EventEnvelopeDto.cs @@ -119,4 +119,102 @@ namespace Alarm.Application.ResponeDto [JsonPropertyName("extend")] public JsonElement? Extend { get; set; } } + + /// + /// 订阅映射配置 + /// 用于定义不同服务节点的订阅参数配置 + /// + public class SubscriptionMapDto + { + /// + /// 订阅配置字典 + /// 键:服务节点标识(格式:IP地址_端口号) + /// 值:该节点的订阅参数列表 + /// + public Dictionary>? Items { get; set; } = new Dictionary>(); + } + + /// + /// 订阅配置项 + /// 定义单个订阅的具体参数 + /// + public class SubscriptionConfig + { + /// + /// 订阅类型列表 + /// 可为空,表示订阅所有类型 + /// + [JsonPropertyName("types")] + public List? Types { get; set; } + + /// + /// 节点编码列表 + /// 可为空,表示订阅所有节点 + /// + [JsonPropertyName("nodeCodes")] + public List? NodeCodes { get; set; } + + /// + /// 组织机构列表 + /// 可为空,表示订阅所有组织 + /// + [JsonPropertyName("orgs")] + public List? Orgs { get; set; } + + /// + /// 等级列表 + /// 可为空,表示订阅所有等级 + /// + [JsonPropertyName("grades")] + public List? Grades { get; set; } + + /// + /// 域订阅级别 + /// 枚举值: + /// 0 = 不订阅 + /// 1 = 订阅本域 + /// 2 = 订阅本域及下级域 + /// + [JsonPropertyName("domainSubscribe")] + public int DomainSubscribe { get; set; } + + /// + /// 传输方案 + /// 枚举值: + /// 0 = HTTP + /// 1 = HTTPS + /// 2 = WebSocket + /// 3 = MQTT + /// + [JsonPropertyName("scheme")] + public int Scheme { get; set; } + + /// + /// 事件类型 + /// 枚举值: + /// 0 = 所有事件 + /// 1 = 告警事件 + /// 2 = 状态事件 + /// 3 = 操作事件 + /// + [JsonPropertyName("eventType")] + public int EventType { get; set; } + + /// + /// 监控回调地址 + /// 接收事件推送的目标URL + /// + [JsonPropertyName("monitor")] + public string Monitor { get; set; } = string.Empty; + + /// + /// 监控类型 + /// 枚举值: + /// "url" = HTTP/HTTPS 回调 + /// "websocket" = WebSocket 连接 + /// "queue" = 消息队列 + /// + [JsonPropertyName("monitorType")] + public string MonitorType { get; set; } = string.Empty; + } } \ No newline at end of file diff --git a/WeiCloud.Fusion/AlarmService/Alarm.DomainService/DahAlarm/DahuaGeneralCtlService.cs b/WeiCloud.Fusion/AlarmService/Alarm.DomainService/DahAlarm/DahuaGeneralCtlService.cs index 46f4b83..9ca05cc 100644 --- a/WeiCloud.Fusion/AlarmService/Alarm.DomainService/DahAlarm/DahuaGeneralCtlService.cs +++ b/WeiCloud.Fusion/AlarmService/Alarm.DomainService/DahAlarm/DahuaGeneralCtlService.cs @@ -4,15 +4,13 @@ using Common.Shared.Application.DaHua; using Common.Shared.DomainService; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; -using MongoDB.Bson; -using Org.BouncyCastle.Crypto.Parameters; -using Org.BouncyCastle.Security; -using System; +using NewLife.Remoting; +using OfficeOpenXml.FormulaParsing.LexicalAnalysis; +using Org.BouncyCastle.Ocsp; +using System.Net.Http.Headers; using System.Net.Http.Json; -using System.Security.Cryptography; using System.Text.Json; using System.Text.Json.Serialization; -using WeiCloud.Core.BaseModels; namespace Alarm.DomainService.DahAlarm { @@ -59,9 +57,9 @@ namespace Alarm.DomainService.DahAlarm /// /// 开发测试的时候,忽略证书 /// - private static readonly HttpClient _http = new HttpClient(new HttpClientHandler + private static readonly HttpClient _http = new(new HttpClientHandler { - ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator + ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator, }); /// @@ -206,11 +204,11 @@ namespace Alarm.DomainService.DahAlarm if (dto.Info.AlarmType == 4321) { //拼接物联平台标准的mqtt消息格式 - var payload = "[{\"taglabel\":\"" + dto.Info.DeviceCode + " + \".alart.\" + " + dto.Info.DeviceName + "\",\"value\":\"" + dto.Info.AlarmStat + "\",\"time\":\"" + DateTimeOffset.UtcNow.ToUnixTimeSeconds() + "\"}]"; + var payload = "[{\"taglabel\":\"" + dto.Info.DeviceCode + ".alart." + dto.Info.DeviceName + "\",\"value\":\"" + dto.Info.AlarmStat + "\",\"time\":\"" + DateTimeOffset.UtcNow.ToUnixTimeSeconds() + "\"}]"; await _mqttClient.EnsureConnectedAsync(mqttHostIp, mqttHostPort, mqttUsername, mqttPassword, topicName, mqttClientId); - await _mqttClientService.PublishAsync("/zrh/sun/alarm", payload); + await _mqttClientService.PublishAsync(topicName, payload); } } } @@ -229,9 +227,85 @@ namespace Alarm.DomainService.DahAlarm /// /// /// - public async Task> DeleteSubscribe(string name) + public async Task DeleteEvent(string name) { - throw new NotImplementedException("该方法未实现"); + var clientId = _configuration["DahuaAuth:ClientId"]; + var token = await _tokenProviderService.GetTokenAsync(clientId!); + + var url = $"https://{_configuration["DahuaAuth:Host"]}/evo-apigw/evo-event/1.0.0/subscribe/mqinfo?name={name}"; + + try + { + var request = new HttpRequestMessage(HttpMethod.Delete, url); + request.Headers.Authorization = new AuthenticationHeaderValue("Authorization", token); + + using var resp = await _http.SendAsync(request); + var body = await resp.Content.ReadAsStringAsync(); + + if (!resp.IsSuccessStatusCode) + { + _logger.LogWarning("实时流请求 HTTP 失败: {Status}, Body: {Body}", (int)resp.StatusCode, body); + return false; + } + + var result = JsonSerializer.Deserialize>(body); + if (result == null || !result.Success) + { + _logger.LogWarning("实时流请求业务失败: {Body}", body); + return false; + } + + return true; + } + catch (Exception ex) + { + _logger.LogError(ex, "大华实时流请求出错"); + return false; + } + } + + /// + /// 获取事件列表 + /// + /// + /// + /// + public async Task> GetEventList(string name = "alarm") + { + var clientId = _configuration["DahuaAuth:ClientId"]; + var token = await _tokenProviderService.GetTokenAsync(clientId!); + + var url = $"https://{_configuration["DahuaAuth:Host"]}/evo-apigw/evo-event/1.0.0/subscribe/subscribe-list?monitorType=url&category={name}"; + + try + { + var request = new HttpRequestMessage(HttpMethod.Get, url); + + request.Headers.TryAddWithoutValidation("Authorization", token); + + using var resp = await _http.SendAsync(request); + var body = await resp.Content.ReadAsStringAsync(); + + if (!resp.IsSuccessStatusCode) + { + _logger.LogWarning("实时流请求 HTTP 失败: {Status}, Body: {Body}", (int)resp.StatusCode, body); + return new DaHApiResult { Success = false, Code = "1010", Msg = $"HTTP错误 {(int)resp.StatusCode}" }; + } + + var result = JsonSerializer.Deserialize>(body); + if (result == null || !result.Success) + { + _logger.LogWarning("实时流请求业务失败: {Body}", body); + return new DaHApiResult { Success = false, Code = "1010", Msg = "实时流请求失败" }; + } + + return result; + } + catch (Exception ex) + { + _logger.LogError(ex, "大华实时流请求出错"); + return new DaHApiResult { Success = false, Code = "1010", Msg = "实时流请求失败" }; + } } /// diff --git a/WeiCloud.Fusion/AlarmService/Alarm.DomainService/DahAlarm/IDahuaGeneralCtlService.cs b/WeiCloud.Fusion/AlarmService/Alarm.DomainService/DahAlarm/IDahuaGeneralCtlService.cs index bbd1009..b4a7032 100644 --- a/WeiCloud.Fusion/AlarmService/Alarm.DomainService/DahAlarm/IDahuaGeneralCtlService.cs +++ b/WeiCloud.Fusion/AlarmService/Alarm.DomainService/DahAlarm/IDahuaGeneralCtlService.cs @@ -16,6 +16,10 @@ namespace Alarm.DomainService.DahAlarm /// Task> AddSubscribeEvent(); + Task DeleteEvent(string name); + + Task> GetEventList(string name = "alarm"); + /// /// AddSubscribeEvent回调函数处理 /// diff --git a/WeiCloud.Fusion/AlarmService/AlarmService.API/Controllers/AlarmController.cs b/WeiCloud.Fusion/AlarmService/AlarmService.API/Controllers/AlarmController.cs index e4b842b..4572081 100644 --- a/WeiCloud.Fusion/AlarmService/AlarmService.API/Controllers/AlarmController.cs +++ b/WeiCloud.Fusion/AlarmService/AlarmService.API/Controllers/AlarmController.cs @@ -40,5 +40,28 @@ namespace AlarmService.API.Controllers { return await _generalCtlService.HandleAsync(env); } + + /// + /// 获取监听报警列表 + /// + /// + /// + [HttpGet] + public async Task> GetEventList(string name = "alarm") + + { + return await _generalCtlService.GetEventList(name); + } + + /// + /// 取消订阅某个事件 + /// + /// + /// + [HttpDelete] + public async Task DeleteEvent(string name) + { + return await _generalCtlService.DeleteEvent(name); + } } } \ No newline at end of file diff --git a/WeiCloud.Fusion/AlarmService/AlarmService.API/appsettings.json b/WeiCloud.Fusion/AlarmService/AlarmService.API/appsettings.json index 0f4b3cb..acba8f5 100644 --- a/WeiCloud.Fusion/AlarmService/AlarmService.API/appsettings.json +++ b/WeiCloud.Fusion/AlarmService/AlarmService.API/appsettings.json @@ -6,7 +6,7 @@ } }, "SubscribeMQTT": { - "TopicName": "datasource_points_AXYJPT_v4", + "TopicName": "/zrh/sun/alarm", "ProjectId": 530522108656160, "HostIP": "v4.weienergy.cn", "HostPort": 18883, diff --git a/WeiCloud.Fusion/Common.SharedService/Common.Shared.Application/DaHua/DaHApiResult.cs b/WeiCloud.Fusion/Common.SharedService/Common.Shared.Application/DaHua/DaHApiResult.cs index 0dff463..5ea77e7 100644 --- a/WeiCloud.Fusion/Common.SharedService/Common.Shared.Application/DaHua/DaHApiResult.cs +++ b/WeiCloud.Fusion/Common.SharedService/Common.Shared.Application/DaHua/DaHApiResult.cs @@ -70,19 +70,4 @@ namespace Common.Shared.Application.DaHua writer.WriteStringValue(value); } } - - public class DaHApiDescResult - { - [JsonPropertyName("code")] - public int Code { get; set; } // 修改为 int 类型 - - [JsonPropertyName("desc")] // 修改为 "desc" 而不是 "errMsg" - public string Desc { get; set; } - - [JsonPropertyName("data")] - public T Data { get; set; } - - [JsonPropertyName("success")] - public bool Success { get; set; } - } } \ No newline at end of file diff --git a/WeiCloud.Fusion/VideoService/Video.DomainService/Dahvision/DahuaGeneralCtlService.cs b/WeiCloud.Fusion/VideoService/Video.DomainService/Dahvision/DahuaGeneralCtlService.cs index 77f936d..c272069 100644 --- a/WeiCloud.Fusion/VideoService/Video.DomainService/Dahvision/DahuaGeneralCtlService.cs +++ b/WeiCloud.Fusion/VideoService/Video.DomainService/Dahvision/DahuaGeneralCtlService.cs @@ -355,6 +355,7 @@ namespace Video.DomainService /// /// rtsp实时预览接口方式 + /// (播放命令:ffplay -rtsp_transport tcp -i "rtsp://demo.weienergy.cn:15210/dss/monitor/param/cameraid=1000021%24104%26substream=1?token=68")强制走tcp /// /// /// -- 2.36.2