第一篇:iwebshop開發(fā)總結(jié)
Iwebshop總結(jié)
1.C端(C控制器)有數(shù)據(jù),V端(模板)收不到數(shù)據(jù),一般可能的情況。
控制器名和模板名不一致,無法收到數(shù)據(jù)。
Foreach items=XX Item
2.控制器給模板數(shù)據(jù)的方式 $this->xx,setRenderData()1,必須是數(shù)組 2,因?yàn)閕webshop 在其 控制器基礎(chǔ)類 IControllerBase 使用了 extract,可以直接使用數(shù)組的鍵名(key)做變量名。
3.Iwebshop可以沒有action,但模板里面必須有同名的文件,如conf_base
4.后臺(tái)新建控制器時(shí),要在themeroute中的$syscontroller中添加一個(gè)鍵值
5.數(shù)組序列化寫入配置文件時(shí),需要在classes/config.php的$safeKey中添加一個(gè)鍵值,添加轉(zhuǎn)義符。
6.圖片不能上傳,多數(shù)原因是因?yàn)榕R時(shí)路徑無法寫入
編輯php.ini文件,去掉upload_tmp_dir前面的分號(hào)并將其修改為: upload_tmp_dir =“C:/windows/temp”
大多數(shù)Windows環(huán)境下的臨時(shí)文件夾位置是:
C:/windows/temp,為這個(gè)臨時(shí)文件夾加入網(wǎng)站匿名訪問用戶組的讀寫權(quán)限,對(duì)于上層目錄windows設(shè)置users用戶的“列出目錄”的權(quán)限。大多數(shù)情況下,只需要設(shè)置臨時(shí)文件夾的訪問權(quán)限,而不需要更改php配置。
7.數(shù)據(jù)庫操作 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 聯(lián)表 分組 having 取唯一值
聯(lián)表查詢 要注意起別名 //關(guān)聯(lián)商品
$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 ';
第二篇:開發(fā)總結(jié)
西博會(huì)總結(jié)
一. 提倡的地方
1. 數(shù)據(jù)方面:
利用Toad Data Modeler來設(shè)計(jì)數(shù)據(jù)模型;能夠非常清晰方便的了解整個(gè)系統(tǒng)表和表之間的關(guān)系。
整個(gè)項(xiàng)目的過程中,一直安排一個(gè)人來維護(hù)數(shù)據(jù)庫和數(shù)據(jù)庫模型。2.開發(fā)方面:
在項(xiàng)目周期相對(duì)比較短的情況下,可以分版本開發(fā),每個(gè)版本完成一部分功能。我覺得這種方式值得提倡。
二. 改進(jìn)的地方:
1.數(shù)據(jù)庫方面:
西博會(huì)系統(tǒng)設(shè)計(jì)的最初,所有表的主鍵都是由數(shù)據(jù)的序列自動(dòng)產(chǎn)生的。開發(fā)工程中,程序員之間并沒有完全按照數(shù)據(jù)模型中的序列名來生成表的主鍵,導(dǎo)致了一個(gè)表有多個(gè)序列來生成主鍵,從而產(chǎn)生了數(shù)據(jù)庫主鍵唯一的沖突。2.開發(fā)方面:
西博會(huì)整個(gè)系統(tǒng)大部分都是前臺(tái)的工作,尤其像表單。每提交一份表單就得在前臺(tái)寫一套驗(yàn)證規(guī)則,這樣重復(fù)性的工作很大??梢钥紤]將一些公共的驗(yàn)證規(guī)則在項(xiàng)目開始之初就提取出來,這樣可以減少很大一部分工作,而且也便于后期維護(hù)。
第三篇:開發(fā)輪崗總結(jié)
開發(fā)部輪崗總結(jié)
到公司報(bào)到的第一天,知道了自己的輪崗安排,第一個(gè)月在開發(fā)部,第二個(gè)月在銷售策劃部,是專業(yè)類輪崗安排。
上班的第一天,我主動(dòng)請(qǐng)求周總安排我在開發(fā)部輪崗期間的工作任務(wù)。知道我是新人,對(duì)開發(fā)部的業(yè)務(wù)還未了解,周總先耐心地給我講解相關(guān)業(yè)務(wù)流程,接著幫我細(xì)分為6個(gè)步驟進(jìn)行學(xué)習(xí)。主線是“看資料熟悉流程”,“六步走”分別是:①項(xiàng)目概況,要對(duì)富力城這個(gè)項(xiàng)目有大致的了解,只有知道項(xiàng)目情況后,才能制定開發(fā)報(bào)建計(jì)劃,才能更好展開工作;②開發(fā)項(xiàng)目建設(shè)計(jì)劃,就是時(shí)間計(jì)劃,每個(gè)在建項(xiàng)目都有時(shí)間控制節(jié)點(diǎn),清楚各個(gè)時(shí)間節(jié)點(diǎn),有利于開發(fā)報(bào)建工作的展開和順利完成;③開發(fā)報(bào)建大流程,我們知道開發(fā)需辦五大證:國有土地使用證、建設(shè)用地規(guī)劃許可證、建設(shè)工程規(guī)劃許可證、建設(shè)工程施工許可證、商品預(yù)售許可證,開發(fā)主要分規(guī)劃類和市政類,報(bào)建的工作會(huì)結(jié)合工程進(jìn)度要求、銷售進(jìn)度要求;④辦事流程,這是一份“秘籍”,周總在20年從事開發(fā)工作經(jīng)驗(yàn)的基礎(chǔ)上整理出來的一份辦事指引,里面詳細(xì)介紹了給規(guī)劃、市政專業(yè)類報(bào)建工作介入的時(shí)間節(jié)點(diǎn),報(bào)建審批需提交的資料以及大體上的辦事流程;⑤綜合管網(wǎng)和市政臺(tái)帳,綜合管網(wǎng)是各類管線綜合圖,包括給水管線、排水管線、燃?xì)夤芫€、雨水管線等,搞市政開發(fā)要學(xué)會(huì)看綜合管網(wǎng)圖,市政臺(tái)帳是便攜式工作計(jì)劃表,能夠清晰的顯示近期的工作安排以及 相關(guān)工作的完成情況;⑥個(gè)人工作節(jié)點(diǎn),在熟悉開發(fā)部的工作內(nèi)容之后,結(jié)合個(gè)人辦事能力和習(xí)慣,學(xué)會(huì)制作自己的工作臺(tái)帳,結(jié)合工程進(jìn)度要求,倒排工作計(jì)劃。
根據(jù)周總給出的工作安排指引,同時(shí)也結(jié)合專業(yè)類輪崗任務(wù)書,我制定出了輪崗學(xué)習(xí)階段性的工作計(jì)劃,概括了自己在開發(fā)部輪崗一個(gè)月需要完成的“工作任務(wù)”,第一個(gè)月的輪崗學(xué)習(xí)就圍繞這個(gè)工作計(jì)劃展開。制訂月度總控計(jì)劃后,新的問題又出來了,要如何落實(shí)到每一周每一天呢?這個(gè)時(shí)候,公司的一個(gè)制度——周報(bào)便派上用場了,周報(bào)即總結(jié)了上一周工作任務(wù)的完成情況,又對(duì)下一周工作任務(wù)做出更為細(xì)致的安排。所以在月工作計(jì)劃的大框架下又制定了周報(bào),將這一個(gè)月的學(xué)習(xí)任務(wù)合理地、可行地安排到每一周去,通過合理地制定計(jì)劃,自己就可以更好的把握第一個(gè)月的學(xué)習(xí)任務(wù)進(jìn)度和完成情況。工作計(jì)劃制訂了之后,要做的就是按照計(jì)劃去執(zhí)行。第一個(gè)星期,我給自己定的目標(biāo)是用一周的時(shí)間,采用前面說到的“六步走”策略,從整體上去了解熟悉開發(fā)部的相關(guān)工作,由開始的項(xiàng)目概況到專業(yè)報(bào)建工作都要去學(xué)習(xí)的。一個(gè)星期下來,總的感覺就是累而充實(shí),這里所說的累不是指上班很辛苦、身體很勞累,而是指大腦的疲勞。在學(xué)習(xí)的過程中,可以發(fā)現(xiàn)開發(fā)部的工作事項(xiàng)是很多的,一個(gè)項(xiàng)目從頭到尾,我們需要辦證、報(bào)建、驗(yàn)收等等,而且有些工作還是很繁瑣的,非??简?yàn)?zāi)托浴G拜厒兛偨Y(jié)以往工作經(jīng)驗(yàn)整理出來的資料有厚厚的幾百頁紙,作為“插班生”的我首要任務(wù)就是仔細(xì)閱讀這些文案資料,只有了解了這個(gè)班集體,認(rèn)真學(xué)習(xí)班集體的各項(xiàng)工作內(nèi)容,知道我們的工作有幾個(gè)業(yè)務(wù)模塊、每個(gè)業(yè)務(wù)模塊的具體工作內(nèi)容是什么之后,才能更好地融入到這個(gè)集體中去。
通過第一個(gè)星期的學(xué)習(xí),對(duì)開發(fā)部的工作有大概的了解。為此,在查看資料之余,有時(shí)也作為學(xué)習(xí)人員跟著部門前輩外出辦事,在實(shí)踐的過程中體驗(yàn)開發(fā)報(bào)建。通過這種實(shí)踐性的學(xué)習(xí),可以給自己反饋出很多問題,帶給自己一些思考。最直接的就是一堆資料看完之后自己消化了多少,體現(xiàn)出對(duì)業(yè)務(wù)的真正了解程度。另外,在外出辦事的過程中,前輩會(huì)跟我交流很多,傳授他們自己的工作經(jīng)驗(yàn)和感悟。我不是一個(gè)擅長交談的人,但在有限的交流中也學(xué)到了很多,在公司上班與在學(xué)校讀書是有很大區(qū)別的,工作也會(huì)有不順心的事,但不能像在學(xué)校那樣不順心了就可以什么不做、不順心了就不理會(huì)其他人,我們?cè)谒枷肷喜荒茉儆幸郧皩W(xué)生時(shí)代那種“壞”想法了,要有一個(gè)好的心態(tài)。作為一個(gè)新人,更多得應(yīng)該展現(xiàn)出自己獨(dú)特的優(yōu)點(diǎn),不要過早的“淪陷”在社會(huì)的大熔爐中,給公司注入真正意義上的新鮮血液。前輩的經(jīng)驗(yàn)感悟,值得新人學(xué)習(xí)的道理還有很多,這里不一一贅述了,說多了反而成為空談。
舉個(gè)例子說,之前現(xiàn)場參與了市政DN400管接駁工程施工驗(yàn)收,是由我通知工程部的范工,簡單的小事也能體現(xiàn)辦事技巧和學(xué)問,通知的語言表達(dá)的條理性及合理性都是自己應(yīng)該考慮的問題。還有一次是跟著去住建局開會(huì),誠實(shí)地說整個(gè)會(huì)議下來沒聽懂多少,沒有抓住討論的核心問題,這就說明自己對(duì)業(yè)務(wù)仍不夠熟悉,對(duì)報(bào)建的工作進(jìn)度沒有一個(gè)整體上的把握。反思過后,清楚地知道自己還有很多東西要去學(xué)習(xí),事多事難不足懼,關(guān)鍵是要知道如何開始著手去做。但同時(shí)也必須告誡自己,不能盲目,做事不能操之過急,自己先主動(dòng)思考,找到問題再主動(dòng)快速出擊。我想這也就是杰哥告訴我的:心態(tài)要慢,動(dòng)作要快的吧。
細(xì)節(jié)決定成敗。8月12日,第一次參加部門例會(huì),此次會(huì)議主要是對(duì)前期工作中遇到并存在的問題予于解決,以及對(duì)后續(xù)工作進(jìn)行合理安排。這次的會(huì)議紀(jì)要是由我這個(gè)菜鳥來整理,后來周總夸我會(huì)議紀(jì)要做得好,可功勞不是我一個(gè)人的。在提交給周總之前我請(qǐng)教前輩們很多次,他們提出了很多很好的修改意見。直到我呈報(bào)給周總,還是存在不少問題,也提出了一些修改意見,這足以說明周總的要求是多么嚴(yán)格,語言表達(dá)的準(zhǔn)確性,文字、文本格式,標(biāo)點(diǎn)符號(hào)等等都必須追求標(biāo)準(zhǔn)化。這些就是細(xì)節(jié),就是簡單的一次會(huì)議紀(jì)要整理,細(xì)細(xì)的思考,可以發(fā)現(xiàn)有很多值得學(xué)習(xí)。很明顯的,你可以學(xué)到如何去做會(huì)議紀(jì)要,對(duì)文字性的東西要對(duì)自己提出怎樣的要求才是高標(biāo)準(zhǔn),更為重要的是,可以從中體會(huì)工作的態(tài)度——細(xì)致,曾經(jīng)的一位老師說過,將平凡的事做到極致就是偉大,對(duì)于這點(diǎn)自己還遠(yuǎn)遠(yuǎn)達(dá)不到要求。
一個(gè)月的時(shí)間太短,時(shí)間又總是過的太快,開發(fā)部的輪崗學(xué)習(xí)步入尾聲,回顧之前制作的輪崗學(xué)習(xí)工作計(jì)劃表,這一個(gè)月就是緊緊圍繞它展開學(xué)習(xí)開發(fā)報(bào)建的業(yè)務(wù)知識(shí),相對(duì)來說對(duì)部門工作有了比較全面的了解。從表中可以看出,除了針對(duì)部門的學(xué)習(xí)任務(wù)之外,也安排了其他的學(xué)習(xí)任務(wù),我認(rèn)為在很多方面自己都需要去學(xué)習(xí)、去了解的,剛步入職場,先把自己掏空,才能學(xué)到更多。同時(shí)在這里也對(duì)工作任務(wù)表做個(gè)簡單說明,工作事項(xiàng)中紅色標(biāo)記部分,是我認(rèn)為自己在本階段完成比較差的,而在完成時(shí)間一欄,我認(rèn)為黃色標(biāo)記部分是分階段持續(xù)學(xué)習(xí)的,在下階段的輪崗中仍須繼續(xù)完成。
總結(jié)這個(gè)月的學(xué)習(xí),給自己打分是75分,首先必須肯定自己是有表現(xiàn)好地方,但自己還是不夠積極主動(dòng),沒有發(fā)揮個(gè)人最大的主觀能動(dòng)性,我覺得用周總的話來說就是如何克服客家人理念上的保守,有時(shí)候顧慮過多。我沒有參與到部門后兩次例會(huì)就很能說明問題,有一次是因?yàn)槲也恢?,暫且不去討論,?月25日開部門例會(huì)自己是知道的,明明聽到了周總說待會(huì)開例會(huì),僅僅是沒有點(diǎn)名讓我去參與,難道就因?yàn)檫@樣不參與了么?自己的遲疑,自己的猶豫不決,顧慮自己是否合適主動(dòng)參與,就這樣與兩次例會(huì)擦肩而過,與學(xué)習(xí)的機(jī)會(huì)擦肩而過,也就是因?yàn)樽约旱膬?yōu)柔寡斷將自己孤立、讓自己成為邊緣人。那一天自己一直在反思,思考如何更好地融入團(tuán)隊(duì)中去,成為其中的一員,思考如何將在集團(tuán)培訓(xùn)時(shí)所認(rèn)知的團(tuán)隊(duì)意識(shí)運(yùn)用到自己的工作中去。
最后,真的很感謝開發(fā)部的每一位,在這一個(gè)月的輪崗學(xué)習(xí)期間主動(dòng)、耐心地指導(dǎo)我學(xué)習(xí)開發(fā)報(bào)建的業(yè)務(wù)知識(shí),以及對(duì)我這個(gè)“插班生”諸多錯(cuò)誤的包容。我覺得自己就是這美麗世界的幸運(yùn)兒,剛從學(xué)校走出來,就可以在這樣的一個(gè)部門跟著前輩們學(xué)習(xí),更幸運(yùn)的是遇到周總這樣的領(lǐng)導(dǎo),跟周總的每一次交流都能學(xué)到很多,無論是在業(yè)務(wù)知識(shí),還是工作態(tài)度上,以及做人做事的人生道理,概括來說這個(gè)月能從周總那帶走幾句話就能收益良多了:
1、敬業(yè),踏實(shí)的工作,做事有頭有尾。
2、公德心,學(xué)會(huì)感恩。
3、細(xì)節(jié)注定成敗,做事細(xì)致,目的要明確。
4、做事應(yīng)追求“守正出奇,惠人達(dá)己”。
5、在工作中克服客家人理念上的保守。
擺脫平庸的標(biāo)準(zhǔn),才能成為真正的精英。
第四篇:NET 開發(fā)總結(jié)
.NET 開發(fā)總結(jié)
Web窗體的簡單說明:
這次作業(yè)都有一個(gè)共同點(diǎn)就是連接數(shù)據(jù)庫,對(duì)數(shù)據(jù)連接函數(shù)不是很熟悉,弄了好久,最后還是請(qǐng)教同學(xué)才實(shí)現(xiàn)數(shù)據(jù)庫的連接,連接代碼如下圖:
數(shù)據(jù)庫連接完成后,開始進(jìn)行數(shù)據(jù)的整體的查詢,將查詢到的數(shù)據(jù)轉(zhuǎn)換成參數(shù),利用參數(shù)進(jìn)行分頁,將數(shù)據(jù)顯示在web上去。
對(duì)于分頁,我是按照每頁顯示是個(gè)數(shù)據(jù)來顯示的,本來還打算弄一個(gè)下拉窗口,當(dāng)窗口下拉式可以選擇多少個(gè)數(shù)據(jù)分頁顯示,這一部分的功能還沒來得及去實(shí)現(xiàn)。
分頁的部分代碼
對(duì)于web 的查詢功能,用的是模糊查詢,代碼如圖
本次的.net開發(fā)技術(shù)作業(yè),我選擇做webForm的分頁,之前一直沒有寫過web的代碼,只自學(xué)過一點(diǎn)腳本語言,對(duì)C#也不太了解,所以當(dāng)做起來的時(shí)候比較困難,自己上網(wǎng)找了不少資料,到圖書館借了一些關(guān)于asp.net web開發(fā)的書,對(duì)C#開發(fā)的平臺(tái)還不是很熟悉,當(dāng)程序調(diào)試起來非常困難,經(jīng)常因?yàn)樾栴}而浪費(fèi)許多的時(shí)間,開發(fā)過程中請(qǐng)教過一些有過web開發(fā)經(jīng)驗(yàn)的同學(xué),也有幫助我進(jìn)行程序的調(diào)試。由于不熟悉浪費(fèi)了許多時(shí)間,沒有對(duì)代碼沒有時(shí)間去整理,使得代碼看起來很凌亂,很累贅,看起來顯得麻煩,還是一些功能還沒有實(shí)現(xiàn),像查詢后的數(shù)據(jù)進(jìn)行分頁,以及數(shù)據(jù)的修改和刪除。
第五篇:ONVIF開發(fā)總結(jié)
ONVIF開發(fā)經(jīng)驗(yàn)總結(jié)
ONVIF開發(fā)經(jīng)驗(yàn)總結(jié).......................................................................................................................1
一、利用gsoap2.8.14生成Onvif相關(guān)源代碼...........................................................................2
1.生成onvif.h頭文件的方法.............................................................................................2
1)wsdl2h相關(guān)命令參數(shù)..............................................................................................2 2)鏈接網(wǎng)絡(luò)生成...........................................................................................................2 3)下載到本地生成.......................................................................................................2 4)備注說明...................................................................................................................2 2.生成onvif源代碼............................................................................................................3
1)整理相關(guān)的文件.......................................................................................................3 2)通過以下命令生成相關(guān)源文件...............................................................................3 3)Soapcpp2相關(guān)命令參數(shù)..........................................................................................3 4)備注說明...................................................................................................................3 3.利用gsoap2.8.8生成源代碼和gsoap2.8.14生成的差異.............................................3
1)typemap.dat文件中需要添加相關(guān)信息................................................................3 2)wsa5.h中無 SOAP_ENV__Fault函數(shù).....................................................................4
二、新建工程,調(diào)試代碼.................................................................................................................4
三、設(shè)備發(fā)現(xiàn)main函數(shù)說明........................................................................................................5
四、遇到的問題和注意事項(xiàng)...........................................................................................................7
五、經(jīng)驗(yàn)總結(jié)................................................................................................................................15
一、利用gsoap2.8.14生成Onvif相關(guān)源代碼
1.生成onvif.h頭文件的方法
產(chǎn)生頭文件有兩種方法:鏈接網(wǎng)絡(luò)生成和本地生成。1)wsdl2h相關(guān)命令參數(shù)
-c
產(chǎn)生c語言的代碼,否則產(chǎn)生C++
-s
不使用STL代碼
-t
指定typemap.dat文件
-o
指定生成的頭文件名
2)鏈接網(wǎng)絡(luò)生成
? 將wsdl2.exe和typemap.dat文件放入同一個(gè)文件夾 ? 利用cmd或批處理執(zhí)行以下dos命令: wsdl2h.exe-c-s-t typemap.dat-o onvif.h
http://004km.cn/onvif/ver10/network/wsdl/remotediscovery.wsdl http://004km.cn/onvif/ver10/device/wsdl/devicemgmt.wsdl http://004km.cn/onvif/ver20/analytics/wsdl/analytics.wsdl http://004km.cn/onvif/ver10/analyticsdevice.wsdl http://004km.cn/onvif/ver10/media/wsdl/media.wsdl http://004km.cn/onvif/ver10/deviceio.wsdl http://004km.cn/onvif/ver10/display.wsdl http://004km.cn/onvif/ver10/event/wsdl/event.wsdl http://004km.cn/onvif/ver20/imaging/wsdl/imaging.wsdl http://004km.cn/onvif/ver10/recording.wsdl http://004km.cn/onvif/ver10/replay.wsdl http://004km.cn/onvif/ver10/search.wsdl http://004km.cn/onvif/ver10/receiver.wsdl http://004km.cn/onvif/ver20/ptz/wsdl/ptz.wsdl 3)下載到本地生成
? 從ONVIF官網(wǎng)上把相關(guān)的WSDL文檔下載到本地,下載地址(詳細(xì)參見備注說明),此外還需下載樣式表,下載地址見WSDL文檔中的schemaLocation。
? 將wsdl2.exe、typemap.dath、WSDL文檔和樣式表放入同一文件夾中。
? 將相關(guān)WSDL文檔中的樣式表引入路徑(schemaLocation)修改為本地實(shí)際地址,如:event.wsdl中schemaLocation=“http://004km.cn/2005/08/addressing/ws-addr.xsd修改為schemaLocation = ws-addr.xsd ? 利用cmd或批處理執(zhí)行以下命令
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://004km.cn/Documents/Specifications.aspx ? 各url之間用空格隔開 ? typemap.dat不需要修改
? 鏈接網(wǎng)絡(luò)生成方法的優(yōu)點(diǎn)是不用考慮以上文件對(duì)其它文件的依賴關(guān)系,不用修改引 入路徑。該方法的缺點(diǎn)跟網(wǎng)速有關(guān),因此中途可能會(huì)中斷,如果超過5分鐘未生成,可重新執(zhí)行命令, 通過代理上網(wǎng)則無法生成,不推薦用此方法。
? 下載本地生成方法的優(yōu)缺點(diǎn)和鏈接網(wǎng)絡(luò)方法生成相反,代理網(wǎng)推薦使用此方法。2.生成onvif源代碼 1)整理相關(guān)的文件
把剛生成的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)通過以下命令生成相關(guān)源文件
soapcpp2.exe-2 –c onvif.h-I import 3)Soapcpp2相關(guān)命令參數(shù)-2 采用SOAP1.2,-x 不產(chǎn)生xml文件(不推薦使用此命令,因?yàn)閤ml文檔很有用)-I 為引入路徑
-C 只產(chǎn)生客戶端代碼(注意:C是大寫)4)備注說明
? 需要在onvif.h中加入#import ”wsse.h,用來做安全驗(yàn)證
? 需要將import目錄下的wsa5.h以下部分注釋掉,否則編譯時(shí)會(huì)報(bào)soap_xxxx_SOAP_ENV__Fault()函數(shù)重復(fù)定義。
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基本一致,但需注意以下區(qū)別: 1)typemap.dat文件中需要添加相關(guān)信息
tds = “http://004km.cn/ver10/device/wsdl” tev = “http://004km.cn/ver10/events/wsdl” tls = “http://004km.cn/ver10/display/wsdl” tmd = “http://004km.cn/ver10/deviceIO/wsdl” timg = “http://004km.cn/ver20/imaging/wsdl” trt = “http://004km.cn/ver10/media/wsdl” tptz = “http://004km.cn/ver20/ptz/wsdl” trv = “http://004km.cn/ver10/receiver/wsdl” trc = “http://004km.cn/ver10/recording/wsdl” tse = “http://004km.cn/ver10/search/wsdl” trp = “http://004km.cn/ver10/replay/wsdl” tan = “http://004km.cn/ver20/analytics/wsdl” tad = “http://004km.cn/ver10/analyticsdevice/wsdl” tdn = “http://004km.cn/ver10/network/wsdl” tt = “http://004km.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函數(shù)
由于wsa5.h中沒有SOAP_ENV__Fault因此不會(huì)產(chǎn)生代碼重復(fù),因此不用注釋。
二、新建工程,調(diào)試代碼
1.新建一個(gè)項(xiàng)目
將上面生成的soapH.h、soapStub.h、wsdd.nsmap、soapC.c、soapClient.c,還有位于gsoap-2.8gsoap 的:stdsoap2.c、stdsoap2.h和位于custom中的:duration.c放 入工程中,然后編寫main函數(shù),調(diào)試代碼。2.文件主要功能說明
wsdd.nsmap 名空間定義,服務(wù)器端與客戶端都要包含它,里面有很多,都是
相同的,只需導(dǎo)入一個(gè)進(jìn)入工程就行
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
三、設(shè)備發(fā)現(xiàn)main函數(shù)說明
#include
struct soap *soap;//soap環(huán)境變量 struct wsdd__ProbeType req;//客戶端發(fā)送的Probe struct __wsdd__ProbeMatches resp;//服務(wù)端回的Probematchs struct wsdd__ScopesType sScope;//Probe里面的范圍 struct SOAP_ENV__Header header;//SOAP的頭 int result = 0;//返回值
int count = 0;//獲得的設(shè)信息備個(gè)數(shù)
/**獲取guid(windows下叫g(shù)uid,linux下叫uuid),格式為urn:uuid:8-4-4-4-12,由系統(tǒng)隨機(jī)產(chǎn)生**/ static char buf[64] = {0};//用來保存guid號(hào)
GUID guid;/*聲明guid為GUID結(jié)構(gòu)體變量,包含4個(gè)變量,分別是 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生成成功,則將其轉(zhuǎn)為字符串,保存在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){ }
//設(shè)置接收Probematchs時(shí)間,超過5秒鐘沒有數(shù)據(jù)就退出 return-1;soap_set_namespaces(soap, namespaces);//設(shè)置命名空間
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;/*設(shè)置所需尋找設(shè)備的類型和范圍,二者至少設(shè)定一個(gè),否則可能收到非ONVIF設(shè)備,出現(xiàn)異常*/ soap_default_wsdd__ScopesType(soap, &sScope);sScope.__item = “onvif://004km.cn”;//設(shè)置所需設(shè)備的sScope soap_default_wsdd__ProbeType(soap, &req);req.Scopes = &sScope;req.Types = “tdn:NetworkVideoTransmitter”;/*設(shè)置所需設(shè)備的類型,tdn
為命名空間前綴,為
wsdd.nsmap
文件中soap_default_SOAP_ENV__Header(soap, &header);//將header設(shè)置為soap消息的頭屬性
{“tdn”,“http://004km.cn/ver10/network/wsdl”}的tdn,如過不是tdn,而是其它,如ns1這里也要隨之改為ns1*/
//通過組播發(fā)送Probe探針,發(fā)送成功返回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<<“共發(fā)現(xiàn)”< //接收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 四、調(diào)試過程遇到的問題和注意事項(xiàng) 1.出現(xiàn)如下語法錯(cuò)誤: error C2143: 語法錯(cuò)誤 : 缺少“{”(在“:”的前面)error C2059: 語法錯(cuò)誤 : “:” error C2143: 語法錯(cuò)誤 : 缺少“{”(在“:”的前面)需要將工程中的.c文件改成.cpp文件即可。 2.無法解析的外部命令錯(cuò)誤soap_check_faultsubcode 在stdsoap2.h中聲明的soap_check_faultsubcode(struct soap *soap)函數(shù)在soapC.cpp中未實(shí)現(xiàn), 可在soapC.cpp中添加如下實(shí)現(xiàn): 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.無法解析的外部命令錯(cuò)誤soap_check_faultdetail 在stdsoap2.h中聲明的soap_check_faultdetail(struct soap *soap)函數(shù)在soapC.cpp中未實(shí)現(xiàn), 可在soapC.cpp中添加如下實(shí)現(xiàn): 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.出現(xiàn)無法解析的外部符號(hào)_soap_in_xsd__duration 無法解析的外部符號(hào)_soap_in_xsd__duration,該符號(hào)在函數(shù)_soap_getelement 中被引用soapC.obj : error LNK2019: 無法解析的外部符號(hào)_soap_out_xsd__duration,該符號(hào)在函數(shù)_soap_putelement 中被引用 soapC.obj : error LNK2019: 無法解析的外部符號(hào)_soap_default_xsd__duration,該符號(hào)在函數(shù)_soap_default__tse__FindMetadata 中被引用 需要將custom文件夾下面的duration.h和duration.c導(dǎo)入工程中。 5.在VS中出現(xiàn)fatal error C1128: 節(jié)數(shù)超過對(duì)象文件格式限制: 請(qǐng)使用/bigobj 進(jìn)行編譯的錯(cuò)誤 這是由于源代碼文件太大的原因,需添加選項(xiàng)/bigobj,在項(xiàng)目屬性-> C/C++->命令行的附加選項(xiàng)中添加/bigobj。 6.如果是調(diào)用soap_call_XXXX_Probe()來實(shí)現(xiàn)設(shè)備發(fā)現(xiàn)時(shí)不能發(fā)現(xiàn)所有onvif設(shè)備 該函數(shù)實(shí)現(xiàn)過程中只有一次接收過程,所以無法發(fā)現(xiàn)所有的設(shè)備的問題。如果使用該函數(shù),還需要對(duì)函數(shù)的實(shí)現(xiàn)做以下更改: 函數(shù)的接收部分,將原來的XXXX:Response該為YYYY:ProbeMatches, 其中XXXX是.nsmap文件中http://004km.cn/ver10/network/wsdl“所對(duì)應(yīng)的命名空間前綴,YYYY與后面YYYY:ProbeMatchesType中的前綴相同,都是http://schemas.xmlsoap.org/ws/2005/04/discovery所對(duì)應(yīng)的命名空間前綴名。 7.抓包實(shí)驗(yàn)問題 利用gsoap生成的wsdd.namsp如下: #include ”soapH.h“ SOAP_NMAC struct Namespace namespaces[] = { {”SOAP-ENV“, ”http://schemas.xmlsoap.org/soap/envelope/“, ”http://004km.cn/*/soap-envelope“, NULL}, {”SOAP-ENC“, ”http://schemas.xmlsoap.org/soap/encoding/“, ”http://004km.cn/*/soap-encoding“, NULL}, {”xsi“, ”http://004km.cn/2001/XMLSchema-instance“, ”http://004km.cn/*/XMLSchema-instance“, NULL}, {”xsd“, ”http://004km.cn/2001/XMLSchema“, ”http://004km.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://004km.cn/2005/08/addressing“, ”http://schemas.xmlsoap.org/ws/2004/08/addressing“, NULL}, {”xmime“, ”http://tempuri.org/xmime.xsd“, NULL, NULL}, {”xop“, ”http://004km.cn/2004/08/xop/include“, NULL, NULL}, {”tt“, ”http://004km.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://004km.cn/ver10/analyticsdevice/wsdl“, NULL, NULL}, {”tan“, ”http://004km.cn/ver20/analytics/wsdl“, NULL, NULL}, {”tdn“, ”http://004km.cn/ver10/network/wsdl“, NULL, NULL}, {”tds“, ”http://004km.cn/ver10/device/wsdl“, NULL, NULL}, {”tev“, ”http://004km.cn/ver10/events/wsdl“, NULL, NULL}, {”wsnt“, ”http://docs.oasis-open.org/wsn/b-2“, NULL, NULL}, {”timg“, ”http://004km.cn/ver20/imaging/wsdl“, NULL, NULL}, {”tls“, ”http://004km.cn/ver10/display/wsdl“, NULL, NULL}, {”tmd“, ”http://004km.cn/ver10/deviceIO/wsdl“, NULL, NULL}, {”tptz“, ”http://004km.cn/ver20/ptz/wsdl“, NULL, NULL}, {”trc“, ”http://004km.cn/ver10/recording/wsdl“, NULL, NULL}, {”trp“, ”http://004km.cn/ver10/replay/wsdl“, NULL, NULL}, {”trt“, ”http://004km.cn/ver10/media/wsdl“, NULL, NULL}, {”trv“, ”http://004km.cn/ver10/receiver/wsdl“, NULL, NULL}, {”tse“, ”http://004km.cn/ver10/search/wsdl“, NULL, NULL}, {NULL, NULL, NULL, NULL} }; 1)通過編寫面函數(shù)之后,調(diào)試運(yùn)行結(jié)果如下: 其中http://192.168.106.112:80/onvif/device_service為本地模擬的設(shè)備 通過抓包工具獲得信息如下: 2).保留以下命名空間,刪除其它信息: #include ”soapH.h“ SOAP_NMAC struct Namespace namespaces[] = { {”SOAP-ENV“, ”http://schemas.xmlsoap.org/soap/envelope/“, ”http://004km.cn/*/soap-envelope“, NULL}, {”SOAP-ENC“, ”http://schemas.xmlsoap.org/soap/encoding/“, ”http://004km.cn/*/soap-encoding“, NULL}, {”xsi“, ”http://004km.cn/2001/XMLSchema-instance“, ”http://004km.cn/*/XMLSchema-instance“, NULL}, {”xsd“, ”http://004km.cn/2001/XMLSchema“, ”http://004km.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://004km.cn/2005/08/addressing“, ”http://schemas.xmlsoap.org/ws/2004/08/addressing“, NULL}, {”xmime“, ”http://tempuri.org/xmime.xsd“, NULL, NULL}, {”xop“, ”http://004km.cn/2004/08/xop/include“, NULL, NULL}, {”tt“, ”http://004km.cn/ver10/schema", NULL, NULL}, {NULL, NULL, NULL, NULL} };調(diào)試運(yùn)行結(jié)果如下: 抓包工具抓到信息如下: 3)測試工具信息如下 抓包信息如下: 4)多次實(shí)驗(yàn)顯示: wsdd.namsp文件太大時(shí),將會(huì)被拆包,192.168.106.164將始終不會(huì)回消息,減小命名空間大小,保證只發(fā)送一個(gè)UDP包,192.168.106.164將始終能回消息 5)通過抓包發(fā)現(xiàn),做設(shè)備管理功能時(shí)客戶端已能構(gòu)與設(shè)備端通信,只是涉及到安全,設(shè)備端沒有返回信息 6)在程序運(yùn)行時(shí),可能會(huì)出現(xiàn)一下信息 這是由于Type和Scopes都沒有賦值,接收了非ONVIF的設(shè)備 它的body中沒有我們需要的值,所以在輸出時(shí)會(huì)引起中斷 五、經(jīng)驗(yàn)總結(jié) 1.對(duì)于利用gsoap工具實(shí)現(xiàn)基于ONVIF標(biāo)準(zhǔn)的功能,盡量按照如下順序: ? 了解所需實(shí)現(xiàn)的功能原理,參考< ? 根據(jù)所需實(shí)現(xiàn)的功能查看對(duì)應(yīng)的xml文檔(生成源代碼時(shí)產(chǎn)生的,)因?yàn)樯傻膞ml文檔是客戶端和服務(wù)端通信時(shí)所發(fā)送的模板結(jié)構(gòu),通過它可以了解編碼時(shí)所需要填充的信息 ? 了解工程中.h和.cpp的功能 ? 查看別人寫的例子,理解原理,要學(xué)會(huì)從原理上去分析碰到的問題并解決問題 ? 自己寫代碼驗(yàn)證,事實(shí)求是,替自己負(fù)責(zé),替用戶負(fù)責(zé)。 2.善于利用抓包工具 從原理上分析問題,能大大提高效率,如果利用測試工具跟客戶端通信,然后進(jìn)行抓包,能構(gòu)很好的分析出客戶端需發(fā)送的消息,服務(wù)端回的消息,非常利于編碼。