第一篇:開發總結
西博會總結
一. 提倡的地方
1. 數據方面:
利用Toad Data Modeler來設計數據模型;能夠非常清晰方便的了解整個系統表和表之間的關系。
整個項目的過程中,一直安排一個人來維護數據庫和數據庫模型。2.開發方面:
在項目周期相對比較短的情況下,可以分版本開發,每個版本完成一部分功能。我覺得這種方式值得提倡。
二. 改進的地方:
1.數據庫方面:
西博會系統設計的最初,所有表的主鍵都是由數據的序列自動產生的。開發工程中,程序員之間并沒有完全按照數據模型中的序列名來生成表的主鍵,導致了一個表有多個序列來生成主鍵,從而產生了數據庫主鍵唯一的沖突。2.開發方面:
西博會整個系統大部分都是前臺的工作,尤其像表單。每提交一份表單就得在前臺寫一套驗證規則,這樣重復性的工作很大。可以考慮將一些公共的驗證規則在項目開始之初就提取出來,這樣可以減少很大一部分工作,而且也便于后期維護。
第二篇:iwebshop開發總結
Iwebshop總結
1.C端(C控制器)有數據,V端(模板)收不到數據,一般可能的情況。
控制器名和模板名不一致,無法收到數據。
Foreach items=XX Item
2.控制器給模板數據的方式 $this->xx,setRenderData()1,必須是數組 2,因為iwebshop 在其 控制器基礎類 IControllerBase 使用了 extract,可以直接使用數組的鍵名(key)做變量名。
3.Iwebshop可以沒有action,但模板里面必須有同名的文件,如conf_base
4.后臺新建控制器時,要在themeroute中的$syscontroller中添加一個鍵值
5.數組序列化寫入配置文件時,需要在classes/config.php的$safeKey中添加一個鍵值,添加轉義符。
6.圖片不能上傳,多數原因是因為臨時路徑無法寫入
編輯php.ini文件,去掉upload_tmp_dir前面的分號并將其修改為: upload_tmp_dir =“C:/windows/temp”
大多數Windows環境下的臨時文件夾位置是:
C:/windows/temp,為這個臨時文件夾加入網站匿名訪問用戶組的讀寫權限,對于上層目錄windows設置users用戶的“列出目錄”的權限。大多數情況下,只需要設置臨時文件夾的訪問權限,而不需要更改php配置。
7.數據庫操作 Imodel update($where)add之前,setData 打印sql 在$sql后面echo $sql
getObj($where = false,$cols = '*')打印語句的在query方法中
query($where=false,$cols='*',$orderBy=false,$desc='DESC',$limit=50000)
Iquery 聯表 分組 having 取唯一值
聯表查詢 要注意起別名 //關聯商品
$relationObj = new IQuery('relation as r');$relationObj->join = ' left join goods as go on r.goods_id = go.id ';$relationObj->where = ' r.article_id = '.$this->article_id.' and go.id is not null ';
第三篇:開發輪崗總結
開發部輪崗總結
到公司報到的第一天,知道了自己的輪崗安排,第一個月在開發部,第二個月在銷售策劃部,是專業類輪崗安排。
上班的第一天,我主動請求周總安排我在開發部輪崗期間的工作任務。知道我是新人,對開發部的業務還未了解,周總先耐心地給我講解相關業務流程,接著幫我細分為6個步驟進行學習。主線是“看資料熟悉流程”,“六步走”分別是:①項目概況,要對富力城這個項目有大致的了解,只有知道項目情況后,才能制定開發報建計劃,才能更好展開工作;②開發項目建設計劃,就是時間計劃,每個在建項目都有時間控制節點,清楚各個時間節點,有利于開發報建工作的展開和順利完成;③開發報建大流程,我們知道開發需辦五大證:國有土地使用證、建設用地規劃許可證、建設工程規劃許可證、建設工程施工許可證、商品預售許可證,開發主要分規劃類和市政類,報建的工作會結合工程進度要求、銷售進度要求;④辦事流程,這是一份“秘籍”,周總在20年從事開發工作經驗的基礎上整理出來的一份辦事指引,里面詳細介紹了給規劃、市政專業類報建工作介入的時間節點,報建審批需提交的資料以及大體上的辦事流程;⑤綜合管網和市政臺帳,綜合管網是各類管線綜合圖,包括給水管線、排水管線、燃氣管線、雨水管線等,搞市政開發要學會看綜合管網圖,市政臺帳是便攜式工作計劃表,能夠清晰的顯示近期的工作安排以及 相關工作的完成情況;⑥個人工作節點,在熟悉開發部的工作內容之后,結合個人辦事能力和習慣,學會制作自己的工作臺帳,結合工程進度要求,倒排工作計劃。
根據周總給出的工作安排指引,同時也結合專業類輪崗任務書,我制定出了輪崗學習階段性的工作計劃,概括了自己在開發部輪崗一個月需要完成的“工作任務”,第一個月的輪崗學習就圍繞這個工作計劃展開。制訂月度總控計劃后,新的問題又出來了,要如何落實到每一周每一天呢?這個時候,公司的一個制度——周報便派上用場了,周報即總結了上一周工作任務的完成情況,又對下一周工作任務做出更為細致的安排。所以在月工作計劃的大框架下又制定了周報,將這一個月的學習任務合理地、可行地安排到每一周去,通過合理地制定計劃,自己就可以更好的把握第一個月的學習任務進度和完成情況。工作計劃制訂了之后,要做的就是按照計劃去執行。第一個星期,我給自己定的目標是用一周的時間,采用前面說到的“六步走”策略,從整體上去了解熟悉開發部的相關工作,由開始的項目概況到專業報建工作都要去學習的。一個星期下來,總的感覺就是累而充實,這里所說的累不是指上班很辛苦、身體很勞累,而是指大腦的疲勞。在學習的過程中,可以發現開發部的工作事項是很多的,一個項目從頭到尾,我們需要辦證、報建、驗收等等,而且有些工作還是很繁瑣的,非常考驗耐性。前輩們總結以往工作經驗整理出來的資料有厚厚的幾百頁紙,作為“插班生”的我首要任務就是仔細閱讀這些文案資料,只有了解了這個班集體,認真學習班集體的各項工作內容,知道我們的工作有幾個業務模塊、每個業務模塊的具體工作內容是什么之后,才能更好地融入到這個集體中去。
通過第一個星期的學習,對開發部的工作有大概的了解。為此,在查看資料之余,有時也作為學習人員跟著部門前輩外出辦事,在實踐的過程中體驗開發報建。通過這種實踐性的學習,可以給自己反饋出很多問題,帶給自己一些思考。最直接的就是一堆資料看完之后自己消化了多少,體現出對業務的真正了解程度。另外,在外出辦事的過程中,前輩會跟我交流很多,傳授他們自己的工作經驗和感悟。我不是一個擅長交談的人,但在有限的交流中也學到了很多,在公司上班與在學校讀書是有很大區別的,工作也會有不順心的事,但不能像在學校那樣不順心了就可以什么不做、不順心了就不理會其他人,我們在思想上不能再有以前學生時代那種“壞”想法了,要有一個好的心態。作為一個新人,更多得應該展現出自己獨特的優點,不要過早的“淪陷”在社會的大熔爐中,給公司注入真正意義上的新鮮血液。前輩的經驗感悟,值得新人學習的道理還有很多,這里不一一贅述了,說多了反而成為空談。
舉個例子說,之前現場參與了市政DN400管接駁工程施工驗收,是由我通知工程部的范工,簡單的小事也能體現辦事技巧和學問,通知的語言表達的條理性及合理性都是自己應該考慮的問題。還有一次是跟著去住建局開會,誠實地說整個會議下來沒聽懂多少,沒有抓住討論的核心問題,這就說明自己對業務仍不夠熟悉,對報建的工作進度沒有一個整體上的把握。反思過后,清楚地知道自己還有很多東西要去學習,事多事難不足懼,關鍵是要知道如何開始著手去做。但同時也必須告誡自己,不能盲目,做事不能操之過急,自己先主動思考,找到問題再主動快速出擊。我想這也就是杰哥告訴我的:心態要慢,動作要快的吧。
細節決定成敗。8月12日,第一次參加部門例會,此次會議主要是對前期工作中遇到并存在的問題予于解決,以及對后續工作進行合理安排。這次的會議紀要是由我這個菜鳥來整理,后來周總夸我會議紀要做得好,可功勞不是我一個人的。在提交給周總之前我請教前輩們很多次,他們提出了很多很好的修改意見。直到我呈報給周總,還是存在不少問題,也提出了一些修改意見,這足以說明周總的要求是多么嚴格,語言表達的準確性,文字、文本格式,標點符號等等都必須追求標準化。這些就是細節,就是簡單的一次會議紀要整理,細細的思考,可以發現有很多值得學習。很明顯的,你可以學到如何去做會議紀要,對文字性的東西要對自己提出怎樣的要求才是高標準,更為重要的是,可以從中體會工作的態度——細致,曾經的一位老師說過,將平凡的事做到極致就是偉大,對于這點自己還遠遠達不到要求。
一個月的時間太短,時間又總是過的太快,開發部的輪崗學習步入尾聲,回顧之前制作的輪崗學習工作計劃表,這一個月就是緊緊圍繞它展開學習開發報建的業務知識,相對來說對部門工作有了比較全面的了解。從表中可以看出,除了針對部門的學習任務之外,也安排了其他的學習任務,我認為在很多方面自己都需要去學習、去了解的,剛步入職場,先把自己掏空,才能學到更多。同時在這里也對工作任務表做個簡單說明,工作事項中紅色標記部分,是我認為自己在本階段完成比較差的,而在完成時間一欄,我認為黃色標記部分是分階段持續學習的,在下階段的輪崗中仍須繼續完成。
總結這個月的學習,給自己打分是75分,首先必須肯定自己是有表現好地方,但自己還是不夠積極主動,沒有發揮個人最大的主觀能動性,我覺得用周總的話來說就是如何克服客家人理念上的保守,有時候顧慮過多。我沒有參與到部門后兩次例會就很能說明問題,有一次是因為我不知道,暫且不去討論,但8月25日開部門例會自己是知道的,明明聽到了周總說待會開例會,僅僅是沒有點名讓我去參與,難道就因為這樣不參與了么?自己的遲疑,自己的猶豫不決,顧慮自己是否合適主動參與,就這樣與兩次例會擦肩而過,與學習的機會擦肩而過,也就是因為自己的優柔寡斷將自己孤立、讓自己成為邊緣人。那一天自己一直在反思,思考如何更好地融入團隊中去,成為其中的一員,思考如何將在集團培訓時所認知的團隊意識運用到自己的工作中去。
最后,真的很感謝開發部的每一位,在這一個月的輪崗學習期間主動、耐心地指導我學習開發報建的業務知識,以及對我這個“插班生”諸多錯誤的包容。我覺得自己就是這美麗世界的幸運兒,剛從學校走出來,就可以在這樣的一個部門跟著前輩們學習,更幸運的是遇到周總這樣的領導,跟周總的每一次交流都能學到很多,無論是在業務知識,還是工作態度上,以及做人做事的人生道理,概括來說這個月能從周總那帶走幾句話就能收益良多了:
1、敬業,踏實的工作,做事有頭有尾。
2、公德心,學會感恩。
3、細節注定成敗,做事細致,目的要明確。
4、做事應追求“守正出奇,惠人達己”。
5、在工作中克服客家人理念上的保守。
擺脫平庸的標準,才能成為真正的精英。
第四篇:NET 開發總結
.NET 開發總結
Web窗體的簡單說明:
這次作業都有一個共同點就是連接數據庫,對數據連接函數不是很熟悉,弄了好久,最后還是請教同學才實現數據庫的連接,連接代碼如下圖:
數據庫連接完成后,開始進行數據的整體的查詢,將查詢到的數據轉換成參數,利用參數進行分頁,將數據顯示在web上去。
對于分頁,我是按照每頁顯示是個數據來顯示的,本來還打算弄一個下拉窗口,當窗口下拉式可以選擇多少個數據分頁顯示,這一部分的功能還沒來得及去實現。
分頁的部分代碼
對于web 的查詢功能,用的是模糊查詢,代碼如圖
本次的.net開發技術作業,我選擇做webForm的分頁,之前一直沒有寫過web的代碼,只自學過一點腳本語言,對C#也不太了解,所以當做起來的時候比較困難,自己上網找了不少資料,到圖書館借了一些關于asp.net web開發的書,對C#開發的平臺還不是很熟悉,當程序調試起來非常困難,經常因為小問題而浪費許多的時間,開發過程中請教過一些有過web開發經驗的同學,也有幫助我進行程序的調試。由于不熟悉浪費了許多時間,沒有對代碼沒有時間去整理,使得代碼看起來很凌亂,很累贅,看起來顯得麻煩,還是一些功能還沒有實現,像查詢后的數據進行分頁,以及數據的修改和刪除。
第五篇:ONVIF開發總結
ONVIF開發經驗總結
ONVIF開發經驗總結.......................................................................................................................1
一、利用gsoap2.8.14生成Onvif相關源代碼...........................................................................2
1.生成onvif.h頭文件的方法.............................................................................................2
1)wsdl2h相關命令參數..............................................................................................2 2)鏈接網絡生成...........................................................................................................2 3)下載到本地生成.......................................................................................................2 4)備注說明...................................................................................................................2 2.生成onvif源代碼............................................................................................................3
1)整理相關的文件.......................................................................................................3 2)通過以下命令生成相關源文件...............................................................................3 3)Soapcpp2相關命令參數..........................................................................................3 4)備注說明...................................................................................................................3 3.利用gsoap2.8.8生成源代碼和gsoap2.8.14生成的差異.............................................3
1)typemap.dat文件中需要添加相關信息................................................................3 2)wsa5.h中無 SOAP_ENV__Fault函數.....................................................................4
二、新建工程,調試代碼.................................................................................................................4
三、設備發現main函數說明........................................................................................................5
四、遇到的問題和注意事項...........................................................................................................7
五、經驗總結................................................................................................................................15
一、利用gsoap2.8.14生成Onvif相關源代碼
1.生成onvif.h頭文件的方法
產生頭文件有兩種方法:鏈接網絡生成和本地生成。1)wsdl2h相關命令參數
-c
產生c語言的代碼,否則產生C++
-s
不使用STL代碼
-t
指定typemap.dat文件
-o
指定生成的頭文件名
2)鏈接網絡生成
? 將wsdl2.exe和typemap.dat文件放入同一個文件夾 ? 利用cmd或批處理執行以下dos命令: wsdl2h.exe-c-s-t typemap.dat-o onvif.h
http://www.tmdps.cn/onvif/ver10/network/wsdl/remotediscovery.wsdl http://www.tmdps.cn/onvif/ver10/device/wsdl/devicemgmt.wsdl http://www.tmdps.cn/onvif/ver20/analytics/wsdl/analytics.wsdl http://www.tmdps.cn/onvif/ver10/analyticsdevice.wsdl http://www.tmdps.cn/onvif/ver10/media/wsdl/media.wsdl http://www.tmdps.cn/onvif/ver10/deviceio.wsdl http://www.tmdps.cn/onvif/ver10/display.wsdl http://www.tmdps.cn/onvif/ver10/event/wsdl/event.wsdl http://www.tmdps.cn/onvif/ver20/imaging/wsdl/imaging.wsdl http://www.tmdps.cn/onvif/ver10/recording.wsdl http://www.tmdps.cn/onvif/ver10/replay.wsdl http://www.tmdps.cn/onvif/ver10/search.wsdl http://www.tmdps.cn/onvif/ver10/receiver.wsdl http://www.tmdps.cn/onvif/ver20/ptz/wsdl/ptz.wsdl 3)下載到本地生成
? 從ONVIF官網上把相關的WSDL文檔下載到本地,下載地址(詳細參見備注說明),此外還需下載樣式表,下載地址見WSDL文檔中的schemaLocation。
? 將wsdl2.exe、typemap.dath、WSDL文檔和樣式表放入同一文件夾中。
? 將相關WSDL文檔中的樣式表引入路徑(schemaLocation)修改為本地實際地址,如:event.wsdl中schemaLocation=“http://www.tmdps.cn/2005/08/addressing/ws-addr.xsd修改為schemaLocation = ws-addr.xsd ? 利用cmd或批處理執行以下命令
wsdl2h.exe-c-s-t typemap.dat-o onvif.h remotediscovery.wsdl devicemgmt.wsdl analytics.wsdl analyticsdevice.wsdl media.wsdl deviceio.wsdl display.wsdl event.wsdl imaging.wsdl recording.wsdl replay.wsdl search.wsdl receiver.wsdl ptz.wsdl 4)備注說明
? wsdl2.exe位于gsoap_2.8.14gsoap-2.8gsoapbin ? typemap.dat位于gsoap_2.8.14gsoap-2.8gsoap
? wsdl下載地址:http://www.tmdps.cn/Documents/Specifications.aspx ? 各url之間用空格隔開 ? typemap.dat不需要修改
? 鏈接網絡生成方法的優點是不用考慮以上文件對其它文件的依賴關系,不用修改引 入路徑。該方法的缺點跟網速有關,因此中途可能會中斷,如果超過5分鐘未生成,可重新執行命令, 通過代理上網則無法生成,不推薦用此方法。
? 下載本地生成方法的優缺點和鏈接網絡方法生成相反,代理網推薦使用此方法。2.生成onvif源代碼 1)整理相關的文件
把剛生成的onvif.h與soapcpp2.exe、import和custom放入同一文件夾,其中: soapcpp2.exe位于gsoap_2.8.14gsoap-2.8gsoapbin import位于gsoap_2.8.14gsoap-2.8gsoap custom位于gsoap_2.8.14gsoap-2.8gsoap 2)通過以下命令生成相關源文件
soapcpp2.exe-2 –c onvif.h-I import 3)Soapcpp2相關命令參數-2 采用SOAP1.2,-x 不產生xml文件(不推薦使用此命令,因為xml文檔很有用)-I 為引入路徑
-C 只產生客戶端代碼(注意:C是大寫)4)備注說明
? 需要在onvif.h中加入#import ”wsse.h,用來做安全驗證
? 需要將import目錄下的wsa5.h以下部分注釋掉,否則編譯時會報soap_xxxx_SOAP_ENV__Fault()函數重復定義。
int SOAP_ENV__Fault(_QName
faultcode, // SOAP 1.1 char *faultstring, // SOAP 1.1 char *faultactor, // SOAP 1.1 struct SOAP_ENV__Detail *detail, // SOAP 1.1 struct SOAP_ENV__Code *SOAP_ENV__Code, // SOAP 1.2 struct SOAP_ENV__Reason *SOAP_ENV__Reason, // SOAP 1.2 char *SOAP_ENV__Node, // SOAP 1.2 char *SOAP_ENV__Role, // SOAP 1.2 struct SOAP_ENV__Detail *SOAP_ENV__Detail, // SOAP 1.2
void);
3.利用gsoap2.8.8生成源代碼和gsoap2.8.14生成的差異
利用gsoap2.8.8生成源代碼方法跟gsoap2.8.14基本一致,但需注意以下區別: 1)typemap.dat文件中需要添加相關信息
tds = “http://www.tmdps.cn/ver10/device/wsdl” tev = “http://www.tmdps.cn/ver10/events/wsdl” tls = “http://www.tmdps.cn/ver10/display/wsdl” tmd = “http://www.tmdps.cn/ver10/deviceIO/wsdl” timg = “http://www.tmdps.cn/ver20/imaging/wsdl” trt = “http://www.tmdps.cn/ver10/media/wsdl” tptz = “http://www.tmdps.cn/ver20/ptz/wsdl” trv = “http://www.tmdps.cn/ver10/receiver/wsdl” trc = “http://www.tmdps.cn/ver10/recording/wsdl” tse = “http://www.tmdps.cn/ver10/search/wsdl” trp = “http://www.tmdps.cn/ver10/replay/wsdl” tan = “http://www.tmdps.cn/ver20/analytics/wsdl” tad = “http://www.tmdps.cn/ver10/analyticsdevice/wsdl” tdn = “http://www.tmdps.cn/ver10/network/wsdl” tt = “http://www.tmdps.cn/ver10/schema”
# OASIS recommended prefixes wsnt = “http://docs.oasis-open.org/wsn/b-2” wsntw = “http://docs.oasis-open.org/wsn/bw-2” wsrfbf = “http://docs.oasis-open.org/wsrf/bf-2” wsrfr = “http://docs.oasis-open.org/wsrf/r-2” wsrfrw = “http://docs.oasis-open.org/wsrf/rw-2” wstop = “http://docs.oasis-open.org/wsn/t-1”
# WS-Discovery 1.0 remapping wsdd10__HelloType = | wsdd__HelloType wsdd10__ByeType = | wsdd__ByeType wsdd10__ProbeType = | wsdd__ProbeType wsdd10__ProbeMatchesType = | wsdd__ProbeMatchesType wsdd10__ProbeMatchType = | wsdd__ProbeMatchType wsdd10__ResolveType = | wsdd__ResolveType wsdd10__ResolveMatchesType = | wsdd__ResolveMatchesType wsdd10__ResolveMatchType = | wsdd__ResolveMatchType # SOAP-ENV mapping SOAP_ENV__Envelope = struct SOAP_ENV__Envelope { struct SOAP_ENV__Header *SOAP_ENV__Header;_XML SOAP_ENV__Body;};| struct SOAP_ENV__Envelope SOAP_ENV__Header = | struct SOAP_ENV__Header SOAP_ENV__Fault = | struct SOAP_ENV__Fault SOAP_ENV__Detail = | struct SOAP_ENV__Detail SOAP_ENV__Code = | struct SOAP_ENV__Code SOAP_ENV__Subcode = | struct SOAP_ENV__Subcode SOAP_ENV__Reason = | struct SOAP_ENV__Reason 2)wsa5.h中無 SOAP_ENV__Fault函數
由于wsa5.h中沒有SOAP_ENV__Fault因此不會產生代碼重復,因此不用注釋。
二、新建工程,調試代碼
1.新建一個項目
將上面生成的soapH.h、soapStub.h、wsdd.nsmap、soapC.c、soapClient.c,還有位于gsoap-2.8gsoap 的:stdsoap2.c、stdsoap2.h和位于custom中的:duration.c放 入工程中,然后編寫main函數,調試代碼。2.文件主要功能說明
wsdd.nsmap 名空間定義,服務器端與客戶端都要包含它,里面有很多,都是
相同的,只需導入一個進入工程就行
stdsoap2.h
Header _le of stdsoap2.cpp runtime library stdsoap2.c
Runtime C library with XML parser and run-time support routines soapStub.h
soapH.h
//Main header file to be included by all client and service sources soapC.c
//Serializers and deserializers for the specfied data structures soapClient.c
//Client stub routines for remote operations
soapStub.h
A modi_ed and annotated header file produced from the input header file
三、設備發現main函數說明
#include
struct soap *soap;//soap環境變量 struct wsdd__ProbeType req;//客戶端發送的Probe struct __wsdd__ProbeMatches resp;//服務端回的Probematchs struct wsdd__ScopesType sScope;//Probe里面的范圍 struct SOAP_ENV__Header header;//SOAP的頭 int result = 0;//返回值
int count = 0;//獲得的設信息備個數
/**獲取guid(windows下叫guid,linux下叫uuid),格式為urn:uuid:8-4-4-4-12,由系統隨機產生**/ static char buf[64] = {0};//用來保存guid號
GUID guid;/*聲明guid為GUID結構體變量,包含4個變量,分別是 unsigned longData1;unsigned short Data2;unsigned short Data3;unsigned char Data4[ 8 ];{ _snprintf(buf,sizeof(buf), “urn:uuid:%08X-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X” , guid.Data1 , guid.Data2 , guid.Data3 , guid.Data4[0], guid.Data4[1] */ if(S_OK == CoCreateGuid(&guid))//如果guid生成成功,則將其轉為字符串,保存在buf中 , guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5] , guid.Data4[6], guid.Data4[7]);} soap = soap_new();//初始化soap
if(soap==NULL){ }
//設置接收Probematchs時間,超過5秒鐘沒有數據就退出 return-1;soap_set_namespaces(soap, namespaces);//設置命名空間
soap->recv_timeout = 5;/*****給頭賦值******/
header.wsa__MessageID = buf;header.wsa__To= “urn:schemas-xmlsoap-org:ws:2005:04:discovery”;header.wsa__Action= “http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe”;soap->header = &header;/*設置所需尋找設備的類型和范圍,二者至少設定一個,否則可能收到非ONVIF設備,出現異常*/ soap_default_wsdd__ScopesType(soap, &sScope);sScope.__item = “onvif://www.tmdps.cn”;//設置所需設備的sScope soap_default_wsdd__ProbeType(soap, &req);req.Scopes = &sScope;req.Types = “tdn:NetworkVideoTransmitter”;/*設置所需設備的類型,tdn
為命名空間前綴,為
wsdd.nsmap
文件中soap_default_SOAP_ENV__Header(soap, &header);//將header設置為soap消息的頭屬性
{“tdn”,“http://www.tmdps.cn/ver10/network/wsdl”}的tdn,如過不是tdn,而是其它,如ns1這里也要隨之改為ns1*/
//通過組播發送Probe探針,發送成功返回0,否則-1 result = soap_send___wsdd__Probe(soap, “soap.udp://239.255.255.250:3702”, NULL, &req);if(result==-1){
cout<<“soap error:”< result = soap_recv___wsdd__ProbeMatches(soap, &resp);if(result==-1){ cout<<“共發現”< //接收ProbeMatches,成功返回0,否則-1 }else { count++; cout<<“UUID:”<<“ ”< cout<<“Type:”<<“ ”< } cout<<“Scopes:”<<“ ”<< resp.wsdd__ProbeMatches-> ProbeMatch->Scopes->__item< ProbeMatch->XAddrs< cout<<“Device Service Address:”<<“ ”< }while(1);/********清除變量************/ soap_destroy(soap);// remove deserialized class instances(C++ only)soap_end(soap);soap_done(soap);return result; // clean up and remove deserialized data 四、調試過程遇到的問題和注意事項 1.出現如下語法錯誤: error C2143: 語法錯誤 : 缺少“{”(在“:”的前面)error C2059: 語法錯誤 : “:” error C2143: 語法錯誤 : 缺少“{”(在“:”的前面)需要將工程中的.c文件改成.cpp文件即可。 2.無法解析的外部命令錯誤soap_check_faultsubcode 在stdsoap2.h中聲明的soap_check_faultsubcode(struct soap *soap)函數在soapC.cpp中未實現, 可在soapC.cpp中添加如下實現: SOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultsubcode(struct soap *soap){ soap_fault(soap);if(soap->version == 2){ if(soap->fault->SOAP_ENV__Code && soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode && soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode)return soap->fault->SOAP_ENV__Code->SOAP_ENV__Subcode->SOAP_ENV__Value; return NULL;} return soap->fault->faultcode;} 3.無法解析的外部命令錯誤soap_check_faultdetail 在stdsoap2.h中聲明的soap_check_faultdetail(struct soap *soap)函數在soapC.cpp中未實現, 可在soapC.cpp中添加如下實現: SOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultdetail(struct soap *soap){ soap_fault(soap);if(soap->version == 2 && soap->fault->SOAP_ENV__Detail) return soap->fault->SOAP_ENV__Detail->__any;if(soap->fault->detail) return soap->fault->detail->__any;return NULL;} 4.出現無法解析的外部符號_soap_in_xsd__duration 無法解析的外部符號_soap_in_xsd__duration,該符號在函數_soap_getelement 中被引用soapC.obj : error LNK2019: 無法解析的外部符號_soap_out_xsd__duration,該符號在函數_soap_putelement 中被引用 soapC.obj : error LNK2019: 無法解析的外部符號_soap_default_xsd__duration,該符號在函數_soap_default__tse__FindMetadata 中被引用 需要將custom文件夾下面的duration.h和duration.c導入工程中。 5.在VS中出現fatal error C1128: 節數超過對象文件格式限制: 請使用/bigobj 進行編譯的錯誤 這是由于源代碼文件太大的原因,需添加選項/bigobj,在項目屬性-> C/C++->命令行的附加選項中添加/bigobj。 6.如果是調用soap_call_XXXX_Probe()來實現設備發現時不能發現所有onvif設備 該函數實現過程中只有一次接收過程,所以無法發現所有的設備的問題。如果使用該函數,還需要對函數的實現做以下更改: 函數的接收部分,將原來的XXXX:Response該為YYYY:ProbeMatches, 其中XXXX是.nsmap文件中http://www.tmdps.cn/ver10/network/wsdl“所對應的命名空間前綴,YYYY與后面YYYY:ProbeMatchesType中的前綴相同,都是http://schemas.xmlsoap.org/ws/2005/04/discovery所對應的命名空間前綴名。 7.抓包實驗問題 利用gsoap生成的wsdd.namsp如下: #include ”soapH.h“ SOAP_NMAC struct Namespace namespaces[] = { {”SOAP-ENV“, ”http://schemas.xmlsoap.org/soap/envelope/“, ”http://www.tmdps.cn/*/soap-envelope“, NULL}, {”SOAP-ENC“, ”http://schemas.xmlsoap.org/soap/encoding/“, ”http://www.tmdps.cn/*/soap-encoding“, NULL}, {”xsi“, ”http://www.tmdps.cn/2001/XMLSchema-instance“, ”http://www.tmdps.cn/*/XMLSchema-instance“, NULL}, {”xsd“, ”http://www.tmdps.cn/2001/XMLSchema“, ”http://www.tmdps.cn/*/XMLSchema“, NULL}, {”wsa“, ”http://schemas.xmlsoap.org/ws/2004/08/addressing“, NULL, NULL}, {”wsdd“, ”http://schemas.xmlsoap.org/ws/2005/04/discovery“, NULL, NULL}, {”chan“, ”http://schemas.microsoft.com/ws/2005/02/duplex“, NULL, NULL}, {”wsa5“, ”http://www.tmdps.cn/2005/08/addressing“, ”http://schemas.xmlsoap.org/ws/2004/08/addressing“, NULL}, {”xmime“, ”http://tempuri.org/xmime.xsd“, NULL, NULL}, {”xop“, ”http://www.tmdps.cn/2004/08/xop/include“, NULL, NULL}, {”tt“, ”http://www.tmdps.cn/ver10/schema“, NULL, NULL}, {”wsrfbf“, ”http://docs.oasis-open.org/wsrf/bf-2“, NULL, NULL}, {”wstop“, ”http://docs.oasis-open.org/wsn/t-1“, NULL, NULL}, {”wsrfr“, ”http://docs.oasis-open.org/wsrf/r-2“, NULL, NULL}, {”tad“, ”http://www.tmdps.cn/ver10/analyticsdevice/wsdl“, NULL, NULL}, {”tan“, ”http://www.tmdps.cn/ver20/analytics/wsdl“, NULL, NULL}, {”tdn“, ”http://www.tmdps.cn/ver10/network/wsdl“, NULL, NULL}, {”tds“, ”http://www.tmdps.cn/ver10/device/wsdl“, NULL, NULL}, {”tev“, ”http://www.tmdps.cn/ver10/events/wsdl“, NULL, NULL}, {”wsnt“, ”http://docs.oasis-open.org/wsn/b-2“, NULL, NULL}, {”timg“, ”http://www.tmdps.cn/ver20/imaging/wsdl“, NULL, NULL}, {”tls“, ”http://www.tmdps.cn/ver10/display/wsdl“, NULL, NULL}, {”tmd“, ”http://www.tmdps.cn/ver10/deviceIO/wsdl“, NULL, NULL}, {”tptz“, ”http://www.tmdps.cn/ver20/ptz/wsdl“, NULL, NULL}, {”trc“, ”http://www.tmdps.cn/ver10/recording/wsdl“, NULL, NULL}, {”trp“, ”http://www.tmdps.cn/ver10/replay/wsdl“, NULL, NULL}, {”trt“, ”http://www.tmdps.cn/ver10/media/wsdl“, NULL, NULL}, {”trv“, ”http://www.tmdps.cn/ver10/receiver/wsdl“, NULL, NULL}, {”tse“, ”http://www.tmdps.cn/ver10/search/wsdl“, NULL, NULL}, {NULL, NULL, NULL, NULL} }; 1)通過編寫面函數之后,調試運行結果如下: 其中http://192.168.106.112:80/onvif/device_service為本地模擬的設備 通過抓包工具獲得信息如下: 2).保留以下命名空間,刪除其它信息: #include ”soapH.h“ SOAP_NMAC struct Namespace namespaces[] = { {”SOAP-ENV“, ”http://schemas.xmlsoap.org/soap/envelope/“, ”http://www.tmdps.cn/*/soap-envelope“, NULL}, {”SOAP-ENC“, ”http://schemas.xmlsoap.org/soap/encoding/“, ”http://www.tmdps.cn/*/soap-encoding“, NULL}, {”xsi“, ”http://www.tmdps.cn/2001/XMLSchema-instance“, ”http://www.tmdps.cn/*/XMLSchema-instance“, NULL}, {”xsd“, ”http://www.tmdps.cn/2001/XMLSchema“, ”http://www.tmdps.cn/*/XMLSchema“, NULL}, {”wsa“, ”http://schemas.xmlsoap.org/ws/2004/08/addressing“, NULL, NULL}, {”wsdd“, ”http://schemas.xmlsoap.org/ws/2005/04/discovery“, NULL, NULL}, {”wsa5“,”http://www.tmdps.cn/2005/08/addressing“, ”http://schemas.xmlsoap.org/ws/2004/08/addressing“, NULL}, {”xmime“, ”http://tempuri.org/xmime.xsd“, NULL, NULL}, {”xop“, ”http://www.tmdps.cn/2004/08/xop/include“, NULL, NULL}, {”tt“, ”http://www.tmdps.cn/ver10/schema", NULL, NULL}, {NULL, NULL, NULL, NULL} };調試運行結果如下: 抓包工具抓到信息如下: 3)測試工具信息如下 抓包信息如下: 4)多次實驗顯示: wsdd.namsp文件太大時,將會被拆包,192.168.106.164將始終不會回消息,減小命名空間大小,保證只發送一個UDP包,192.168.106.164將始終能回消息 5)通過抓包發現,做設備管理功能時客戶端已能構與設備端通信,只是涉及到安全,設備端沒有返回信息 6)在程序運行時,可能會出現一下信息 這是由于Type和Scopes都沒有賦值,接收了非ONVIF的設備 它的body中沒有我們需要的值,所以在輸出時會引起中斷 五、經驗總結 1.對于利用gsoap工具實現基于ONVIF標準的功能,盡量按照如下順序: ? 了解所需實現的功能原理,參考< ? 根據所需實現的功能查看對應的xml文檔(生成源代碼時產生的,)因為生成的xml文檔是客戶端和服務端通信時所發送的模板結構,通過它可以了解編碼時所需要填充的信息 ? 了解工程中.h和.cpp的功能 ? 查看別人寫的例子,理解原理,要學會從原理上去分析碰到的問題并解決問題 ? 自己寫代碼驗證,事實求是,替自己負責,替用戶負責。 2.善于利用抓包工具 從原理上分析問題,能大大提高效率,如果利用測試工具跟客戶端通信,然后進行抓包,能構很好的分析出客戶端需發送的消息,服務端回的消息,非常利于編碼。