优化代码

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. 58
      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 ITokenProviderService _tokenProviderService;
private readonly HttpClient _http;
// private readonly HttpClient _http;
private string mqttHostIp;
private int mqttHostPort;
@ -50,16 +50,16 @@ namespace Alarm.DomainService.DahAlarm
topicName = _configuration["SubscribeMQTT:TopicName"]!;
_mqttClientService = mqttClientService;
_tokenProviderService = tokenProviderService;
_http = http;
// _http = http;
}
///// <summary>
///// 开发测试的时候,忽略证书
///// </summary>
//private static readonly HttpClient _http = new(new HttpClientHandler
//{
// ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator,
//});
/// <summary>
/// 开发测试的时候,忽略证书
/// </summary>
private static readonly HttpClient _http = new(new HttpClientHandler
{
ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator,
});
/// <summary>
/// 新增报警事件订阅
@ -209,8 +209,8 @@ 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\":\"残卫测试报警按钮.alarmStat\",\"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() + "\"}]";
await _mqttClient.EnsureConnectedAsync(mqttHostIp, mqttHostPort, mqttUsername, mqttPassword, topicName, mqttClientId);
await _mqttClientService.PublishAsync(topicName, payload);
@ -288,8 +288,8 @@ namespace Alarm.DomainService.DahAlarm
_logger.LogWarning("获取事件列表: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-event/1.0.0/subscribe/subscribe-list?monitorType=url&category={name}";
// 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}";
try
{

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

@ -1,6 +1,8 @@
using Common.Shared.Application.DaHua;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using MongoDB.Bson;
using OfficeOpenXml.FormulaParsing.LexicalAnalysis;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
using System.Net.Http.Json;
@ -34,12 +36,18 @@ namespace Common.Shared.DomainService
public async Task<string> GetTokenAsync(string clientId)
{
if (TokenCache.TokenMap.TryGetValue(clientId, out var tokenEntry)
&& tokenEntry.ExpireAt > DateTimeOffset.UtcNow.AddMinutes(5))
&& tokenEntry.ExpireAt > DateTimeOffset.UtcNow.AddMinutes(1))
{
return tokenEntry.AccessToken!;
if (!IsTokenValid(tokenEntry.AccessToken!))
{
_logger.LogWarning("从字典里匹配");
return tokenEntry.AccessToken!;
}
}
var tokenLock = TokenLockProvider.GetLock(clientId);
_logger.LogWarning("枷锁");
await tokenLock.WaitAsync();
try
{
@ -47,7 +55,12 @@ namespace Common.Shared.DomainService
if (TokenCache.TokenMap.TryGetValue(clientId, out tokenEntry)
&& tokenEntry.ExpireAt > DateTimeOffset.UtcNow.AddMinutes(5))
{
return tokenEntry.AccessToken!;
if (!IsTokenValid(tokenEntry.AccessToken!))
{
_logger.LogWarning("再次匹配");
return tokenEntry.AccessToken!;
}
}
var refreshed = await TryRefreshOrLoginAsync(clientId, tokenEntry);
@ -137,7 +150,8 @@ namespace Common.Shared.DomainService
dto.ClientSecret = _configuration["DahuaAuth:ClientSecret"]!;
dto.Password = _configuration["DahuaAuth:Password"]!;
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);
TokenEntry refreshed = new()
@ -207,10 +221,11 @@ namespace Common.Shared.DomainService
try
{
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);
resp.EnsureSuccessStatusCode();
var json = await resp.Content.ReadAsStringAsync();
_logger.LogWarning($"获取密钥的结果json{json}");
var envelope = JsonSerializer.Deserialize<DaHApiResult<PublicKeyDto>>(json, new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
@ -230,7 +245,7 @@ namespace Common.Shared.DomainService
}
catch (Exception ex)
{
_logger.LogWarning(ex, "大华平台获取公钥出错");
_logger.LogWarning(ex, $"大华平台获取公钥出错{ex.Message}");
result.Success = false;
result.Code = "1001";
result.Msg = "获取大华公钥失败";
@ -267,33 +282,44 @@ namespace Common.Shared.DomainService
{
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!);
using var resp = await _http.PostAsJsonAsync(url, dto);
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>>();
_logger.LogWarning($"获取大华登录令牌返回结果:{tokenInfo.ToJson()}");
if (tokenInfo == null || !result.Success || result.Code != "0")
{
result.Success = false;
result.Code = "1004";
result.Msg = "获取大华登录令牌失败";
_logger.LogWarning("获取大华登录令牌失败,返回结果:{Result}", result);
_logger.LogWarning($"获取大华登录令牌失败,返回结果:{result}");
}
result = tokenInfo!;
//固定的拼接方式
result.Data!.AccessToken = string.Concat(tokenInfo?.Data!.TokenType, " ", tokenInfo?.Data!.AccessToken);
TokenEntry refreshed = new TokenEntry
if (tokenInfo?.Data!.AccessToken != null && tokenInfo?.Data!.AccessToken.Length > 1)
{
AccessToken = string.Concat(result!.Data.TokenType, " ", result.Data.AccessToken),
result.Data!.AccessToken = string.Concat(tokenInfo?.Data!.TokenType, " ", tokenInfo?.Data!.AccessToken);
TokenEntry refreshed = new TokenEntry
{
AccessToken = string.Concat(result!.Data.TokenType, " ", result.Data.AccessToken),
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)
{
_logger.LogError(ex, "获取大华登录令牌出错");
_logger.LogError(ex, $"获取大华登录令牌出错{ex.Message}");
result.Success = false;
result.Code = "1004";
result.Msg = "获取大华登录令牌失败";

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

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

Loading…
Cancel
Save