平台功能:在平台上录入相机后台设置的onvif信息,对外提供webapi接口,如获取播放地址,ptz控制,预置点控制等功能
开发环境:NetCore 6.0 + Sqlite
一、相机管理
1. 添加相机
2. 控制面板
2.1 获取播放地址,并播放rtsp流
2.2 PTZ控制
2.3 预置点管理(获取,前往,添加,删除)
rtsp转webrtc程序,用于html页面播放rtsp地址流
二、日志信息
三、 Swagger
四、程序结构
五、部分接口代码
using HappyOnvif.Utility; using HappyOnvif.Utilty; using HappyOnvif.Utilty.db; using HappyOnvif.Utilty.db.model; using Microsoft.AspNetCore.Http.Extensions; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using System; namespace HappyOnvif.Controllers { [Route("api/onvif/[action]")] [ApiController] public class OnvifController : ControllerBase { /// <summary> /// 设备初始化 /// </summary> /// <param name="model"></param> /// <returns></returns> [HttpPost] public ResponseExtend init([FromBody] Camera model) { string ip = model.Ip; var result = new ResponseExtend<bool>(); try { var onvif = DataMgr.GetOnvif(ip); if (null == onvif) { onvif = new OnvifWsdl(); bool status = onvif.Init(ip, model.Port, model.Name, model.Pwd); if (status) { DataMgr.AddOnvif(ip, onvif); } result.data = status; } else { result.data = true; } } catch (Exception ex) { result.code = 10000; result.msg = ex.Message; Logger.Error($"系统调用接口/onvif/init 发生内部错误:{ex.Message}"); } FreeSqlHelper.InsterApiLog(HttpContext.Request.GetDisplayUrl(), JsonConvert.SerializeObject(result)); return result; } /// <summary> /// 获取播放地址 /// </summary> /// <param name="ip"></param> /// <returns></returns> [HttpGet] public ResponseExtend geturi(string ip = "192.168.0.13") { var result = new ResponseExtend<string>(); try { var onvif = DataMgr.GetOnvif(ip); if (null != onvif) { result.data = JsonConvert.SerializeObject(onvif.GetUri()); } else { result.code = 10001; result.msg = "设备尚未初始化"; } } catch (Exception ex) { result.code = 10000; result.msg = ex.Message; Logger.Error($"系统调用接口/onvif/geturi 发生内部错误:{ex.Message}"); } FreeSqlHelper.InsterApiLog(HttpContext.Request.GetDisplayUrl(), JsonConvert.SerializeObject(result)); return result; } /// <summary> /// 获取预置点 /// </summary> /// <param name="ip"></param> /// <returns></returns> [HttpGet] public ResponseExtend getpresets(string ip = "192.168.0.13") { var result = new ResponseExtend<string>(); try { var onvif = DataMgr.GetOnvif(ip); if (null != onvif) { // 获取预置点 onvif.PTZControl(ECommandType.GetPreset); result.data = JsonConvert.SerializeObject(onvif.Presets); } else { result.code = 10001; result.msg = "设备尚未初始化"; } } catch (Exception ex) { result.code = 10000; result.msg = ex.Message; Logger.Error($"系统调用接口/onvif/gettpresets 发生内部错误:{ex.Message}"); } FreeSqlHelper.InsterApiLog(HttpContext.Request.GetDisplayUrl(), JsonConvert.SerializeObject(result)); return result; } /// <summary> /// ptz控制 /// </summary> /// <param name="ip"></param> /// <param name="cmd">0:停止;1:上;2:左上;3:右上;4:下;5:左下;6:右下;7:左;8:右;9:聚焦+;10:聚焦-;11:变倍+;12:变倍-;13:光圈开;14:光圈关;15:调用预置位;16:前往预置点;17:设置预置位;18:删除预置位</param> /// <param name="presetname"></param> /// <param name="presettoken">通过gettpresets获取到value</param> /// <param name="speed">步长 0-10</param> /// <returns></returns> [HttpGet] public ResponseExtend ptz(string ip = "192.168.0.13", int cmd = 0, int speed = 5, string presetname = "", string presettoken = "") { var result = new ResponseExtend<string>(); try { var onvif = DataMgr.GetOnvif(ip); if (null != onvif) { result.data = onvif.PTZControl((ECommandType)cmd, speed, presetname, presettoken); } else { result.code = 10001; result.msg = "设备尚未初始化"; } } catch (Exception ex) { result.code = 10000; result.msg = ex.Message; Logger.Error($"系统调用接口/onvif/ptz 发生内部错误:{ex.Message}"); } FreeSqlHelper.InsterApiLog(HttpContext.Request.GetDisplayUrl(), JsonConvert.SerializeObject(result)); return result; } } }