1. 程式人生 > >onvif裝置發現

onvif裝置發現

1)由onvif官方的wsdl連結生成onvif.h標頭檔案

wsdl2h -c -s -t typemap.dat -o onvif.h http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl

2)soapcpp2.exe把onvif.h生成對應框架程式碼

soapcpp2.exe -2 -c onvif.h -I..\gsoap-2.8\gsoap\import -I..\gsoap-2.8\

-2: 使用soap1.2版本
-c: 生成c程式碼
注:
a.路徑為實際的路徑,根據自己環境進行具體設定

3)根據我前面一篇檔案把一些無用的檔案刪除掉
4)保留真正要用到的檔案

2014/11/08  14:26           509,842 stdsoap2.c
2016/07/04  11:02            23,882 soapStub.h
2016/07/04  11:02            21,693 soapClient.c
2014/11/08  14:26            98,504 stdsoap2.h
2016/07/04  16:55            11,513 soapServer.c
2016/07/04  11:02               725 wsdd.nsmap
2016/07/04  11:02           215,157 soapC.c
2016/07/04
11:02 95,813 soapH.h

5)編寫main.c,主要填充__wsdd__Probe函式,socket層接收到discovery組播包後會自動呼叫此函式

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "soapH.h"
#include "wsdd.nsmap"
#include "soapStub.h"


