目录
零、前言
一、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