onvif開發乙個重要的部分就是鑑權,這點在前面第一篇生成soap框架**時就有提到。在標頭檔案裡加入鑑權的包含檔案:
#import
"wsse.h"
onvif要實現鑑權功能,有兩種方式:
直接使用gsoap自帶的源**檔案+openssl庫;在window端就一般採用第一種方式了,比較方便,需要的函式直接呼叫就可以了,其實主要是乙個函式:剪下部分上述檔案裡的必需**,自實現鑑權功能。
soap_wsse_add_usernametokendigest(struct soap *soap, const
char *id, const
char *username, const
char *password)
如果採用第一種方式,直接呼叫上面的函式,就實現了鑑權功能。
但是在嵌入式端,一般儲存空間有限,占用空間少的方案2當然是首選。
dom.c wsseapi.c smdevp.c mecevp.c threads.c wsaapi.c還有對應的標頭檔案。這些檔案一般在
\gsoap-2.8\gsoap\plugin\
,把這些檔案單獨拷貝到編譯目錄中,無關的檔案一概不拷貝;
呼叫過程:
soap_p2f = soap_new();//soap初始化
soap_set_namespaces(soap_p2f, namespaces);//命名空間,用到前面生成soap框架時生成的.namespace檔案
struct _tptz__absolutemove absolutemove;//ptz控球需要用到的結構體,後面會講到
struct _tptz__absolutemoveresponse absolutemoveresponse;//ptz控球返回的結構體
soap_wsse_add_usernametokendigest(soap_p2f, null, "admin", "admin123456");//wsse表示是鑑權功能函式
soap_default__tptz__absolutemove(soap_p2f, &absolutemove);//defualt函式的作用其實就是將後面的結構體清空
soap_default__tptz__absolutemoveresponse(soap_p2f, &absolutemoveresponse);
...//填充absolutemove結構體
soap_call___tptz__absolutemove(soap_p2f, ball_onvifserver, null, &absolutemove, &absolutemoveresponse);//傳送soap呼叫命令
這裡就需要自己實現上面說的那個函式soap_wsse_add_usernametokendigest
了。嵌入式裝置就是用的這種方法。其實就是把原始碼部分**直接拷貝到自己的工程源**中,需要實現的函式有:
soap_wsse_add_usernametokendigest(struct soap *soap, const
char *id, const
char *username, const
char *password)
soap_wsse_add_usernametokentext(struct soap *soap, const
char *id, const
char *username, const
char *password) ;
soap_wsse_add_security(struct soap *soap) ;
calc_digest(struct soap *soap, const
char *created, const
char *nonce, int noncelen, const
char *password, char hash[soap_smd_sha1_size]);
calc_nonce(struct soap *soap, char nonce[soap_wsse_noncelen])
sha1padmessage(sha1context *context)
sha1processmessageblock(sha1context *context)
sha1reset(sha1context *context)
sha1input(sha1context *context,const
char *message_array, unsigned length)
sha1reset(sha1context *context)
一般全景相機(嵌入式裝置)向球機傳送onvif控球命令時,鑑權就是用這種方式。
要注意的是,每次鑑權後,其包含驗證資訊的頭部就會被置空,所以每次操作前都需要加上鑑權操作。推薦的做法是:將鑑權語句加入到每個需要鑑權的命令前,並封裝起來成為自己的命令。
gsoap onvif編譯過程
編譯命令 第一步生成 onvif.h 檔案 wsdl2h o onvif.h t typemap.dat remotediscovery.wsdl devicemgmt.wsdl analytics.wsdl analyticsdevice.wsdl media.wsdl deviceio.wsdl...
網路初探(二)
路由定義 路由的定義 沿物理路徑進行通訊,必須獲得有關資料鏈路標識和資料封裝的資訊,並 且這些資訊要儲存在資料庫中,如 arp高速緩衝。同樣,傳輸層 網路層也需要獲取和儲存所涉及到的相關資訊。有區別的是,這些資訊被儲存在路由表中,路 由表又叫路由選擇資訊庫 rib 路由表 目標位址和下一跳位址 如果...
索引初探(二)
在sqlserver中分為兩種索引,一是聚集索引 一是費聚集索引。下面我就分別對兩種索引進行介紹並分析其區別和各自的特點。1.聚集索引 之前看過乙個比方,我覺得非常恰當這裡也用這個例子來說明兩種索引。我們的字典本身就像是乙個聚集索引,我們根據拼音查詢目錄,然後直接可以找到查詢字的頁,而字典正文就是按...