SOAP_FMAC5 int SOAP_FMAC6 SOAP_ENV__Fault(struct soap* soap, char
*faultcode, char *faultstring, char *faultactor, struct SOAP_ENV__Detail *detail, struct SOAP_ENV__Code *_SOAP_ENV__Code, struct SOAP_ENV__Reason *SOAP_ENV__Reason, char *SOAP_ENV__Node, char *SOAP_ENV__Role, struct SOAP_ENV__Detail *SOAP_ENV__Detail) { return 0; } SOAP_FMAC5 int SOAP_FMAC6 __wsdd__Hello(struct soap* soap, struct wsdd__HelloType *wsdd__Hello) { return 0; } SOAP_FMAC5 int SOAP_FMAC6 __wsdd__Bye(struct soap* soap, struct wsdd__ByeType *wsdd__Bye) { return 0; } SOAP_FMAC5 int SOAP_FMAC6 __wsdd__ProbeMatches(struct soap* soap, struct wsdd__ProbeMatchesType *wsdd__ProbeMatches) { return 0; } SOAP_FMAC5 int SOAP_FMAC6 __wsdd__Resolve(struct soap* soap, struct wsdd__ResolveType *wsdd__Resolve) { return 0; } SOAP_FMAC5 int SOAP_FMAC6 __wsdd__ResolveMatches(struct soap* soap, struct wsdd__ResolveMatchesType *wsdd__ResolveMatches) { return 0; } SOAP_FMAC5 int SOAP_FMAC6 __tdn__Hello(struct soap* soap, struct wsdd__HelloType tdn__Hello, struct wsdd__ResolveType *tdn__HelloResponse) { return 0; } SOAP_FMAC5 int SOAP_FMAC6 __tdn__Bye(struct soap* soap, struct wsdd__ByeType tdn__Bye, struct wsdd__ResolveType *tdn__ByeResponse) { return 0; } SOAP_FMAC5 int SOAP_FMAC6 __tdn__Probe(struct soap* soap, struct wsdd__ProbeType tdn__Probe, struct wsdd__ProbeMatchesType *tdn__ProbeResponse) { return 0; } SOAP_FMAC5 int SOAP_FMAC6 __wsdd__Probe(struct soap* soap, struct wsdd__ProbeType *wsdd__Probe) { #define MACH_ADDR_LENGTH 6 #define INFO_LENGTH 512 #define LARGE_INFO_LENGTH 1024 #define SMALL_INFO_LENGTH 512 printf("[%d] __wsdd__Probe start !\n", __LINE__); unsigned char macaddr[6] = {0}; char _IPAddr[INFO_LENGTH] = {0}; char _HwId[1024] = {0}; wsdd__ProbeMatchesType ProbeMatches; ProbeMatches.ProbeMatch = (struct wsdd__ProbeMatchType *)soap_malloc(soap, sizeof(struct wsdd__ProbeMatchType)); ProbeMatches.ProbeMatch->XAddrs = (char *)soap_malloc(soap, sizeof(char) * INFO_LENGTH); ProbeMatches.ProbeMatch->Types = (char *)soap_malloc(soap, sizeof(char) * INFO_LENGTH); ProbeMatches.ProbeMatch->Scopes = (struct wsdd__ScopesType*)soap_malloc(soap,sizeof(struct wsdd__ScopesType)); ProbeMatches.ProbeMatch->wsa__EndpointReference.ReferenceProperties = (struct wsa__ReferencePropertiesType*)soap_malloc(soap,sizeof(struct wsa__ReferencePropertiesType)); ProbeMatches.ProbeMatch->wsa__EndpointReference.ReferenceParameters = (struct wsa__ReferenceParametersType*)soap_malloc(soap,sizeof(struct wsa__ReferenceParametersType)); ProbeMatches.ProbeMatch->wsa__EndpointReference.ServiceName = (struct wsa__ServiceNameType*)soap_malloc(soap,sizeof(struct wsa__ServiceNameType)); ProbeMatches.ProbeMatch->wsa__EndpointReference.PortType = (char **)soap_malloc(soap, sizeof(char *) * SMALL_INFO_LENGTH); ProbeMatches.ProbeMatch->wsa__EndpointReference.__any = (char **)soap_malloc(soap, sizeof(char*) * SMALL_INFO_LENGTH); ProbeMatches.ProbeMatch->wsa__EndpointReference.__anyAttribute = (char *)soap_malloc(soap, sizeof(char) * SMALL_INFO_LENGTH); ProbeMatches.ProbeMatch->wsa__EndpointReference.Address = (char *)soap_malloc(soap, sizeof(char) * INFO_LENGTH); //netGetMac("eth4", macaddr); //eth0 根據實際情況填充 macaddr[0]=0x01;macaddr[1]=0x01;macaddr[2]=0x01;macaddr[3]=0x01;macaddr[4]=0x01;macaddr[5]=0x01; sprintf(_HwId,"urn:uuid:2419d68a-2dd2-21b2-a205-%02X%02X%02X%02X%02X%02X",macaddr[0], macaddr[1], macaddr[2], macaddr[3], macaddr[4], macaddr[5]); sprintf(_IPAddr, "http://%s/onvif/device_service", "192.168.1.33"); printf("[%d] _IPAddr ==== %s\n", __LINE__, _IPAddr); ProbeMatches.__sizeProbeMatch = 1; ProbeMatches.ProbeMatch->Scopes->__item =(char *)soap_malloc(soap, 1024); //memset(ProbeMatches.ProbeMatch->Scopes->__item,0,sizeof(ProbeMatches.ProbeMatch->Scopes->__item)); memset(ProbeMatches.ProbeMatch->Scopes->__item,0,1024); //Scopes MUST BE strcat(ProbeMatches.ProbeMatch->Scopes->__item, "onvif://www.onvif.org/type/NetworkVideoTransmitter"); ProbeMatches.ProbeMatch->Scopes->MatchBy = NULL; strcpy(ProbeMatches.ProbeMatch->XAddrs, _IPAddr); strcpy(ProbeMatches.ProbeMatch->Types, wsdd__Probe->Types); printf("wsdd__Probe->Types=%s\n",wsdd__Probe->Types); ProbeMatches.ProbeMatch->MetadataVersion = 1; //ws-discovery規定 為可選項 ProbeMatches.ProbeMatch->wsa__EndpointReference.ReferenceProperties->__size = 0; ProbeMatches.ProbeMatch->wsa__EndpointReference.ReferenceProperties->__any = NULL; ProbeMatches.ProbeMatch->wsa__EndpointReference.ReferenceParameters->__size = 0; ProbeMatches.ProbeMatch->wsa__EndpointReference.ReferenceParameters->__any = NULL; ProbeMatches.ProbeMatch->wsa__EndpointReference.PortType[0] = (char *)soap_malloc(soap, sizeof(char) * SMALL_INFO_LENGTH); //ws-discovery規定 為可選項 strcpy(ProbeMatches.ProbeMatch->wsa__EndpointReference.PortType[0], "ttl"); ProbeMatches.ProbeMatch->wsa__EndpointReference.ServiceName->__item = NULL; ProbeMatches.ProbeMatch->wsa__EndpointReference.ServiceName->PortName = NULL; ProbeMatches.ProbeMatch->wsa__EndpointReference.ServiceName->__anyAttribute = NULL; ProbeMatches.ProbeMatch->wsa__EndpointReference.__any[0] = (char *)soap_malloc(soap, sizeof(char) * SMALL_INFO_LENGTH); strcpy(ProbeMatches.ProbeMatch->wsa__EndpointReference.__any[0], "Any"); strcpy(ProbeMatches.ProbeMatch->wsa__EndpointReference.__anyAttribute, "Attribute"); ProbeMatches.ProbeMatch->wsa__EndpointReference.__size = 0; strcpy(ProbeMatches.ProbeMatch->wsa__EndpointReference.Address, _HwId); soap->header->wsa__To = "http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous"; soap->header->wsa__Action = "http://schemas.xmlsoap.org/ws/2005/04/discovery/ProbeMatches"; soap->header->wsa__RelatesTo = (struct wsa__Relationship*)soap_malloc(soap, sizeof(struct wsa__Relationship)); soap->header->wsa__RelatesTo->__item = soap->header->wsa__MessageID; printf("__item: %p, wsa__MessageID: %p: %s\n", soap->header->wsa__RelatesTo->__item, soap->header->wsa__MessageID, soap->header->wsa__MessageID); soap->header->wsa__RelatesTo->RelationshipType = NULL; soap->header->wsa__RelatesTo->__anyAttribute = NULL; soap->header->wsa__MessageID =(char *)soap_malloc(soap, sizeof(char) * INFO_LENGTH); strcpy(soap->header->wsa__MessageID,_HwId+4); if (SOAP_OK == soap_send___wsdd__ProbeMatches(soap, "http://", NULL, &ProbeMatches)) { printf("send ProbeMatches success !\n"); return SOAP_OK; } printf("[%d] soap error: %d, %s, %s\n", __LINE__, soap->error, *soap_faultcode(soap), *soap_faultstring(soap)); return soap->error;; } int main(int argc,char ** argv) { #define ONVIF_LISTEN_PORT 3702 printf("[%s][%d][%s][%s] start \n", __FILE__, __LINE__, __TIME__, __func__); int count = 0; struct soap ServerSoap; struct ip_mreq mcast; soap_init1(&ServerSoap, SOAP_IO_UDP | SOAP_XML_IGNORENS); soap_set_namespaces(&ServerSoap, namespaces); printf("[%s][%d][%s][%s] ServerSoap.version = %d \n", __FILE__, __LINE__, __TIME__, __func__, ServerSoap.version); if(!soap_valid_socket(soap_bind(&ServerSoap, NULL, ONVIF_LISTEN_PORT, 10))) { soap_print_fault(&ServerSoap, stderr); exit(1); } mcast.imr_multiaddr.s_addr = inet_addr("239.255.255.250"); mcast.imr_interface.s_addr = htonl(INADDR_ANY); if(setsockopt(ServerSoap.master, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mcast, sizeof(mcast)) < 0) { printf("setsockopt error! error code = %d,err string = %s\n",errno,strerror(errno)); return 0; } for(;;) { if(soap_serve(&ServerSoap)) { soap_print_fault(&ServerSoap, stderr); } soap_destroy(&ServerSoap); soap_end(&ServerSoap); //客戶端的IP地址 printf("RECEIVE count %d, connection from IP = %lu.%lu.%lu.%lu socket = %d \r\n", count, ((ServerSoap.ip)>>24)&0xFF, ((ServerSoap.ip)>>16)&0xFF, ((ServerSoap.ip)>>8)&0xFF,(ServerSoap.ip)&0xFF, (ServerSoap.socket)); count++; } //分離執行時的環境 soap_done(&ServerSoap); return 0; }

6)編譯

