admin管理员组文章数量:1643280
相关配置
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); //
版权声明:本文标题:onvif 模拟摄像头_ONVIF 设备发现(网络摄像头)——实例笔记 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1729357372a1198397.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论