pull/5/head
刘鑫 3 months ago
parent 85992efb2a
commit a1d097b29a
  1. 18
      WeiCloud.Fusion/Common.SharedService/Common.Shared.Application/DaHua/ResponeDto/DahuaVideoResDto.cs
  2. 13
      WeiCloud.Fusion/VideoService/Video.API/Controllers/DaHua/VideoManageController.cs
  3. 10
      WeiCloud.Fusion/VideoService/Video.API/appsettings.json
  4. 15
      WeiCloud.Fusion/VideoService/Video.Application/RequestDto/DahuaVideoQueryDto.cs
  5. 63
      WeiCloud.Fusion/VideoService/Video.Application/ResponeDto/DahuaVideoResDto.cs
  6. 35
      WeiCloud.Fusion/VideoService/Video.DomainService/Dahvision/DahuaGeneralCtlService.cs
  7. 2
      WeiCloud.Fusion/VideoService/Video.DomainService/Dahvision/IRootVideoPlaybackService.cs
  8. 7
      WeiCloud.Fusion/VideoService/Video.DomainService/Dahvision/RootVideoPlaybackService.cs

@ -35,13 +35,13 @@ namespace Common.Shared.Application.DaHua
public string ClientId { get; set; } public string ClientId { get; set; }
/// <summary> /// <summary>
/// 授权范围,固定为 ["*"] /// 授权范围
/// </summary> /// </summary>
[JsonPropertyName("scope")] [JsonPropertyName("scope")]
public string[] Scope { get; set; } public string Scope { get; set; } // 改为string类型
/// <summary> /// <summary>
/// access_token 有效期(秒),默认 2 小时(7200 秒) /// access_token 有效期(秒)
/// </summary> /// </summary>
[JsonPropertyName("expires_in")] [JsonPropertyName("expires_in")]
public long ExpiresIn { get; set; } public long ExpiresIn { get; set; }
@ -50,19 +50,25 @@ namespace Common.Shared.Application.DaHua
/// 鉴权 Token /// 鉴权 Token
/// </summary> /// </summary>
[JsonPropertyName("access_token")] [JsonPropertyName("access_token")]
public string AccessToken { get; set; } public string? AccessToken { get; set; }
/// <summary> /// <summary>
/// 刷新 Token(有效期 1 天) /// 刷新 Token
/// </summary> /// </summary>
[JsonPropertyName("refresh_token")] [JsonPropertyName("refresh_token")]
public string RefreshToken { get; set; } public string RefreshToken { get; set; }
/// <summary> /// <summary>
/// Token 类型,固定为 "bearer" /// Token 类型
/// </summary> /// </summary>
[JsonPropertyName("token_type")] [JsonPropertyName("token_type")]
public string TokenType { get; set; } = "bearer"; public string TokenType { get; set; } = "bearer";
/// <summary>
/// 剩余天数(新增字段)
/// </summary>
[JsonPropertyName("remainderDays")]
public int RemainderDays { get; set; }
} }
/// <summary> /// <summary>

