Adrenine / BYOnvif

iOS example of Onvif protocol usage.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

BYOnvif

目录

    c. ptz控制


零、前言

最近公司需要集成摄像头,采用Onvif协议,网上没找到可以直接运行的代码或者可运行的都需要大量积分,所以自己找资料参考实现,现将代码和集成方式分享出来。
若您非iOS平台,参考Onvif协议的C语言实现即可;iOS平台建议使用Onvif协议收发XML实现
本文不会详细讲解Onvif协议,简单介绍代码的使用。如果工程对您有用,希望能点一个⭐,谢谢。

一、Onvif协议的C语言实现

  1. 参考文章

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

  2. 集成方式

将以下文件拖入工程 (非iOS工程需要自己集成openssl)

image.png

image.png

image.png

  3. 方法调用

(以下OC方法都是通过C语言实现,非iOS平台修改方法名,自己设置回调即可。)

    a. 探寻设备

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

    b. 获取设备能力

注意:以下操作都需要鉴权,而且每次调用onvif库函数,都需要鉴权一次。

传入上一步获取的设备地址 (海康的设备地址需要做分割) 通用设备可以获得:

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

    c. 获取token

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

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

    d. 获取推流url

传入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;

    e. ptz停止移动

传入获取设备能力获取到的ptz地址和获取token获得的token,下面ptz方法传入都需要传入这两个参数,停止ptz移动

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

    f. ptz持续移动

控制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;

    g. ptz相对移动

ptz相对上一个位置移动一个步长,步长[0, 1)的一个区间

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

    h. ptz获取当前状态

获取当前ptz的状态(设备当前所处的坐标)

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

二、Onvif协议收发XML实现

  1. 集成方式

image.png

image.png

  2. 方法调用

    a. 探寻设备

探寻设备使用UDPSocket,往239.255.255.250:3702发送探寻信息,等待组播返回信息

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

    b. 获取设备所有信息

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

+ (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;

    c. ptz控制

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

三、iOS下的注意事项

  • iOS 14以上,获取局域网内设备信息需要申请权限,操作步骤参考iOS 14 UDP收不到广播处理

  • IJKMediaFramework.framework因文件大小没有上传至git,可根据自己需要编译或网上寻找资源,编译时注意添加rtsp支持,找不到也可留言或者邮箱联系。


联系方式

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

About

iOS example of Onvif protocol usage.

License:MIT License


Languages

Language:C 85.8%Language:Objective-C 13.5%Language:C++ 0.6%Language:Ruby 0.0%