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