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
///
///
///