PWD := $(shell pwd)
CPP=gcc
CFLAGS=-Wall -I.
TARGET1 = $(PWD)/server

all: $(TARGET1)
$(TARGET1):$(OBJ)
    $(CPP) $(CFLAGS) -o [email protected] main.c soapC.c soapServer.c stdsoap2.c soapClient.c
clean:
    rm $(TARGET1)

7)使用onvif測試工具測試

[email protected]:/home/work/test/onvif/discovery# ./server 
[main.c][161][08:54:02][main] start 
[main.c][170][08:54:02][main] ServerSoap.version = 2 
[75] __wsdd__Probe start !
[99] _IPAddr ==== http://192.168.1.33/onvif/device_service
wsdd__Probe->Types="http://www.onvif.org/ver10/device/wsdl":Device
__item: 0x8fea608, wsa__MessageID: 0x8fea608: uuid:370c90b7-384c-4763-bd9c-873471e37963
send ProbeMatches success !
RECEIVE count 0, connection from IP = 192.168.1.32 socket = 3 
[75] __wsdd__Probe start !
[99] _IPAddr ==== http://192.168.1.33/onvif/device_service
wsdd__Probe->Types="http://www.onvif.org/ver10/device/wsdl":Device
__item: 0x8fea608, wsa__MessageID: 0x8fea608: uuid:370c90b7-384c-4763-bd9c-873471e37963
send ProbeMatches success !
RECEIVE count 1, connection from IP = 192.168.1.32 socket = 3 
[75] __wsdd__Probe start !
[99] _IPAddr ==== http://192.168.1.33/onvif/device_service
wsdd__Probe->Types=tdn:NetworkVideoTransmitter
__item: 0x8fea608, wsa__MessageID: 0x8fea608: uuid:0b4dfada-7a12-42bb-908f-ec4c0285270a
send ProbeMatches success !
RECEIVE count 2, connection from IP = 192.168.1.32 socket = 3 
[75] __wsdd__Probe start !
[99] _IPAddr ==== http://192.168.1.33/onvif/device_service
wsdd__Probe->Types=tdn:NetworkVideoTransmitter
__item: 0x8fea608, wsa__MessageID: 0x8fea608: uuid:0b4dfada-7a12-42bb-908f-ec4c0285270a
send ProbeMatches success !
RECEIVE count 3, connection from IP = 192.168.1.32 socket = 3 

