物联网IOT大背景下音视频领域的Onvif 协议在2008年成为全球性的开放接口标准。于是一批开发者涌入该技术领域使用各种编程语言对其改造升级封装。
因为是国际标准,所以规范内容比较多,物联网领域涉及又广,所以研究协议是一个很耗时间的一项工作,读懂协议,代码操作就变得相对简单。
本人有幸涉及物联网领域,刚好是研究Onvif协议,又刚好本人是擅长c#编程的,于是就搜集了一些c#对Onvif封装的区域性调查,发现几乎都是使用微软的wcf调用服务引用,动态生成的Onvif类库,虽然可用,但是在数据流转上,就变得相对笨拙,接口超时,数据出错就很难处理。就是鉴于以上情况,本人决定使用原生的XML语言,对Onvif进行精简封装。相关代码也都进行了开源。
地址:https://github.com/zhuovi/XiaoFeng.Onvif
下面我就简单介绍一下我做的Onvif 开源项目吧
XiaoFeng.Onvif 基于.NET平台使用C#封装Onvif常用接口、设备、媒体、云台等功能, 拒绝WCF服务引用动态代理生成wsdl类文件 , 使用原生XML扩展标记语言封装参数,所有的数据流向都可控。
刚开源几天,该有的功能都有了,可能不够完善,不够好,希望同道朋友一起来完善.NET社区的音视频领域的技术。
具体使用方法很简单。安装nuget包:XiaoFeng.Onvif
using XiaoFeng.Onvif;
var ip = "192.168.12.2";
var user = "onvif";
var pass = "123456";
//设备扫描
var resu = await DeviceService.DiscoveryOnvif(3);
//设备时间
var onvifUTCDateTime = await DeviceService.GetSystemDateAndTime(ip);
//设备信息
var info = await DeviceService.GetDeviceInformation(ip, user, pass, onvifUTCDateTime);
//设备能力
var abilities= await DeviceService.GetCapabilities(ip);
//token信息
var tokens = await MediaService.GetProfiles(ip, user, pass, onvifUTCDateTime);
//流地址
var streamUri = await MediaService.GetStreamUri(ip, user, pass, onvifUTCDateTime, tokens[0]);
//快照地址
var img = await MediaService.GetSnapshotUri(ip, user, pass, onvifUTCDateTime, tokens[0]);
//云台状态
await PTZService.GetStatus(ip, user, pass, onvifUTCDateTime, tokens[0]);
//设置home
await PTZService.SetHomePosition(ip, user, pass, onvifUTCDateTime, tokens[0]);
//绝对移动
await PTZService.AbsoluteMove(ip, user, pass, onvifUTCDateTime, tokens[0], 0, 0);
//继续移动
await PTZService.ContinuousMove(ip, user, pass, onvifUTCDateTime, tokens[0], 0.6, 0.2, 1);
//相对移动
await PTZService.RelativeMove(ip, user, pass, onvifUTCDateTime, tokens[0], 0.8, 0.5, 0.5);
//回归home
await PTZService.GotoHomePosition(ip, user, pass, onvifUTCDateTime, tokens[0], 0.3, 1, 1);
以上基本功能列表,需要数据组装,取到各个接口数据,进行组装拼接就可以了。写代码很简单,主要是要读懂协议,理解协议,玩转协议,这是研究物联网的最困难的地方。开源不易,路过的小伙伴可以给小编在github点个个小星星,以此激励一下小编!