onvif客戶端對接大華IPC出現錯誤分析。
前段時間除錯onvif客戶端的時候出現了一個奇怪的問題,手頭有大華和海康的IPC各一個,海康的IPC使用onvif與待測試的onvif客戶端完美測試通過。但是在用大華裝置測試onvif客戶端的時候出現了一些奇怪的問題。這兩個奇怪的問題糾結了我2-3天,經過一段時間的努力終於解決了此bug,下面就此bug進行記錄,希望給開發onvif客戶端的coder們提供些許幫助。
錯誤1:客戶端呼叫GetOSDOptions,GetOSDs的時候,大華裝置也對此信令進行了完整的回覆,但是在客戶端使用返回引數trt__GetOSDOptionsResponse,trt__GetOSDsResponse的時候,發現這些引數都是NULL.但是通過抓包發現這些資料大華IPC已經進行了回覆。
解決:通過開啟-DDEBUG選項,檢視onvif客戶端的除錯資訊,發現在TEST.log中有如下Tags GetOSDs----------trt:GetOSDs match but namespaces differ;Tags GetOSDOptions----------trt:GetOSDOptions match but namespaces differ;在onvif框架程式碼中查詢namespaces differ,在stdsoap2.c的soap_match_tag函式中找到了
soap_match_tag(struct soap *soap, const char *tag1, const char *tag2) { register const char *s, *t; register int err; if (!tag1 || !tag2 || !*tag2) return SOAP_OK; s = strchr(tag1, ':'); t = strchr(tag2, ':'); if (t) { if (s) { if (t[1] && SOAP_STRCMP(s + 1, t + 1)) return SOAP_TAG_MISMATCH; if (t != tag2 && (err = soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, t)); if (err == SOAP_NAMESPACE) return SOAP_TAG_MISMATCH; return err; } } else if (!t[1]) { err = soap_match_namespace(soap, tag1, tag2, 0, t - tag2); if (err == SOAP_NAMESPACE) return SOAP_TAG_MISMATCH; } else if (SOAP_STRCMP(tag1, t + 1)) { return SOAP_TAG_MISMATCH; } else if (t != tag2 && (err = soap_match_namespace(soap, tag1, tag2, 0, t - tag2))) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s'----------'%s' match but namespaces differ\n", tag1, tag2)); if (err == SOAP_NAMESPACE) return SOAP_TAG_MISMATCH; return err; } DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags and (default) namespaces match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; } if (s) { if (SOAP_STRCMP(s + 1, tag2)) return SOAP_TAG_MISMATCH; } else if (SOAP_STRCMP(tag1, tag2)) return SOAP_TAG_MISMATCH; DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags match: '%s' '%s'\n", tag1, tag2)); return SOAP_OK; }
soap_match_namespace(struct soap *soap, const char *id1, const char *id2, size_t n1, size_t n2) { register struct soap_nlist *np = soap->nlist; const char *s; while (np && (strncmp(np->id, id1, n1) || np->id[n1])) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "np->id:%s id1:%s\n",np->id,id1)); np = np->next; } if (np) { if (!(soap->mode & SOAP_XML_IGNORENS)) if (np->index < 0 || ((s = soap->local_namespaces[np->index].id) && (strncmp(s, id2, n2) || (s[n2] && s[n2] != '_')))) return SOAP_NAMESPACE; return SOAP_OK; } if (n1 == 0) return (SOAP_XML_IGNORENS) ? SOAP_OK : SOAP_NAMESPACE;//modfied by Gaoy---20171016 soap->mode & SOAP_XML_IGNORENS---->SOAP_XML_IGNORENS if ((n1 == 3 && n1 == n2 && !strncmp(id1, "xml", 3) && !strncmp(id1, id2, 3)) || (soap->mode & SOAP_XML_IGNORENS)) return SOAP_OK; return soap->error = SOAP_SYNTAX_ERROR; }
最終確定是由於soap_match_namespace返回出錯導致的,故在soap_match_namespace將做如下修改return (SOAP_XML_IGNORENS) ? SOAP_OK : SOAP_NAMESPACE;//modfied by Gaoy---20171016 soap->mode & SOAP_XML_IGNORENS---->SOAP_XML_IGNORENS
經過此番修改,在獲取osd的時候上述錯誤便不再出現了。但是對於在此修改對其他地方造成的影響目前還未看到,希望遇到過此種問題的Coder們給我一點你們的修改提示。互相學習…………
錯誤2:客戶端可以獲取到大華IPC的視訊編碼引數,但是在將獲取到的引數重新設定下去就出現了錯誤
[11:50:25, onvif_client.c, 2309]soap error(12): SOAP-ENV:Sender, Parameters can not be set
[11:50:25, onvif_client.c, 2309]soap error(12): SOAP-ENV:Sender, Parameters can not be set
解決:經過在通過大華NVR去使用onvfi協議設定IPC引數的抓包資訊進行比較發現,是由於我的onvif客戶端程式碼在設定IPC引數的對於下圖中紅框框住的部分未進行賦值,估計大華對這些引數是不能進行修改的,但是由於我未賦值就傳下去了錯誤的值導致出錯。
客戶端和伺服器端的onvif版本:
大華IPC onvif版本:v2.4.1 onvif客戶端版本:17.06
相關推薦
onvif客戶端對接大華IPC出現錯誤分析。
前段時間除錯onvif客戶端的時候出現了一個奇怪的問題,手頭有大華和海康的IPC各一個,海康的IPC使用onvif與待測試的onvif客戶端完美測試通過。但是在用大華裝置測試onvif客戶端的時候出現了一些奇怪的問題。這兩個奇怪的問題糾結了我2-3天,經過一段時間的努力終於
Onvif客戶端出現“SOAP 1.2 fault: SOAP-ENV:Sender [no subcode]”錯誤解釋
用Onvif test tool測試自己寫的Onvif client時,Probe收到此資訊: SOAP 1.2 fault: SOAP-ENV:Sender [no subcode] "Stopped: no response sent or received (info
使用Git客戶端克隆項目時出現fatal: unable to access 錯誤的經歷
png log ges logs 技術 mage 分享 設置 xxx 幾經嘗試才發現是自己的網絡問題,因為自身dns的設置與他人的不同,沒有用公司dns服務器,導致使用域名連接https://git.xxx.com這樣的時候,解析的是外網的IP地址,而公司的DNS服務器指
SSH客戶端 登入阿里雲時出現如下錯誤:Disconnected:No supported authentication methods available
SSH客戶端 登入阿里雲時出現如下錯誤:Disconnected:No supported authentication methods available 問題現象 原因分析 解決方法 過程中學習到的Linux命令
gRPC的.netClient客戶端第一次連接出現StatusCode=Unavailable的解決辦法?
1.問題還原: The service does not automatically connect, free after a period of time, the first call will appear the following error, next to normal. The prog
nuxt.js引入客戶端指令碼和第三方庫出現window/document/ navigator未定義問題
官方文件中已經給出解決方案: 實際操作也比較簡單,比如我之前在專案中引入的wangeditor,這個外掛裡包含了navigator內容 解決:現在nuxt.config.js的webpack擴充套件配置中配置一個vendor用於打包客戶端執行的程式碼 這個vendor: ['
http傳輸json進行北京賽車平臺開發服務端介面與客戶端對接,以及restful實現
北京賽車平臺開發 教程地址:haozbbs.com Q1446595067 話不多說,直接貼程式碼,照寫就好了服務端介面編寫,我用的是springmvc,服務端介面其實和平時web開發一樣,就是返回出json就好了,還有就是接受資料也是json,方法如下: @Control
onvif開發之利用gSOAP生成onvif客戶端程式碼框架
cd gsoap-2.8 ./configure make sudo make install 命令列模式下敲入命令:wsdl2h -V 檢視gSOAP軟體版本,有版本出現則安裝成功。 2. 利用gSOAP生成onvif客戶端程式碼框架 2.1 在當前目錄下
關於webservice的三種java客戶端對接方法
第一次寫文章,所以裡邊會有些措辭或者描述不清楚的問題,請見諒 首先webservice大家肯定已經耳熟能詳了,而且webservice屬於比較古老的技術,但一些比較老的公司,由於架構的比較早,而且經歷數次迭代,人員更替,舊的技術很難優化,所以難免會遇到對接webservic
記錄一下 接入大華ipc攝像機rtsp流的經歷
當時接入rtsp伺服器時,我測過一些別的廠家的ipc,沒有理會rtcp訊息。當對於大華的ipc 不理會rtcp不行啊,你必須建立rtcp的通訊 隨便給它發點什麼東西都可以,然後流就接通上來了。不知道我這
來自iSpy整理的最全海康大華IPC的RTSP連線地址
先貼出處: 海康:http://www.ispyconnect.com/man.aspx?n=Hikvision 大華:http://www.ispyconnect.com/man.aspx?n=Dahua 海康: Models Ty
onvif客戶端
nap str c_str digest image 找到 ref 完成 earch 前言 做開發有8年時間了,ffmpeg和onvif與我是特別有緣的了(說著玩的,我更認為是因為他們確實強大^_^)。 ffmpeg在畢業設計時就有用到,5年後做windows、linux播
Onvif客戶端與伺服器通訊時鑑權的自實現
OnvifDigest.h /** SHA1 digest size in octets */ #define SOAP_SMD_SHA1_SIZE (20) /** Size of the random nonce */ #define SOAP_WSSE_NONCELEN (20) #define
onvif 客戶端發現
1、解壓:unzip -X gsoap_2.8.10.zip 編譯 2、下載: wget http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl 3、複製: cp gsoap-2.8/gsoap/typemap.dat . 4、在
soap工具生成onvif客戶端
新年開始,回到公司第一件事情就是處理年前沒有弄完的onvif客戶端;按照計劃,使用soap包直接生成onvif客戶端程式碼;經過若干次整理測試,最終整理了一個簡單的指令碼和一段示例程式碼。做技術的人是苦逼的人,希望看到這篇文章的人不要像我一樣,折騰那麼久;下面就說一說我的操
http傳輸json進行服務端介面與客戶端對接,以及restful實現
話不多說,直接貼程式碼,照寫就好了 服務端介面編寫,我用的是springmvc,服務端介面其實和平時web開發一樣,就是返回出json就好了,還有就是接受資料也是json,方法如下: @Controller @RequestMapping("/user") public
SQL存儲過程內部RaisError客戶端抓不住彈不出錯誤的解決
log ota 會同 atd 測試 cap connected 數據 rap 我們有個海宏商業erp3,庫存部分是用存儲過程寫的,減庫存時會先檢查負庫存,比如還有5個你想出庫6個,存儲過程就raisError(‘庫存不足‘,16,1)。 最近這一個版本發布後,有客戶反映有時
客戶端啟動連線本地mysql,錯誤提示plugin caching_sha2_password could not be loaded
原來是用navicat視覺化工具,後來用了HeidiSQL,輸入賬號密碼後一直無法進入資料庫報錯 1.127.0.01和localhost的區別 一個是本機地址還有一個是別名 同時localhost不依賴於網絡卡,不受到防火牆的限制。 127這個域名則相反。 ipv4是物理網路介面的一個代
由於這臺計算機沒有終端伺服器客戶端訪問許可證,遠端會話被中斷。請與伺服器管理員聯絡 解決
今天用xp機器連線遠端的win2003伺服器是提示"由於這臺計算機沒有終端伺服器客戶端訪問許可證,遠端會話被中斷。請與伺服器管理員聯絡" 在網上找了一下,發現一下解決方案: 1.在伺服器上將終端伺服器授權模式從“每裝置”更改為“每使用者”。 2.在客戶端上,導航到下列登錄檔子
傳奇原始碼分析-客戶端(WindHorn簡述和傳奇檔案格式分析)
DirectX類庫分析(WindHorn):1.RegHandler.cpp 登錄檔訪問(讀寫)。2.CWHApp派生CWHWindow,CWHWindow完成視窗的註冊和建立。CWHWindow派生出CWHDXGraphicWindow,CWHDXGraphicWindow呼叫CWHWindow完成建立