這裡寫圖片描述

8)相關資料下載地址

相關推薦

實現Onvif裝置發現並與前端配合進行快速部署

我們都知道EasyNVR支援Onvif協議接入裝置 並且之前也介紹瞭如何進行Onvif的裝置發現,探測,資訊獲取等等 那我們是如何使用的呢,我們是如何使用Onvif協議為實施人員減輕配置工作的呢 看圖 EasyNVR的通道配置頁面,可以對通道進行

onvif裝置發現

1)由onvif官方的wsdl連結生成onvif.h標頭檔案 wsdl2h -c -s -t typemap.dat -o onvif.h http://www.onvif.org/onvif/ver10/network/wsdl/remotediscov

linux系統下,qtcreator實現onvif協議裝置發現

一、開發環境 Fedora23 qtcreator4.0.3 based on Qt5.6.2 海康威視DS-2CD2512F-IS攝像機 二、建立工程 很喜歡用qtcreator,其強大的補全和檢錯功能,用起來十分舒服。因此使用qtcreator來建

使用Onvif協議進行裝置發現以及指定裝置資訊探測

EasyNVR支援使用onvif協議對裝置進行裝置發現,雲臺控制,onvif地址獲取等功能 這裡第一篇我們來說一下關於如何進行裝置發現 準備 這裡我們之探討如何使用gsoap進行onvif客戶端的開發,關於gsoap的onvif框架生成請自行g

