优化代码

pull/18/head
刘鑫 3 months ago
parent 7b75053f63
commit 7203fb1cb2
  1. 26
      WeiCloud.Fusion/AlarmService/Alarm.DomainService/DahAlarm/DahuaGeneralCtlService.cs
  2. 6
      WeiCloud.Fusion/AlarmService/AlarmService.API/appsettings.json
  3. 44
      WeiCloud.Fusion/Common.SharedService/Common.Shared.DomainService/DaHTokenService/TokenProviderService.cs
  4. 8
      WeiCloud.Fusion/VideoService/Video.API/Program.cs
  5. 38
      WeiCloud.Fusion/VideoService/Video.DomainService/Dahvision/DahuaGeneralCtlService.cs

@ -18,7 +18,7 @@ namespace Alarm.DomainService.DahAlarm
private readonly IMqttClientService _mqttClientService; private readonly IMqttClientService _mqttClientService;
private readonly ITokenProviderService _tokenProviderService; private readonly ITokenProviderService _tokenProviderService;
private readonly HttpClient _http; // private readonly HttpClient _http;
private string mqttHostIp; private string mqttHostIp;
private int mqttHostPort; private int mqttHostPort;
@ -50,16 +50,16 @@ namespace Alarm.DomainService.DahAlarm
topicName = _configuration["SubscribeMQTT:TopicName"]!; topicName = _configuration["SubscribeMQTT:TopicName"]!;
_mqttClientService = mqttClientService; _mqttClientService = mqttClientService;
_tokenProviderService = tokenProviderService; _tokenProviderService = tokenProviderService;
_http = http; // _http = http;
} }
///// <summary> /// <summary>
///// 开发测试的时候,忽略证书 /// 开发测试的时候,忽略证书
///// </summary> /// </summary>
//private static readonly HttpClient _http = new(new HttpClientHandler private static readonly HttpClient _http = new(new HttpClientHandler
//{ {
// ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator, ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator,
//}); });
/// <summary> /// <summary>
/// 新增报警事件订阅 /// 新增报警事件订阅
@ -209,8 +209,8 @@ namespace Alarm.DomainService.DahAlarm
if (dto.Info.AlarmType == 4321) if (dto.Info.AlarmType == 4321)
{ {
//拼接物联平台标准的mqtt消息格式 //拼接物联平台标准的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() + "\"}]";
var payload = "[{\"taglabel\":\"残卫测试报警按钮.alarmStat\",\"value\":\"" + dto.Info.AlarmStat + "\",\"time\":\"" + DateTimeOffset.UtcNow.ToUnixTimeSeconds() + "\"}]"; // var payload = "[{\"taglabel\":\"残卫测试报警按钮.alarmStat\",\"value\":\"" + dto.Info.AlarmStat + "\",\"time\":\"" + DateTimeOffset.UtcNow.ToUnixTimeSeconds() + "\"}]";
await _mqttClient.EnsureConnectedAsync(mqttHostIp, mqttHostPort, mqttUsername, mqttPassword, topicName, mqttClientId); await _mqttClient.EnsureConnectedAsync(mqttHostIp, mqttHostPort, mqttUsername, mqttPassword, topicName, mqttClientId);
await _mqttClientService.PublishAsync(topicName, payload); await _mqttClientService.PublishAsync(topicName, payload);
@ -288,8 +288,8 @@ namespace Alarm.DomainService.DahAlarm
_logger.LogWarning("获取事件列表:token无效"); _logger.LogWarning("获取事件列表:token无效");
return new DaHApiResult<SubscriptionMapDto> { Success = false, Code = "1009", Msg = "token无效" }; return new DaHApiResult<SubscriptionMapDto> { Success = false, Code = "1009", Msg = "token无效" };
} }
var url = $"https://{_configuration["DahuaAuth:Host"]}/evo-apigw/evo-brm/1.0.0/device/1000021"; // var url = $"https://{_configuration["DahuaAuth:Host"]}/evo-apigw/evo-brm/1.0.0/device/1000021";
//var url = $"https://{_configuration["DahuaAuth:Host"]}/evo-apigw/evo-event/1.0.0/subscribe/subscribe-list?monitorType=url&category={name}"; var url = $"https://{_configuration["DahuaAuth:Host"]}/evo-apigw/evo-event/1.0.0/subscribe/subscribe-list?monitorType=url&category={name}";
try try
{ {

@ -27,8 +27,8 @@
"ClientSecret": "6d6c78f8-3d4c-4e76-ab6b-827942a7b725", "ClientSecret": "6d6c78f8-3d4c-4e76-ab6b-827942a7b725",
"Username": "system", "Username": "system",
"Password": "Admin123", "Password": "Admin123",
"Callback": "http://demo.weienergy.cn:5000/api/Alarm/DahuaAuthCallback", "Callback": "http://demo.weienergy.cn/axalarm/api/Alarm/DahuaAuthCallback",
"SubsystemName": "192.168.21.43_alarm", "SubsystemName": "59.110.150.214_alarm",
"SubsystemMagic": "192.168.21.43_5001" "SubsystemMagic": "59.110.150.214_12013"
} }
} }

