admin管理员组

文章数量:1643366

相关配置

ONVIF官网:http://www.onvif/

gSOAP安装配置:gSOAP安装配置+使用案例参考+参考链接

操作系统:CentOS7

资料参考:

许振坪的ONVIF专栏:传送门

onvif开发之设备发现功能的实现

Linux下onvif服务端之发现设备

还有一个博文找不到网址了,如果网友发现可以私信补充。

代码实战

完整源码下载:GitHub,码云

客户端

1、WS-Discovery的Ad hoc模式,使用多播(不使用gSOAP实现设备发现)

参考文章:ONVIF协议网络摄像机(IPC)客户端程序开发(7):设备搜索

源码如下 search_c.c:

#include

#include

#include

#ifdef WIN32

#include

#else

#include

#include

#include

#include

#include

#endif

/* 从技术层面来说,通过单播、多播、广播三种方式都能探测到IPC,但多播最具实用性*/

#define COMM_TYPE_UNICAST 1// 单播

#define COMM_TYPE_MULTICAST 2// 多播

#define COMM_TYPE_BROADCAST 3// 广播

#define COMM_TYPE COMM_TYPE_MULTICAST

/* 发送探测消息(Probe)的目标地址、端口号 */

#if COMM_TYPE == COMM_TYPE_UNICAST

#define CAST_ADDR "100.100.100.15"// 单播地址,预先知道的IPC地址

#elif COMM_TYPE == COMM_TYPE_MULTICAST

#define CAST_ADDR "239.255.255.250"// 多播地址,固定的239.255.255.250

#elif COMM_TYPE == COMM_TYPE_BROADCAST

#define CAST_ADDR "100.100.100.255"// 广播地址

#endif

#define CAST_PORT 3702// 端口号

/* 以下几个宏是为了socket编程能够跨平台,这几个宏是从gsoap中拷贝来的 */

#ifndef SOAP_SOCKET

# ifdef WIN32

# define SOAP_SOCKET SOCKET

# define soap_closesocket(n) closesocket(n)

# else

# define SOAP_SOCKET int

# define soap_closesocket(n) close(n)

# endif

#endif

#if defined(_AIX) || defined(AIX)

# if defined(_AIX43)

# define SOAP_SOCKLEN_T socklen_t

# else

# define SOAP_SOCKLEN_T int

# endif

#elif defined(SOCKLEN_T)

# define SOAP_SOCKLEN_T SOCKLEN_T

#elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN) || defined(FREEBSD) || defined(__FreeBSD__) || defined(OPENBSD) || defined(__QNX__) || defined(QNX) || defined(OS390) || defined(__ANDROID__) || defined(_XOPEN_SOURCE)

# define SOAP_SOCKLEN_T socklen_t

#elif defined(IRIX) || defined(WIN32) || defined(__APPLE__) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS) || defined(HP_UX)

# define SOAP_SOCKLEN_T int

#elif !defined(SOAP_SOCKLEN_T)

# define SOAP_SOCKLEN_T size_t

#endif

#ifdef WIN32

#define SLEEP(n) Sleep(1000 * (n))

#else

#define SLEEP(n) sleep((n))

#endif

/* 探测消息(Probe),这些内容是ONVIF Device Test Tool 15.06工具搜索IPC时的Probe消息,通过Wireshark抓包工具抓包到的 */

const char *probe = "uuid:fc0bad56-5f5a-47f3-8ae2-c94a4e907d70urn:schemas-xmlsoap-org:ws:2005:04:discoveryhttp://schemas.xmlsoap/ws/2005/04/discovery/Probedn:NetworkVideoTransmitter";

int main(int argc, char **argv)

{

int ret;

int optval;

SOAP_SOCKET s;

SOAP_SOCKLEN_T len;

char recv_buff[4096] = {0};

struct sockaddr_in multi_addr;

struct sockaddr_in client_addr;

#ifdef WIN32

WSADATA wsaData;

if( WSAStartup(MAKEWORD(2,2), &wsaData) != 0 ) { // 初始化Windows Sockets DLL

printf("Could not open Windows connection.\n");

return 0;

}

if ( LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2 ) {

printf("the version of WinSock DLL is not 2.2.\n");

return 0;

}

#endif

s = socket(AF_INET, SOCK_DGRAM, 0); //

本文标签: 摄像头实例发现笔记设备