@ -6,6 +6,9 @@ using WeiCloud.Core.BaseModels;
namespace Video.API.Controllers.DaHua namespace Video.API.Controllers.DaHua
{ {
/// <summary>
/// 大华视频
/// </summary>
[Route("api/[controller]/[action]")] [Route("api/[controller]/[action]")]
[ApiController] [ApiController]
public class VideoManageController : ControllerBase public class VideoManageController : ControllerBase
@ -14,6 +17,12 @@ namespace Video.API.Controllers.DaHua
private readonly IRootVideoPlaybackService _rootVideoPlaybackService; private readonly IRootVideoPlaybackService _rootVideoPlaybackService;
private readonly IConfiguration _configuration; private readonly IConfiguration _configuration;
/// <summary>
/// 构造
/// </summary>
/// <param name="logger"></param>
/// <param name="rootVideoPlaybackService"></param>
/// <param name="configuration"></param>
public VideoManageController(ILogger<VideoManageController> logger, IRootVideoPlaybackService rootVideoPlaybackService, IConfiguration configuration) public VideoManageController(ILogger<VideoManageController> logger, IRootVideoPlaybackService rootVideoPlaybackService, IConfiguration configuration)
{ {
_logger = logger; _logger = logger;
@ -29,9 +38,9 @@ namespace Video.API.Controllers.DaHua
/// <param name="dto"></param> /// <param name="dto"></param>
/// <returns></returns> /// <returns></returns>
[HttpPost("token/dh")] [HttpPost("token/dh")]
public async Task<ApiResult<string>> GetDaHToken(LoginRequestDto dto) public async Task<ApiResult<string>> GetDaHToken()
{ {
return await _rootVideoPlaybackService.GetDaHToken(dto); return await _rootVideoPlaybackService.GetDaHToken();
} }
/// <summary> /// <summary>

@ -25,10 +25,10 @@
"VideoOpen": "1", //01 "VideoOpen": "1", //01
// //
"DahuaAuth": { "DahuaAuth": {
"Host": "v4.weienergy.cn", "Host": "demo.weienergy.cn:15214",
"ClientId": "test", "ClientId": "taiyanggong",
"ClientSecret": "", "ClientSecret": "6d6c78f8-3d4c-4e76-ab6b-827942a7b725",
"Username": "", "Username": "system",
"Password": "" "Password": "Admin123"
} }
} }

@ -52,11 +52,11 @@ namespace Video.Application
[JsonPropertyName("streamType")] [JsonPropertyName("streamType")]
public string StreamType { get; set; } public string StreamType { get; set; }
/// <summary> ///// <summary>
/// 输出类型,如 "hls"、"rtmp" 等,如果RTSP的回放,不加此字段 ///// 输出类型,如 "hls"、"rtmp" 等,如果RTSP的回放,不加此字段
/// </summary> ///// </summary>
[JsonPropertyName("type")] //[JsonPropertyName("type")]
public string? Type { get; set; } = "hls"; //public string? Type { get; set; } = "";
/// <summary> /// <summary>
/// 录像类型:1-定时录像,2-移动侦测,3-报警录像等(字符串形式) /// 录像类型:1-定时录像,2-移动侦测,3-报警录像等(字符串形式)
@ -81,11 +81,6 @@ namespace Video.Application
/// </summary> /// </summary>
[JsonPropertyName("recordSource")] [JsonPropertyName("recordSource")]
public string RecordSource { get; set; } public string RecordSource { get; set; }
/// <summary>
/// 鉴权的token
/// </summary>
public string? Token { get; set; }
} }
/// <summary> /// <summary>

@ -305,7 +305,70 @@ namespace Video.Application
/// </summary> /// </summary>
public class UrlDataDto public class UrlDataDto
{ {
/// <summary>
/// 最小速率
/// </summary>
[JsonPropertyName("minRate")]
public object MinRate { get; set; } // 用object类型兼容null和可能的数值类型
/// <summary>
/// 协议类型
/// </summary>
[JsonPropertyName("protocol")]
public string Protocol { get; set; } // 可为null
/// <summary>
/// IP地址
/// </summary>
[JsonPropertyName("ip")]
public string Ip { get; set; } // 可为null
/// <summary>
/// 端口号
/// </summary>
[JsonPropertyName("port")]
public object Port { get; set; } // 用object类型兼容null和可能的数值类型
/// <summary>
/// STUN启用状态
/// </summary>
[JsonPropertyName("stunEnable")]
public bool? StunEnable { get; set; } // 可空布尔类型
/// <summary>
/// STUN端口
/// </summary>
[JsonPropertyName("stunPort")]
public object StunPort { get; set; } // 用object类型兼容null和可能的数值类型
/// <summary>
/// RTSP地址
/// </summary>
[JsonPropertyName("url")] [JsonPropertyName("url")]
public string Url { get; set; } public string Url { get; set; }
/// <summary>
/// 连接类型
/// </summary>
[JsonPropertyName("connectType")]
public string ConnectType { get; set; } // 可为null
/// <summary>
/// 会话标识
/// </summary>
[JsonPropertyName("session")]
public string Session { get; set; }
/// <summary>
/// 令牌
/// </summary>
[JsonPropertyName("token")]
public string Token { get; set; }
/// <summary>
/// 轨道标识
/// </summary>
[JsonPropertyName("trackId")]
public string TrackId { get; set; } // 可为null
} }
} }