@ -1,6 +1,8 @@
using Common.Shared.Application.DaHua; using Common.Shared.Application.DaHua;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using MongoDB.Bson;
using OfficeOpenXml.FormulaParsing.LexicalAnalysis;
using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security; using Org.BouncyCastle.Security;
using System.Net.Http.Json; using System.Net.Http.Json;
@ -34,12 +36,18 @@ namespace Common.Shared.DomainService
public async Task<string> GetTokenAsync(string clientId) public async Task<string> GetTokenAsync(string clientId)
{ {
if (TokenCache.TokenMap.TryGetValue(clientId, out var tokenEntry) if (TokenCache.TokenMap.TryGetValue(clientId, out var tokenEntry)
&& tokenEntry.ExpireAt > DateTimeOffset.UtcNow.AddMinutes(5)) && tokenEntry.ExpireAt > DateTimeOffset.UtcNow.AddMinutes(1))
{
if (!IsTokenValid(tokenEntry.AccessToken!))
{ {
_logger.LogWarning("从字典里匹配");
return tokenEntry.AccessToken!; return tokenEntry.AccessToken!;
} }
}
var tokenLock = TokenLockProvider.GetLock(clientId); var tokenLock = TokenLockProvider.GetLock(clientId);
_logger.LogWarning("枷锁");
await tokenLock.WaitAsync(); await tokenLock.WaitAsync();
try try
{ {
@ -47,8 +55,13 @@ namespace Common.Shared.DomainService
if (TokenCache.TokenMap.TryGetValue(clientId, out tokenEntry) if (TokenCache.TokenMap.TryGetValue(clientId, out tokenEntry)
&& tokenEntry.ExpireAt > DateTimeOffset.UtcNow.AddMinutes(5)) && tokenEntry.ExpireAt > DateTimeOffset.UtcNow.AddMinutes(5))
{ {
if (!IsTokenValid(tokenEntry.AccessToken!))
{
_logger.LogWarning("再次匹配");
return tokenEntry.AccessToken!; return tokenEntry.AccessToken!;
} }
}
var refreshed = await TryRefreshOrLoginAsync(clientId, tokenEntry); var refreshed = await TryRefreshOrLoginAsync(clientId, tokenEntry);
@ -137,7 +150,8 @@ namespace Common.Shared.DomainService
dto.ClientSecret = _configuration["DahuaAuth:ClientSecret"]!; dto.ClientSecret = _configuration["DahuaAuth:ClientSecret"]!;
dto.Password = _configuration["DahuaAuth:Password"]!; dto.Password = _configuration["DahuaAuth:Password"]!;
dto.Username = _configuration["DahuaAuth:Username"]!; dto.Username = _configuration["DahuaAuth:Username"]!;
_logger.LogWarning("在GetDaHToken方法中的记录:Dahua Host = {Host}, ClientId = {ClientId}",
_configuration["DahuaAuth:Host"], _configuration["DahuaAuth:ClientId"], _configuration["DahuaAuth:ClientSecret"]);
DaHApiResult<LoginResDto> loginResult = await GetToken(dto); DaHApiResult<LoginResDto> loginResult = await GetToken(dto);
TokenEntry refreshed = new() TokenEntry refreshed = new()
@ -207,10 +221,11 @@ namespace Common.Shared.DomainService
try try
{ {
var url = $"https://{_configuration["DahuaAuth:Host"]}/evo-apigw/evo-oauth/1.0.0/oauth/public-key"; var url = $"https://{_configuration["DahuaAuth:Host"]}/evo-apigw/evo-oauth/1.0.0/oauth/public-key";
_logger.LogWarning($"获取的url{url}");
using var resp = await _http.GetAsync(url); using var resp = await _http.GetAsync(url);
resp.EnsureSuccessStatusCode(); resp.EnsureSuccessStatusCode();
var json = await resp.Content.ReadAsStringAsync(); var json = await resp.Content.ReadAsStringAsync();
_logger.LogWarning($"获取密钥的结果json{json}");
var envelope = JsonSerializer.Deserialize<DaHApiResult<PublicKeyDto>>(json, new JsonSerializerOptions var envelope = JsonSerializer.Deserialize<DaHApiResult<PublicKeyDto>>(json, new JsonSerializerOptions
{ {
PropertyNameCaseInsensitive = true PropertyNameCaseInsensitive = true
@ -230,7 +245,7 @@ namespace Common.Shared.DomainService
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogWarning(ex, "大华平台获取公钥出错"); _logger.LogWarning(ex, $"大华平台获取公钥出错{ex.Message}");
result.Success = false; result.Success = false;
result.Code = "1001"; result.Code = "1001";
result.Msg = "获取大华公钥失败"; result.Msg = "获取大华公钥失败";
@ -267,23 +282,26 @@ namespace Common.Shared.DomainService
{ {
var url = $"https://{_configuration["DahuaAuth:Host"]}/evo-apigw/evo-oauth/1.0.0/oauth/extend/token"; var url = $"https://{_configuration["DahuaAuth:Host"]}/evo-apigw/evo-oauth/1.0.0/oauth/extend/token";
//必须加密 //必须加密
_logger.LogWarning($"获取token的url{url}");
_logger.LogWarning($"获取token的dto的json{dto.ToJson()}");
dto.Password = EncryptByPublicKey(dto.Password, dto.PublicKey!); dto.Password = EncryptByPublicKey(dto.Password, dto.PublicKey!);
using var resp = await _http.PostAsJsonAsync(url, dto); using var resp = await _http.PostAsJsonAsync(url, dto);
resp.EnsureSuccessStatusCode(); resp.EnsureSuccessStatusCode();
_logger.LogWarning("这是正式请求的:Dahua Host = {Host}, ClientId = {ClientId},ClientSecret={ClientSecret}", _configuration["DahuaAuth:Host"], _configuration["DahuaAuth:ClientId"], _configuration["DahuaAuth:ClientSecret"]);
var tokenInfo = await resp.Content.ReadFromJsonAsync<DaHApiResult<LoginResDto>>(); var tokenInfo = await resp.Content.ReadFromJsonAsync<DaHApiResult<LoginResDto>>();
_logger.LogWarning($"获取大华登录令牌返回结果:{tokenInfo.ToJson()}");
if (tokenInfo == null || !result.Success || result.Code != "0") if (tokenInfo == null || !result.Success || result.Code != "0")
{ {
result.Success = false; result.Success = false;
result.Code = "1004"; result.Code = "1004";
result.Msg = "获取大华登录令牌失败"; result.Msg = "获取大华登录令牌失败";
_logger.LogWarning("获取大华登录令牌失败,返回结果:{Result}", result); _logger.LogWarning($"获取大华登录令牌失败,返回结果:{result}");
} }
result = tokenInfo!; result = tokenInfo!;
//固定的拼接方式 //固定的拼接方式
if (tokenInfo?.Data!.AccessToken != null && tokenInfo?.Data!.AccessToken.Length > 1)
{
result.Data!.AccessToken = string.Concat(tokenInfo?.Data!.TokenType, " ", tokenInfo?.Data!.AccessToken); result.Data!.AccessToken = string.Concat(tokenInfo?.Data!.TokenType, " ", tokenInfo?.Data!.AccessToken);
TokenEntry refreshed = new TokenEntry TokenEntry refreshed = new TokenEntry
{ {
AccessToken = string.Concat(result!.Data.TokenType, " ", result.Data.AccessToken), AccessToken = string.Concat(result!.Data.TokenType, " ", result.Data.AccessToken),
@ -291,9 +309,17 @@ namespace Common.Shared.DomainService
ExpireAt = DateTimeOffset.UtcNow.AddSeconds(result.Data.ExpiresIn) ExpireAt = DateTimeOffset.UtcNow.AddSeconds(result.Data.ExpiresIn)
}; };
} }
else
{
result.Success = false;
result.Code = "1006";
result.Msg = "没拿到token";
_logger.LogWarning($"获取大华登录令牌失败,返回结果:{result}");
}
}
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError(ex, "获取大华登录令牌出错"); _logger.LogError(ex, $"获取大华登录令牌出错{ex.Message}");
result.Success = false; result.Success = false;
result.Code = "1004"; result.Code = "1004";
result.Msg = "获取大华登录令牌失败"; result.Msg = "获取大华登录令牌失败";

@ -41,8 +41,8 @@ namespace Video.API
builder => builder =>
{ {
builder builder
.WithOrigins(isconfig.CorsWithOrigins) //被允许的来源,多个使用逗号分隔 // .WithOrigins(isconfig.CorsWithOrigins) //被允许的来源,多个使用逗号分隔
//.AllowAnyOrigin() //允许所有源访问本API(开发环境设置) .AllowAnyOrigin() //允许所有源访问本API(开发环境设置)
.AllowAnyHeader() .AllowAnyHeader()
.AllowAnyMethod() .AllowAnyMethod()
.AllowCredentials() .AllowCredentials()
@ -150,9 +150,9 @@ namespace Video.API
}); });
} }
app.UseHttpsRedirection(); // app.UseHttpsRedirection();
app.UseAuthorization(); // app.UseAuthorization();
app.MapGet("/healthz", () => Results.Ok("OK")); app.MapGet("/healthz", () => Results.Ok("OK"));
app.MapControllers(); app.MapControllers();

@ -2,6 +2,7 @@
using Common.Shared.DomainService; using Common.Shared.DomainService;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using NPOI.XWPF.UserModel;
using System.Net.Http.Json; using System.Net.Http.Json;
using System.Text.Json; using System.Text.Json;
using Video.DomainService.Dahvision; using Video.DomainService.Dahvision;
@ -13,7 +14,7 @@ namespace Video.DomainService
private readonly ILogger<DahuaGeneralCtlService> _logger; private readonly ILogger<DahuaGeneralCtlService> _logger;
private readonly IConfiguration _configuration; private readonly IConfiguration _configuration;
private readonly ITokenProviderService _tokenProviderService; private readonly ITokenProviderService _tokenProviderService;
private readonly HttpClient _http; // private readonly HttpClient _http;
public DahuaGeneralCtlService(ILogger<DahuaGeneralCtlService> logger, IConfiguration configuration, ITokenProviderService tokenProviderService, HttpClient http) public DahuaGeneralCtlService(ILogger<DahuaGeneralCtlService> logger, IConfiguration configuration, ITokenProviderService tokenProviderService, HttpClient http)
{ {
@ -21,16 +22,16 @@ namespace Video.DomainService
_configuration = configuration; _configuration = configuration;
_tokenProviderService = tokenProviderService; _tokenProviderService = tokenProviderService;
_http = http; // _http = http;
} }
///// <summary> /// <summary>
///// 开发测试的时候,忽略证书 /// 开发测试的时候,忽略证书
///// </summary> /// </summary>
//private static readonly HttpClient _http = new HttpClient(new HttpClientHandler private static readonly HttpClient _http = new HttpClient(new HttpClientHandler
//{ {
// ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
//}); });
/// <summary> /// <summary>
/// hls等录像回放 /// hls等录像回放
@ -416,11 +417,12 @@ namespace Video.DomainService
if (dto == null || dto.Data == null) if (dto == null || dto.Data == null)
{ {
_logger.LogWarning("实时流请求失败:请求参数不能为空"); _logger.LogWarning("实时流请求失败:请求参数不能为空");
return new DaHApiResult<UrlDataDto> { Success = false, Code = "1009", Msg = "请求参数不能为空" }; return new DaHApiResult<UrlDataDto> { Success = false, Code = "1005", Msg = "请求参数不能为空" };
} }
var clientId = _configuration["DahuaAuth:ClientId"]; var clientId = _configuration["DahuaAuth:ClientId"];
var token = await _tokenProviderService.GetTokenAsync(clientId!); var token = await _tokenProviderService.GetTokenAsync(clientId!);
_logger.LogWarning($"我的token: {token}");
if (!_tokenProviderService.IsTokenValid(token)) if (!_tokenProviderService.IsTokenValid(token))
{ {
_logger.LogWarning("rtsp实时预览接口方式:token无效"); _logger.LogWarning("rtsp实时预览接口方式:token无效");
@ -432,7 +434,7 @@ namespace Video.DomainService
{ {
url = $"https://{ipaddress}/evo-apigw/admin/API/MTS/Video/StartVideo"; url = $"https://{ipaddress}/evo-apigw/admin/API/MTS/Video/StartVideo";
} }
_logger.LogWarning($"我的url: {url}");
using var req = new HttpRequestMessage(HttpMethod.Post, url) using var req = new HttpRequestMessage(HttpMethod.Post, url)
{ {
Content = JsonContent.Create(dto) // 等价于 PostAsJsonAsync,但和 req 绑定 Content = JsonContent.Create(dto) // 等价于 PostAsJsonAsync,但和 req 绑定
@ -447,14 +449,15 @@ namespace Video.DomainService
if (!resp.IsSuccessStatusCode) if (!resp.IsSuccessStatusCode)
{ {
_logger.LogWarning("实时流请求 HTTP 失败: {Status}, Body: {Body}", (int)resp.StatusCode, body); _logger.LogWarning("实时流请求 HTTP 失败: {Status}, Body: {Body}", (int)resp.StatusCode, body);
return new DaHApiResult<UrlDataDto> { Success = false, Code = "1010", Msg = $"HTTP错误 {(int)resp.StatusCode}" }; _logger.LogWarning($"{resp.StatusCode}: {body}");
return new DaHApiResult<UrlDataDto> { Success = false, Code = "1014", Msg = $"HTTP错误 {(int)resp.StatusCode}" };
} }
_logger.LogWarning($"大华实时流请求返回body{body}");
var result = JsonSerializer.Deserialize<DaHApiResult<UrlDataDto>>(body); var result = JsonSerializer.Deserialize<DaHApiResult<UrlDataDto>>(body);
if (result == null || !result.Success) if (result == null || !result.Success)
{ {
_logger.LogWarning("实时流请求业务失败: {Body}", body); _logger.LogWarning("实时流请求业务反序列化失败: {Body}", body);
return new DaHApiResult<UrlDataDto> { Success = false, Code = "1010", Msg = "实时流请求失败" }; return new DaHApiResult<UrlDataDto> { Success = false, Code = "1013", Msg = "实时流请求业务反序列化失败" };
} }
result.Data!.Url = UrlHostReplacer.ReplaceHost( result.Data!.Url = UrlHostReplacer.ReplaceHost(
result.Data.Url, result.Data.Url,
@ -466,8 +469,9 @@ namespace Video.DomainService
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError(ex, "大华实时流请求出错"); _logger.LogError(ex, $"大华实时流请求出错{ex.Message}");
return new DaHApiResult<UrlDataDto> { Success = false, Code = "1010", Msg = "实时流请求失败" }; _logger.LogWarning($"{ex.Message}");
return new DaHApiResult<UrlDataDto> { Success = false, Code = "1012", Msg = $"实时流请求失败{ex.Message}" };
} }
} }

Loading…
Cancel
Save