feat(camera): 新增大华摄像头信息查询接口

- 在 CameraController 中新增 ListDaHuaCameraInfo 和 GetDaHuaRtsp 接口
- 实现大华摄像头通道信息查询功能
- 支持获取大华摄像头 RTSP 流地址
- 优化 FireManagementApp 中代码格式和结构
- 更新 DaHuaApi 类中静态变量和属性定义
- 调整 OpenAuth.WebApi 项目文件,新增大华摄像头控制器目录
DataMaintenance
一梦千年 2025-11-26 14:00:52 +08:00
parent f4786a984e
commit d00d45d19a
4 changed files with 164 additions and 48 deletions

View File

@ -17,8 +17,8 @@ namespace Infrastructure.Helpers
private readonly string _kccKey;
private readonly string _kccSecret;
private readonly string _kccId;
private OAuthTokenResponse _currentToken;
private DateTime _tokenExpiry;
private static OAuthTokenResponse _currentToken;
private static DateTime _tokenExpiry;
/// <summary>
/// 构造函数KCC认证方式
@ -574,7 +574,8 @@ namespace Infrastructure.Helpers
/// <summary>
/// 描述信息
/// </summary>
public string desc { get; set; }
public string errMsg { get; set; }
public bool success { get; set; }
/// <summary>
/// 响应数据

View File

