关于摄像头:开发笔记3Onvif协议的两种实现方式


目录

零、前言

一、Onvif协定的C语言实现

  1. 参考文章

  2. 集成形式

  3. 办法调用

    a. 探寻设施

    b. 获取设施能力

    c. 获取token

    d. 获取推流url

    e. ptz进行挪动

    f. ptz继续挪动

    g. ptz绝对挪动

    h. ptz获取以后状态

二、Onvif协定收发XML实现

  1. 集成形式

  2. 办法调用

    a. 探寻设施

    b. 获取设施所有信息

    c. ptz管制

三、iOS下的注意事项


<h2 id=’0′>零、前言</h2>

最近公司须要集成摄像头,采纳Onvif协定,网上没找到能够间接运行的代码或者可运行的都须要大量积分,所以本人找材料参考实现,现将代码和集成形式分享进去。
若您非iOS平台,参考Onvif协定的C语言实现即可;iOS平台倡议应用Onvif协定收发XML实现。
本文不会具体解说Onvif协定,简略介绍代码的应用。如果工程对您有用,心愿能点一个⭐,谢谢。

<h2 id=’1′>一、Onvif协定的C语言实现</h2>

<h3 id=’1-1′>  1. 参考文章</h3>

ONVIF协定网络摄像机(IPC)客户端程序开发

<h3 id=’1-2′>  2. 集成形式</h3>

将以下文件拖入工程 (非iOS工程须要本人集成openssl)

<h3 id=’1-3′>  3. 办法调用</h3>

(以下OC办法都是通过C语言实现,非iOS平台批改办法名,本人设置回调即可。)

<h4 id=’1-3-a’>    a. 探寻设施</h3>

+ (int)detectDeviceResult:(BYOnvifResultItem *)resultItem;

<h4 id=’1-3-b’>    b. 获取设施能力</h3>

留神:以下操作都须要鉴权,而且每次调用onvif库函数,都须要鉴权一次。

传入上一步获取的设施地址 (海康的设施地址须要做宰割)
通用设备能够取得:

  • media地址
  • ptz管制地址
+ (int)getCapabilityWithDeviceAddr:(NSString *)deviceXAddrStr
                          userName:(NSString *)userName
                          password:(NSString *)password
                            result:(BYOnvifResultItem *)resultItem;

<h4 id=’1-3-c’>    c. 获取token</h3>

传入上一步获取的media地址获取token

+ (NSString *)getProfilesWithAddr:(NSString *)capabilityXAddr
                         userName:(NSString *)userName
                         password:(NSString *)password
                           result:(BYOnvifResultItem *)resultItem;

<h4 id=’1-3-d’>    d. 获取推流url</h3>

传入media地址和上一步获取的token取得streamUrl,播放地址须要做用户名明码拼接,例如:

rtsp://192.168.0.100/onvif/stream_service

拼接成

rtsp://username:password@192.168.0.100/onvif/stream_service

(IJKPlayer默认不反对rtsp协定),须要批改编译选项

+ (int)getStreamUriWithAddr:(NSString *)mediaXAddrStr
               profileToken:(NSString *)profileTokenStr
                   userName:(NSString *)userName
                   password:(NSString *)password
                     result:(BYOnvifResultItem *)resultItem;

<h4 id=’1-3-e’>    e. ptz进行挪动</h3>

传入获取设施能力获取到的ptz地址和获取token取得的token,上面ptz办法传入都须要传入这两个参数,进行ptz挪动

+ (int)ptzStopMoveWithAddr:(NSString *)ptzAddrStr
              profileToken:(NSString *)tokenStr
                  userName:(NSString *)userName
                  password:(NSString *)password;

<h4 id=’1-3-f’>    f. ptz继续挪动</h3>

管制ptz继续挪动,speed,挪动速度[0, 1)的一个区间,stopSecond,继续挪动多久进行,单位秒。

+ (int)ptzContinuousMoveWithAddr:(NSString *)ptzAddrStr
                    profileToken:(NSString *)tokenStr
                         commond:(BYPTZCmdType)cmd
                           speed:(float)speed
                        userName:(NSString *)userName
                        password:(NSString *)password
                      stopSecond:(int)second;

<h4 id=’1-3-g’>    g. ptz绝对挪动</h3>

ptz绝对上一个地位挪动一个步长,步长[0, 1)的一个区间

+ (int)ptzRelativeMoveWithAddr:(NSString *)ptzAddrStr
                  profileToken:(NSString *)tokenStr
                       commond:(BYPTZCmdType)commond
                      moveStep:(float)moveStep
                      userName:(NSString *)userName
                      password:(NSString *)password;

<h4 id=’1-3-h’>    h. ptz获取以后状态</h3>

获取以后ptz的状态(设施以后所处的坐标)

+ (int)getPTZStatusWithAddr:(NSString *)ptzXAddrStr
               profileToken:(NSString *)tokenStr
                   userName:(NSString *)userName
                   password:(NSString *)password;

<h2 id=’2′>二、Onvif协定收发XML实现</h2>

<h3 id=’2-1′>  1. 集成形式</h3>

<h3 id=’2-2′>  2. 办法调用</h3>
<h4 id=’2-2-a’>    a. 探寻设施</h3>

探寻设施应用UDPSocket,往239.255.255.250:3702发送探寻信息,期待组播返回信息

NSData *data = [BYOnvifXMLTool dataFromXmlFile:@"probe"];
[self.scannerTools startWithSendUdpData:data];

<h4 id=’2-2-b’>    b. 获取设施所有信息</h3>

将上一步探寻的设施地址和用户名明码传入

+ (BYOnvifXMLTool *)createToolsWithDeviceUrlStr:(NSString *)deviceUrlStr
                                userName:(NSString *)userName
                                password:(NSString *)password;

获取media地址,ptz地址,token信息,stream url

- (void)getOnvifInfoComplete:(BYOnvifResultBlock)complete;

所有信息保留在resultItem里。

@property (nonatomic, strong, readonly) BYOnvifResultItem *resultItem;

<h4 id=’2-2-c’>    c. ptz管制</h3>

- (void)ptzControlWithType:(BYPTZCmdType)type
                  complete:(BYOnvifPTZResultBlock)complete;

<h3 id=’3′>三、iOS下的注意事项</h3>

  • iOS 14以上,获取局域网内设施信息须要申请权限,操作步骤参考iOS 14 UDP收不到播送解决;
  • IJKMediaFramework.framework因文件大小没有上传至git,可依据本人须要编译或网上寻找资源,编译时留神增加rtsp反对,找不到也可留言或者邮箱分割。


联系方式

邮箱: xiebangyao_1994@163.com
相干账号:

  • 掘金 – Adrenine
  • 简书 – Adrenine
  • Blog – Adrenine
  • Github – Adrenine

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理