onvif协议

onvif协议是视频监控领域共同制订的一套标准,以探测同一局域网内摄像头信息。

onvif开源代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <unistd.h> 

/* 发送探测消息(Probe)的目标地址、端口号 */ 
#define CAST_ADDR  "239.255.255.250"  // 多播地址,固定的239.255.255.250 
#define CAST_PORT  3702               // 端口号
 
const char *probe = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Envelope xmlns:dn=\"http://www.onvif.org/ver10/network/wsdl\" xmlns=\"http://www.w3.org/2003/05/soap-envelope\"><Header><wsa:MessageID xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\">uuid:fc0bad56-5f5a-47f3-8ae2-c94a4e907d70</wsa:MessageID><wsa:To xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\">urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To><wsa:Action xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\">http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</wsa:Action></Header><Body><Probe xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"http://schemas.xmlsoap.org/ws/2005/04/discovery\"><Types>dn:NetworkVideoTransmitter</Types><Scopes /></Probe></Body></Envelope>"; 
 
int main(int argc, char **argv) 
{ 
    int ret;
	int optval; 
	int s; 
	int len; 
	char recv_buff[4096] = {0}; 
	struct sockaddr_in multi_addr;
	struct sockaddr_in client_addr;
	
	s = socket(AF_INET, SOCK_DGRAM, 0); // 建立数据报套接字
	if (s < 0) 
	{ 
		perror("socket error");
		return -1; 
	} 
		
	multi_addr.sin_family = AF_INET; // 搜索IPC:使用UDP向指定地址发送探测消息(Probe) 
	multi_addr.sin_port = htons(CAST_PORT); 
	multi_addr.sin_addr.s_addr = inet_addr(CAST_ADDR); 
	ret = sendto(s, probe, strlen(probe), 0, (struct sockaddr*)&multi_addr, sizeof(multi_addr)); 
	if (ret < 0) 
	{ 
		perror("sendto error");
		return -1; 
	} 
	
	printf("Send Probe message to [%s:%d]\n\n", CAST_ADDR, CAST_PORT); 
	
	SLEEP(1);

	for (;;) 
	{ 
		// 接收IPC的应答消息(ProbeMatch)
		len = sizeof(client_addr); 
		memset(recv_buff, 0, sizeof(recv_buff)); 
		memset(&client_addr, 0, sizeof(struct sockaddr)); 
		ret = recvfrom(s, recv_buff, sizeof(recv_buff) - 1, 0, (struct sockaddr*)&client_addr, &len); 
		printf("===Recv ProbeMatch from [%s:%d]===\n%s\n\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), recv_buff); 
		SLEEP(1); 
		
	}
		
	return 0;
}

1、ue设备发送组播、目的端口为3702的udp发现报文,udp报文数据部分为xml格式

2、支持onvif协议的摄像头收到该报文后,会回复ProbeMatch报文

onvif测试工具:

xml格式是通过采用onvif测试工具(ONVIF测试工具(ONVIF Device Test Tool)_146@971597.exx)抓取的,在pc上安装该工具后,pc会自动发送onvif发现报文,和pc在同一局域网内的摄像头均回复该报文,onvif测试工具则可以获取所有摄像头相关信息。

onvif协议报文:

发现报文:

应答报文:

 

参考文档:

https://blog.csdn.net/benkaoya/article/details/72476120
https://www.cnblogs.com/attilax/p/6181545.html

https://blog.csdn.net/foreverhot1019/article/details/83301513
ONVIF协议网络摄像机(IPC)客户端程序开发(2):第一次使用IPC摄像头
https://blog.csdn.net/benkaoya/article/details/72426853

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值