@ -32,6 +32,7 @@ using SqlSugar;
using System.Net.WebSockets;
using System.Security.Cryptography;
using System.Text;
using Infrastructure.Helpers;
using Yitter.IdGenerator;
using static Org.BouncyCastle.Math.EC.ECCurve;
@ -43,7 +44,9 @@ namespace OpenAuth.App.ServiceApp.FireManagement
private IConfiguration _configuration;
IOptions<KikvisionConfig> _options;
IOptions<JPushClientConfig> _jpoptions;
public FireManagementApp(IConfiguration configuration, IOptions<KikvisionConfig> options, IOptions<JPushClientConfig> jpoptions, ISugarUnitOfWork<SugarDbContext> unitWork,
public FireManagementApp(IConfiguration configuration, IOptions<KikvisionConfig> options,
IOptions<JPushClientConfig> jpoptions, ISugarUnitOfWork<SugarDbContext> unitWork,
ISimpleClient<FmFireclueTask> repository, IAuth auth) : base(unitWork, repository, auth)
{
_auth = auth;
@ -128,6 +131,7 @@ namespace OpenAuth.App.ServiceApp.FireManagement
}
}
}
//删除任务
public async Task<Response<bool>> DeleteTask(long id)
{
@ -158,6 +162,7 @@ namespace OpenAuth.App.ServiceApp.FireManagement
}
}
}
//更新任务状态
public async Task<Response<bool>> ReceiveFireClueTask(long taskid, int state, string recipient)
{
@ -178,6 +183,7 @@ namespace OpenAuth.App.ServiceApp.FireManagement
}
}
}
//更新任务图片或者新增线索
public async Task<Response<bool>> ReceiveTaskImage(string info)
{
@ -196,7 +202,6 @@ namespace OpenAuth.App.ServiceApp.FireManagement
else
{
//新增线索信息
}
if (db.Commit())
@ -209,11 +214,13 @@ namespace OpenAuth.App.ServiceApp.FireManagement
}
}
}
class ReciveTaskInfo
{
public long taskid { get; set; }
public string path { get; set; }
}
/// <summary>
/// 查询下发人员
/// </summary>
@ -250,6 +257,7 @@ namespace OpenAuth.App.ServiceApp.FireManagement
return new Response<List<FmFireclueTask>> { Result = tasks };
}
}
/// <summary>
/// 任务详情
/// </summary>
@ -278,7 +286,7 @@ namespace OpenAuth.App.ServiceApp.FireManagement
Audio = a.Audio,
Image = a.Image,
})
.Mapper(a => a.StateName = ((TaskState)a.State).GetDescription())
.Mapper(a => a.StateName = ((TaskState)a.State).GetDescription())
.FirstAsync();
var rep = db.FmFireTaskUser.AsQueryable().Where(r => r.UserId == userid && r.TaskId == id).First();
if (rep != null)
@ -286,6 +294,7 @@ namespace OpenAuth.App.ServiceApp.FireManagement
info.State = rep.State;
info.StateName = ((TaskState)rep.State).GetDescription();
}
return new Response<FireClueTaskResp> { Result = info };
}
}
@ -586,6 +595,7 @@ namespace OpenAuth.App.ServiceApp.FireManagement
}
}
}
/// <summary>
/// 添加火情日志
/// </summary>
@ -596,7 +606,8 @@ namespace OpenAuth.App.ServiceApp.FireManagement
using (var db = base.UnitWork.CreateContext())
{
var userId = _auth.GetCurrentUser().User.Id;
info.CreateId = userId; info.CreateTime = DateTime.Now;
info.CreateId = userId;
info.CreateTime = DateTime.Now;
await db.FmFireclueinfoLog.InsertAsync(info);
if (db.Commit())
{
@ -608,6 +619,7 @@ namespace OpenAuth.App.ServiceApp.FireManagement
}
}
}
//按月统计火情线索
public async Task<Response<List<FireInfoForChart>>> GetFireClueStatistics(int type)
{
@ -753,6 +765,7 @@ namespace OpenAuth.App.ServiceApp.FireManagement
return new Response<List<FmFireclueinfoLog>> { Result = list };
}
}
#endregion
/// <summary>
@ -961,33 +974,36 @@ namespace OpenAuth.App.ServiceApp.FireManagement
}
};
}
/// <summary>
/// 查询人员上报的线索
/// </summary>
/// <param name="userid"></param>
/// <returns></returns>
public async Task<Response<PageInfo<List<FireClueInfoResp>>>> LoadFireClueInfoByUserId(int pageIndex, int state, int pageSize, string userid)
public async Task<Response<PageInfo<List<FireClueInfoResp>>>> LoadFireClueInfoByUserId(int pageIndex, int state,
int pageSize, string userid)
{
using (var db = base.UnitWork.CreateContext())
{
RefAsync<int> total = 0;
var list = await db.FmFireclueInfo.AsQueryable().Where(a => a.CreateId.ToString() == userid).Select(a => new FireClueInfoResp
{
Id = a.Id,
CreateId = a.CreateId.ToString(),
ReportPerson = a.ReportPerson,
Lat = a.Lat,
Lng = a.Lng,
Address = a.Address,
ReportTime = a.ReportTime,
Describe = a.Describe,
SourceType = a.SourceType,
State = a.State,
AreaName = a.AreaName,
ClueNo = a.ClueNo,
}).Mapper(a => a.SourceTypeName = ((SourceType)a.SourceType).GetDescription())
.Mapper(a => a.StateName = ((State)a.State).GetDescription())
.OrderBy(a => a.ReportTime, SqlSugar.OrderByType.Desc).ToPageListAsync(pageIndex, pageSize, total);
var list = await db.FmFireclueInfo.AsQueryable().Where(a => a.CreateId.ToString() == userid).Select(a =>
new FireClueInfoResp
{
Id = a.Id,
CreateId = a.CreateId.ToString(),
ReportPerson = a.ReportPerson,
Lat = a.Lat,
Lng = a.Lng,
Address = a.Address,
ReportTime = a.ReportTime,
Describe = a.Describe,
SourceType = a.SourceType,
State = a.State,
AreaName = a.AreaName,
ClueNo = a.ClueNo,
}).Mapper(a => a.SourceTypeName = ((SourceType)a.SourceType).GetDescription())
.Mapper(a => a.StateName = ((State)a.State).GetDescription())
.OrderBy(a => a.ReportTime, SqlSugar.OrderByType.Desc).ToPageListAsync(pageIndex, pageSize, total);
return new Response<PageInfo<List<FireClueInfoResp>>>
{
Code = 200,
@ -1001,9 +1017,12 @@ namespace OpenAuth.App.ServiceApp.FireManagement
}
}
private static readonly string baseUrl = "http://10.176.126.121:8766/liveBroadCast/bd/api/v1/device/liveBroadCast";
private static readonly string baseUrl =
"http://10.176.126.121:8766/liveBroadCast/bd/api/v1/device/liveBroadCast";
private static readonly string sk = "ba98a152296f13c565d2a6dfd219994f"; // 用户的sk
private static readonly string account = "AK202006291525121"; // 用户的ak
public async Task<string> GetFlvUrlAsync(string deviceCode)
{
// 获取当前的时间戳
@ -1036,8 +1055,10 @@ namespace OpenAuth.App.ServiceApp.FireManagement
requestMessage.Headers.Add("signature", signature);
// 设置 Content-Type 和 Accept 请求头
requestMessage.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
requestMessage.Headers.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
requestMessage.Content.Headers.ContentType =
new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
requestMessage.Headers.Accept.Add(
new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
// 发送请求
var response = await client.SendAsync(requestMessage);
@ -1076,12 +1097,15 @@ namespace OpenAuth.App.ServiceApp.FireManagement
return BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
}
}
public async Task<string> GetLive(string deviceCode)
{
string flvUrl = await GetFlvUrlAsync(deviceCode);
return flvUrl;
}
#region socket
public async Task SendSocketMessage(WebSocketModel wsModel)
{
try
@ -1091,16 +1115,16 @@ namespace OpenAuth.App.ServiceApp.FireManagement
string ws = _configuration.GetSection("WebSocket").Value;
await webSocket.ConnectAsync(new Uri(ws), CancellationToken.None);
byte[] data = Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(wsModel));
await webSocket.SendAsync(new ArraySegment<byte>(data), System.Net.WebSockets.WebSocketMessageType.Text, true, CancellationToken.None);
await webSocket.CloseAsync(System.Net.WebSockets.WebSocketCloseStatus.NormalClosure, "Closing connection", CancellationToken.None);
await webSocket.SendAsync(new ArraySegment<byte>(data),
System.Net.WebSockets.WebSocketMessageType.Text, true, CancellationToken.None);
await webSocket.CloseAsync(System.Net.WebSockets.WebSocketCloseStatus.NormalClosure,
"Closing connection", CancellationToken.None);
//webSocket.Dispose();
}
}
catch (Exception ex)
{
}
}
/// <summary>
@ -1116,7 +1140,8 @@ namespace OpenAuth.App.ServiceApp.FireManagement
Audience audience = new Audience();
if (infoid != 0)
{
var renwu = db.FmFireTaskUser.AsQueryable().Where(r => r.TaskId == infoid).Select(r => r.UserId).ToList();
var renwu = db.FmFireTaskUser.AsQueryable().Where(r => r.TaskId == infoid).Select(r => r.UserId)
.ToList();
var users = db.User.AsQueryable().Where(r => renwu.Contains(r.Id.ToString())).ToList();
if (users.Count > 0)
{
@ -1131,6 +1156,7 @@ namespace OpenAuth.App.ServiceApp.FireManagement
audience.Alias = users.Select(a => a.Account).ToList();
}
}
PushPayload pushPayload = new PushPayload()
{
Platform = new List<string> { "android", "ios" },
@ -1156,9 +1182,11 @@ namespace OpenAuth.App.ServiceApp.FireManagement
return "success";
}
}
#endregion
#region 海康设备
/// <summary>
/// 获取单个设备的视频流
/// </summary>
@ -1168,7 +1196,8 @@ namespace OpenAuth.App.ServiceApp.FireManagement
[AllowAnonymous]
public string GetPreviewURLs(string cameraIndexCode, string protocol)
{
HttpUtillib.SetPlatformInfo(_options.Value.AppKey, _options.Value.SecretKey, _options.Value.Url, _options.Value.Port, true);
HttpUtillib.SetPlatformInfo(_options.Value.AppKey, _options.Value.SecretKey, _options.Value.Url,
_options.Value.Port, true);
var obj = new
{
@ -1186,11 +1215,14 @@ namespace OpenAuth.App.ServiceApp.FireManagement
{
return Encoding.UTF8.GetString(result);
}
return "fail";
}
#endregion
#region 人员类型统计
#region 人员类型统计
/// <summary>
/// 人员类型统计
/// </summary>
@ -1229,16 +1261,19 @@ namespace OpenAuth.App.ServiceApp.FireManagement
Result = res
};
}
#endregion
#region 获取物资相关接口
/// <summary>
/// 获取全部营房信息
/// </summary>
/// <returns></returns>
public dynamic GetAllYingFang()
{
string sql = @"SELECT ""id"",""dwmc"",""dwzd"",""lsdw"",""dwzdjd"",""dwzdwd"",""dzxm"",""lxfs"",""syrs"",""zbqk"",""tbr"", st_astext(""geom"") as geom FROM ""fm_shp_1692148217"" ";
string sql =
@"SELECT ""id"",""dwmc"",""dwzd"",""lsdw"",""dwzdjd"",""dwzdwd"",""dzxm"",""lxfs"",""syrs"",""zbqk"",""tbr"", st_astext(""geom"") as geom FROM ""fm_shp_1692148217"" ";
using (var db = Repository.AsSugarClient())
{
@ -1258,7 +1293,9 @@ namespace OpenAuth.App.ServiceApp.FireManagement
{
string sql = string.Empty;
if (!string.IsNullOrEmpty(wuzi))
sql = "SELECT \"id\", \"type\",\"name\",info,st_astext(geom) as geom FROM \"fm_shp_1686205187\" WHERE info like '%" + wuzi + "%'";
sql =
"SELECT \"id\", \"type\",\"name\",info,st_astext(geom) as geom FROM \"fm_shp_1686205187\" WHERE info like '%" +
wuzi + "%'";
else
sql = "SELECT \"id\", \"type\",\"name\",info,st_astext(geom) as geom FROM \"fm_shp_1686205187\" ";
@ -1266,8 +1303,10 @@ namespace OpenAuth.App.ServiceApp.FireManagement
data.count = dt.Rows.Count;
data.data = dt;
}
return data;
}
#endregion
#region 任务相关
@ -1277,7 +1316,8 @@ namespace OpenAuth.App.ServiceApp.FireManagement
/// </summary>
/// <param name="userid"></param>
/// <returns></returns>
public async Task<Response<PageInfo<List<FireClueTaskResp>>>> LoadFireClueTaskByUserId(string userid, int pageIndex, int pageSize)
public async Task<Response<PageInfo<List<FireClueTaskResp>>>> LoadFireClueTaskByUserId(string userid,
int pageIndex, int pageSize)
{
using (SugarDbContext db = base.UnitWork.CreateContext())
{
@ -1301,14 +1341,15 @@ namespace OpenAuth.App.ServiceApp.FireManagement
Audio = a.Audio,
Image = a.Image,
}).Mapper(c => c.StateName = ((TaskState)c.State).GetDescription())
.OrderBy(a => a.TaskTime, OrderByType.Desc)
.ToPageListAsync(pageIndex, pageSize, totalNumber);
.OrderBy(a => a.TaskTime, OrderByType.Desc)
.ToPageListAsync(pageIndex, pageSize, totalNumber);
return new Response<PageInfo<List<FireClueTaskResp>>>
{
Result = new PageInfo<List<FireClueTaskResp>> { Items = query, Total = totalNumber }
};
}
}
/// <summary>
/// 查询所有任务
/// </summary>
@ -1336,17 +1377,18 @@ namespace OpenAuth.App.ServiceApp.FireManagement
Audio = a.Audio,
TaskTime = a.TaskTime,
RecipientUsers = SqlFunc.Subqueryable<FmFireTaskUser>().Where(r => r.TaskId == a.Id)
.LeftJoin<SysUser>((r, s) => r.UserId == s.Id.ToString())
.SelectStringJoin((a, s) => s.Name, ","),
.LeftJoin<SysUser>((r, s) => r.UserId == s.Id.ToString())
.SelectStringJoin((a, s) => s.Name, ","),
}).Mapper(c => c.StateName = ((TaskState)c.State).GetDescription())
.OrderBy(a => a.TaskTime, OrderByType.Desc)
.ToPageListAsync(pageIndex, pageSize, totalNumber);
.OrderBy(a => a.TaskTime, OrderByType.Desc)
.ToPageListAsync(pageIndex, pageSize, totalNumber);
return new Response<PageInfo<List<FireClueTaskResp>>>
{
Result = new PageInfo<List<FireClueTaskResp>> { Items = query, Total = totalNumber }
};
}
}
/// <summary>
/// 查询火情线索
/// </summary>
@ -1354,7 +1396,8 @@ namespace OpenAuth.App.ServiceApp.FireManagement
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public async Task<Response<PageInfo<List<FireClueInfoResp>>>> LoadFireClueInfoByAreaName(string areaname, int pageIndex = 1, int pageSize = 10)
public async Task<Response<PageInfo<List<FireClueInfoResp>>>> LoadFireClueInfoByAreaName(string areaname,
int pageIndex = 1, int pageSize = 10)
{
using (SugarDbContext db = base.UnitWork.CreateContext())
{
@ -1382,15 +1425,16 @@ namespace OpenAuth.App.ServiceApp.FireManagement
FireType = 1
})
.Mapper(a => a.SourceTypeName = ((SourceType)a.SourceType).GetDescription())
.Mapper(a => a.StateName = ((State)a.State).GetDescription())
.OrderBy(a => a.ReportTime, SqlSugar.OrderByType.Desc)
.ToPageListAsync(pageIndex, pageSize, totalNumber);
.Mapper(a => a.StateName = ((State)a.State).GetDescription())
.OrderBy(a => a.ReportTime, SqlSugar.OrderByType.Desc)
.ToPageListAsync(pageIndex, pageSize, totalNumber);
return new Response<PageInfo<List<FireClueInfoResp>>>
{
Result = new PageInfo<List<FireClueInfoResp>> { Items = query, Total = totalNumber }
};
}
}
/// <summary>
/// App获取在线人员实时位置信息
/// </summary>
@ -1424,7 +1468,9 @@ namespace OpenAuth.App.ServiceApp.FireManagement
};
}
}
#endregion
public async Task<Response<dynamic>> ListCameraWithInRange(string lng, string lat, int radius)
{
// '{lng}', '{lat}'
@ -1445,5 +1491,61 @@ ORDER BY
Result = x
};
}
public async Task<Response<dynamic>> ListDaHuaCameraInfo()
{
var daHuaApi = new DaHuaApi("https://icc-dev.hibetatest.com:4077");
var channelCategoryRequest = new ChannelCategoryRequest
{
pageNum = 1,
pageSize = 10,
isOnline = 1,
unitTypeList = new List<int> { 1 },
};
Console.WriteLine(JsonConvert.SerializeObject(channelCategoryRequest));
var channelCategoryResponse = await daHuaApi.GetChannelCategoriesAsync(channelCategoryRequest);
if (channelCategoryResponse.success)
{
return new Response<dynamic>
{
Result = channelCategoryResponse.data.pageData
};
}
return new Response<dynamic>
{
Code = channelCategoryResponse.code,
Message = channelCategoryResponse.errMsg
};
}
public async Task<Response<dynamic>> GetDaHuaRtsp(string channelCode)
{
var daHuaApi = new DaHuaApi("https://icc-dev.hibetatest.com:4077");
var request = new RtspPreviewRequest
{
data = new RtspPreviewData
{
channelId = "1000008$1$0$0IPC10001001_1",
dataType = "1",
streamType = "1" //主码流
}
};
var y = await daHuaApi.StartRtspPreviewAsync(request);
if (y.success)
{
return new Response<dynamic>
{
Result = y.data
};
}
return new Response<dynamic>
{
Code = y.code,
Message = y.errMsg
};
}
}
}

View File

@ -28,4 +28,16 @@ public class CameraController : ControllerBase
{
return await _app.ListCameraWithInRange(lng, lat, radius);
}
[HttpGet]
public async Task<Response<dynamic>> ListDaHuaCameraInfo()
{
return await _app.ListDaHuaCameraInfo();
}
[HttpGet]
public async Task<Response<dynamic>> GetDaHuaRtsp(string channelCode)
{
return await _app.GetDaHuaRtsp(channelCode);
}
}

View File

@ -82,6 +82,7 @@
<ItemGroup>
<Folder Include="Controllers\BaseControllers\Permission\" />
<Folder Include="Controllers\ServiceControllers\DaHuaCamera\" />
</ItemGroup>
</Project>