1. 程式人生 > >onvif客戶端對接大華IPC出現錯誤分析。

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完成建立