Onvif裝置發現

  研究Onvif終於告一個段落了,有些東西整理出來,供參考分享。   怎麼利用gsoap生成onvif客戶端程式碼,網上有很多介紹這裡就不再說明了。 下面直接上程式碼: int CONVIFClientDlg::ONVIF_Discovery(char *devType

海康 裝置 發現(SADPTool原理)

SADPTool原理: 向239.255.255.250:37020傳送基於ONVIF協議的 udp 組播,裝置會監聽 239.255.255.250:37020,收到指令,會向 傳送組播的機器,返回裝置資訊,也會向239.255.255.250:37020 傳送 裝置資訊

抓包分析DLNA——(1)裝置發現

UPnP協議將整個通訊過程分為五個步驟,分別是: Step0:地址分配,也就是裝置通過DHCP等協議獲取IP地址的過程。UPnP通訊的前提條件。 Step1:裝置發現(Discovery),controlpoint通過這一步驟找到感興趣的UPnP裝置。 Step2:裝

基於DLNA實現iOS,Android投屏:SSDP發現裝置

SSDP能夠在區域網能簡單地發現裝置提供的服務。SSDP有兩種發現方式:主動通知和搜尋響應方式。 定址 UPnP 技術是架構在 IP 網路之上。因此擁有一個網路中唯一的 IP 地址是 UPnP 裝置正常工作的基礎。UPnP 裝置首先檢視網路中是否有 DHCP 伺服器,如果有,那麼使用 DHC

onvif搜尋裝置

 概要: 目前ONVIF協議家族裝置已佔據數字監控行業半壁江山以上,親,作為開發者的你還在猶豫是否瞭解下嗎?本文介紹了ONVIF客戶端從裝置搜尋,鑑權,能力獲取,媒體資訊獲取,URI地址獲取的整套流程。文章只講述了比較重要或其他博文沒有講述的開發點,詳細可以參考文末參

自己構建一個裝置發現的應用

最近在研究一個國產協議IGRS,貌似是根據UPNP改的 研究得不深,只是看了它的基礎協議文件而已。 分享自己的一點小心得,向大家介紹一下, 如何實現區域網內的所有終端(phone/comper/TV...)能相互發現。 所謂相互發現就是指:不需要自己手動的輸入IP來指定相應的電腦。

大華NVR裝置接分別入宇視攝像機Onvif和RTSP主子碼流的方案說明

需求提要 1、各個內網現場有多種網路攝像機IPC和網路硬碟錄影機NVR裝置; 2、需要將這些裝置統一接入到雲端中心平臺,進行統一的視訊直播和錄影回放管理; 3、由於目前IPC裝置都屬於高清裝置,主碼流比較大,如果走公網傳輸,在雲端中心平臺觀看體驗會非常差,但不能直接降低IPC

Ubuntu啟用root賬戶後,登入root賬戶時報錯:讀取/root/.profile時發現錯誤:mesg:ttyname failed:對裝置不適當的ioctl操作 作為結果,會話不會被正確配置

將/root/.profile檔案中的mesg n 替換成tty -s && mesg n 重啟 方法二: 將非root賬戶目錄中的.profile複製到/root/: 例如:cp /home/username/.profile /root/ 重啟

Android adb devices 發現裝置處於offline狀態

Android在使用adb 命令時有時會發現裝置的狀態是offline,我的神呀,這怎麼讓我們除錯呢。必須解決這個問題。 解決方式如下: 以下方法請確保你的裝置處於除錯模式下。 方法一:執行 #adb kill-server                        

ONVIF協議網路攝像機(IPC)客戶端程式開發(7):裝置搜尋

1 專欄導讀 本專欄第一篇文章「專欄開篇」列出了專欄的完整目錄,按目錄順序閱讀,有助於你的理解,專欄前面文章講過的知識點(或程式碼段),後面文章不會贅述。為了節省篇幅,突出重點,在文章中展示的示例程式碼僅僅是關鍵程式碼,你可以在「專欄開篇」中獲取完整程式碼。

使用xbmc/kodi作為dlna render裝置時,連線到某些wifi熱點/路由器上,不能被dlna control找到發現的問題——原因是WIFI模組深度優化後,從省電模式喚醒時,會丟失組播包

測試環境及條件如下: 1)wifi熱點為我們工作環境用的普通路由器時,xbmc安裝在開發板上,作為dlna render裝置時,是可以被dlna control(為手機上的音樂apk,如魅族MX4 Pro自帶的音樂apk)發現的。 但是,當wifi熱點是採用tplink的T

linux裝置上的Onvif 實現11: 修改媒體配置資料的流程

前文已經說明了獲取攝像頭RTSP地址的完整方法,本文將要更進一步說明當發現攝像頭的配置資訊不支援的時候如何進行修改。完整的修改流程如下: 1 讀取媒體配置資訊 2 讀取子通道的配置資料範圍。 一般2通道,第1是主通道,第2是子通道。 3 根據資料範圍修改子通道的配置資料

EasyNVR中使用Onvif協議獲取裝置快照

我們知道EasyNVR中可以獲取快照資訊,之前的文章也說明了EasyNVR是如何進行快照抓取的 這裡我們使用另一種方法進行快照的抓取 流程 獲取裝置能力Capabilities 獲取裝置的能力,並且可以獲取到Media和PTZ的URI,使用Media

Linux裝置上的Onvif實現18: ONVIF視訊監視功能開發問題總結

ONVIF視訊監視功能開發問題總結        我從去年8月份開始學習ONVIF,經歷了各種困難,有時簡直要暴走發狂,終於能夠達成計劃目標,實現了預訂功能。痛苦已經過去,現在是寫個問題總結的時候了,希望能記錄遇到的問題,以便將來遺忘時參考。 測試的攝像頭有2種品牌3種型

linux裝置上的Onvif 實現4:成功編譯gsoap 2.8.15

前言     本說明示例是gsoap 2.8.15     gsoap工具包中支援的平臺是:linux386、macosx、win32,沒有提供嵌入式arm平臺,本文將指導完成交叉工具編譯生成嵌入式平臺工具。 工作目錄:\\192.168.0.234\work\gaoht\

Android Onvif 搜尋IPC裝置以及獲取IPC裝置資訊

最近,在接觸onvif協議在Android端的實現。抓了無數的包,踩了無數的坑之後,利用取巧的方式也終於實現部分的功能,主要是搜尋IPC裝置,獲取IPC裝置的一些資訊:rtsp地址,音視訊編解碼資訊,雲臺資訊等。關於onvif協議請自行百度。 思路