diff --git a/WeiCloud.Fusion/AlarmService/Alarm.DomainService/DahAlarm/DahuaGeneralCtlService.cs b/WeiCloud.Fusion/AlarmService/Alarm.DomainService/DahAlarm/DahuaGeneralCtlService.cs index 03f6bee..829c51f 100644 --- a/WeiCloud.Fusion/AlarmService/Alarm.DomainService/DahAlarm/DahuaGeneralCtlService.cs +++ b/WeiCloud.Fusion/AlarmService/Alarm.DomainService/DahAlarm/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; } - ///// - ///// 开发测试的时候,忽略证书 - ///// - //private static readonly HttpClient _http = new(new HttpClientHandler - //{ - // ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator, - //}); + /// + /// 开发测试的时候,忽略证书 + /// + private static readonly HttpClient _http = new(new HttpClientHandler + { + ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator, + }); /// /// 新增报警事件订阅 @@ -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 { 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 { diff --git a/WeiCloud.Fusion/AlarmService/AlarmService.API/appsettings.json b/WeiCloud.Fusion/AlarmService/AlarmService.API/appsettings.json index 128b131..ea44d24 100644 --- a/WeiCloud.Fusion/AlarmService/AlarmService.API/appsettings.json +++ b/WeiCloud.Fusion/AlarmService/AlarmService.API/appsettings.json @@ -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" } } \ No newline at end of file diff --git a/WeiCloud.Fusion/Common.SharedService/Common.Shared.DomainService/DaHTokenService/TokenProviderService.cs b/WeiCloud.Fusion/Common.SharedService/Common.Shared.DomainService/DaHTokenService/TokenProviderService.cs index 602ce25..a05af23 100644 --- a/WeiCloud.Fusion/Common.SharedService/Common.Shared.DomainService/DaHTokenService/TokenProviderService.cs +++ b/WeiCloud.Fusion/Common.SharedService/Common.Shared.DomainService/DaHTokenService/TokenProviderService.cs @@ -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 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 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>(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>(); - + _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 = "获取大华登录令牌失败"; diff --git a/WeiCloud.Fusion/VideoService/Video.API/Program.cs b/WeiCloud.Fusion/VideoService/Video.API/Program.cs index 45bc79b..d28df52 100644 --- a/WeiCloud.Fusion/VideoService/Video.API/Program.cs +++ b/WeiCloud.Fusion/VideoService/Video.API/Program.cs @@ -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(); diff --git a/WeiCloud.Fusion/VideoService/Video.DomainService/Dahvision/DahuaGeneralCtlService.cs b/WeiCloud.Fusion/VideoService/Video.DomainService/Dahvision/DahuaGeneralCtlService.cs index 4cd968b..5f3a217 100644 --- a/WeiCloud.Fusion/VideoService/Video.DomainService/Dahvision/DahuaGeneralCtlService.cs +++ b/WeiCloud.Fusion/VideoService/Video.DomainService/Dahvision/DahuaGeneralCtlService.cs @@ -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 _logger; private readonly IConfiguration _configuration; private readonly ITokenProviderService _tokenProviderService; - private readonly HttpClient _http; + // private readonly HttpClient _http; public DahuaGeneralCtlService(ILogger logger, IConfiguration configuration, ITokenProviderService tokenProviderService, HttpClient http) { @@ -21,16 +22,16 @@ namespace Video.DomainService _configuration = configuration; _tokenProviderService = tokenProviderService; - _http = http; + // _http = http; } - ///// - ///// 开发测试的时候,忽略证书 - ///// - //private static readonly HttpClient _http = new HttpClient(new HttpClientHandler - //{ - // ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator - //}); + /// + /// 开发测试的时候,忽略证书 + /// + private static readonly HttpClient _http = new HttpClient(new HttpClientHandler + { + ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator + }); /// /// hls等录像回放 @@ -416,11 +417,12 @@ namespace Video.DomainService if (dto == null || dto.Data == null) { _logger.LogWarning("实时流请求失败:请求参数不能为空"); - return new DaHApiResult { Success = false, Code = "1009", Msg = "请求参数不能为空" }; + return new DaHApiResult { 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 { Success = false, Code = "1010", Msg = $"HTTP错误 {(int)resp.StatusCode}" }; + _logger.LogWarning($"{resp.StatusCode}: {body}"); + return new DaHApiResult { Success = false, Code = "1014", Msg = $"HTTP错误 {(int)resp.StatusCode}" }; } - + _logger.LogWarning($"大华实时流请求返回body{body}"); var result = JsonSerializer.Deserialize>(body); if (result == null || !result.Success) { - _logger.LogWarning("实时流请求业务失败: {Body}", body); - return new DaHApiResult { Success = false, Code = "1010", Msg = "实时流请求失败" }; + _logger.LogWarning("实时流请求业务反序列化失败: {Body}", body); + return new DaHApiResult { 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 { Success = false, Code = "1010", Msg = "实时流请求失败" }; + _logger.LogError(ex, $"大华实时流请求出错{ex.Message}"); + _logger.LogWarning($"{ex.Message}"); + return new DaHApiResult { Success = false, Code = "1012", Msg = $"实时流请求失败{ex.Message}" }; } }