@ -14,15 +14,24 @@ namespace Video.DomainService
{ {
private readonly ILogger<DahuaGeneralCtlService> _logger; private readonly ILogger<DahuaGeneralCtlService> _logger;
private readonly IConfiguration _configuration; private readonly IConfiguration _configuration;
private readonly HttpClient _http; // private readonly HttpClient _http;
public DahuaGeneralCtlService(ILogger<DahuaGeneralCtlService> logger, IConfiguration configuration, HttpClient http) public DahuaGeneralCtlService(ILogger<DahuaGeneralCtlService> logger, IConfiguration configuration)
{ {
_logger = logger; _logger = logger;
_configuration = configuration; _configuration = configuration;
_http = http;
//_http = http;
} }
/// <summary>
/// 开发测试的时候,忽略证书
/// </summary>
private static readonly HttpClient _http = new HttpClient(new HttpClientHandler
{
ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
});
/// <summary> /// <summary>
/// 获取公钥 /// 获取公钥
/// </summary> /// </summary>
@ -58,6 +67,9 @@ namespace Video.DomainService
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogWarning(ex, "大华平台获取公钥出错"); _logger.LogWarning(ex, "大华平台获取公钥出错");
result.Success = false;
result.Code = "1001";
result.Msg = "获取大华公钥失败";
} }
return result; return result;
} }
@ -69,7 +81,7 @@ namespace Video.DomainService
/// <returns></returns> /// <returns></returns>
public async Task<DaHApiResult<LoginResDto>> GetToken(LoginRequestDto dto) public async Task<DaHApiResult<LoginResDto>> GetToken(LoginRequestDto dto)
{ {
DaHApiResult<LoginResDto> result = new() { Success = true, Code = "0" }; DaHApiResult<LoginResDto> result = new() { Success = true, Code = "0", Data = new LoginResDto { } };
if (dto is null) if (dto is null)
{ {
result.Success = false; result.Success = false;
@ -104,8 +116,9 @@ namespace Video.DomainService
result.Msg = "获取大华登录令牌失败"; result.Msg = "获取大华登录令牌失败";
_logger.LogWarning("获取大华登录令牌失败,返回结果:{Result}", result); _logger.LogWarning("获取大华登录令牌失败,返回结果:{Result}", result);
} }
result = tokenInfo!;
//固定的拼接方式 //固定的拼接方式
result.Data.AccessToken = string.Concat(tokenInfo!.Data.TokenType, " ", tokenInfo.Data.AccessToken); result.Data.AccessToken = string.Concat(tokenInfo?.Data.TokenType, " ", tokenInfo?.Data.AccessToken);
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -136,9 +149,7 @@ namespace Video.DomainService
{ {
// 2) Token:优先入参,其次缓存/获取(建议返回完整的 "Bearer xxx") // 2) Token:优先入参,其次缓存/获取(建议返回完整的 "Bearer xxx")
var clientId = _configuration["DahuaAuth:ClientId"]; var clientId = _configuration["DahuaAuth:ClientId"];
var token = string.IsNullOrWhiteSpace(dto.Token) var token = "12"; /*string.IsNullOrWhiteSpace(dto.Token) ? await GetCachedOrFetchTokenAsync(clientId) : dto.Token;*/
? await GetCachedOrFetchTokenAsync(clientId)
: dto.Token;
var url = $"https://{_configuration["DahuaAuth:Host"]}/evo-apigw/admin/API/video/stream/record"; var url = $"https://{_configuration["DahuaAuth:Host"]}/evo-apigw/admin/API/video/stream/record";
@ -190,9 +201,7 @@ namespace Video.DomainService
} }
var clientId = _configuration["DahuaAuth:ClientId"]; var clientId = _configuration["DahuaAuth:ClientId"];
var token = string.IsNullOrWhiteSpace(dto.Token) var token = "11"; /*string.IsNullOrWhiteSpace(dto.Token) ? await GetCachedOrFetchTokenAsync(clientId) : dto.Token;*/
? await GetCachedOrFetchTokenAsync(clientId) // 建议用这个轻量封装;返回完整 "Bearer xxx"
: dto.Token;
var url = $"https://{_configuration["DahuaAuth:Host"]}/evo-apigw/admin/API/SS/Record/QueryRecords"; var url = $"https://{_configuration["DahuaAuth:Host"]}/evo-apigw/admin/API/SS/Record/QueryRecords";
@ -487,9 +496,7 @@ namespace Video.DomainService
// 先用缓存里的 token,不足5分钟过期再刷新(按你之前的口径来) // 先用缓存里的 token,不足5分钟过期再刷新(按你之前的口径来)
var clientId = _configuration["DahuaAuth:ClientId"]; var clientId = _configuration["DahuaAuth:ClientId"];
var token = string.IsNullOrWhiteSpace(dto.Token) var token = await GetCachedOrFetchTokenAsync(clientId);// string.IsNullOrWhiteSpace(dto.Token) ? await GetCachedOrFetchTokenAsync(clientId) : dto.Token;
? await GetCachedOrFetchTokenAsync(clientId)
: dto.Token;
var url = $"https://{_configuration["DahuaAuth:Host"]}/evo-apigw/admin/API/video/stream/record"; var url = $"https://{_configuration["DahuaAuth:Host"]}/evo-apigw/admin/API/video/stream/record";

@ -18,7 +18,7 @@ namespace Video.DomainService
/// </summary> /// </summary>
/// <param name="dto"></param> /// <param name="dto"></param>
/// <returns></returns> /// <returns></returns>
Task<ApiResult<string>> GetDaHToken(LoginRequestDto dto); Task<ApiResult<string>> GetDaHToken();
/// <summary> /// <summary>
/// 大华的实时视频 /// 大华的实时视频

@ -55,7 +55,7 @@ namespace Video.DomainService
/// </summary> /// </summary>
/// <param name="dto"></param> /// <param name="dto"></param>
/// <returns></returns> /// <returns></returns>
public async Task<ApiResult<string>> GetDaHToken(LoginRequestDto dto) public async Task<ApiResult<string>> GetDaHToken()
{ {
ApiResult<string> result = new() { Code = 200, Msg = "接口调用成功" }; ApiResult<string> result = new() { Code = 200, Msg = "接口调用成功" };
//1. 获取公钥 //1. 获取公钥
@ -66,8 +66,13 @@ namespace Video.DomainService
result.Msg = publicKeyResult.Msg; result.Msg = publicKeyResult.Msg;
_logger.LogWarning("获取大华公钥失败:{Msg}", publicKeyResult.Msg); _logger.LogWarning("获取大华公钥失败:{Msg}", publicKeyResult.Msg);
} }
LoginRequestDto dto = new();
//2. 鉴权 //2. 鉴权
dto.PublicKey = publicKeyResult.Data.PublicKey; dto.PublicKey = publicKeyResult.Data.PublicKey;
dto.ClientId = _cfg["DahuaAuth:ClientId"]!;
dto.ClientSecret = _cfg["DahuaAuth:ClientSecret"]!;
dto.Password = _cfg["DahuaAuth:Password"]!;
dto.Username = _cfg["DahuaAuth:Username"]!;
DaHApiResult<LoginResDto> loginResult = await _dahuaGeneralCtlService.GetToken(dto); DaHApiResult<LoginResDto> loginResult = await _dahuaGeneralCtlService.GetToken(dto);
if (!loginResult.Success) if (!loginResult.Success)

Loading…
Cancel
Save