HappyOnvif - ONVIF协议摄像机接入平台

平台功能:在平台上录入相机后台设置的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;
        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值