【开发笔记#3】Onvif协议的两种实现方式

Adrenine

目录

零、前言

一、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)

image.png

image.png

image.png

<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>

image.png

image.png

<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
相关账号:

阅读 2.5k

Adrenine
最怕一生碌碌无为却道平凡难能可贵!

最怕一生碌碌无为却道平凡难能可贵!

9 声望
3 粉丝
0 条评论

最怕一生碌碌无为却道平凡难能可贵!

9 声望
3 粉丝
文章目录
宣传栏