• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于Python的網(wǎng)管軟件技術(shù)體系設(shè)計

      2015-01-10 00:25:20蔣洪磊
      無線電通信技術(shù) 2015年4期
      關(guān)鍵詞:開發(fā)人員網(wǎng)管代碼

      蔣洪磊

      (中國電子科技集團(tuán)公司第五十四研究所,河北石家莊050081)

      基于Python的網(wǎng)管軟件技術(shù)體系設(shè)計

      蔣洪磊

      (中國電子科技集團(tuán)公司第五十四研究所,河北石家莊050081)

      針對C/C++在網(wǎng)管開發(fā)中效率低下、維護(hù)和調(diào)試成本高的問題,提出采用動態(tài)語言Python所組成的輕量級開發(fā)架構(gòu)。在介紹Python的動態(tài)類型系統(tǒng)及其元編程能力的基礎(chǔ)上,給出在B/S架構(gòu)的網(wǎng)管軟件中設(shè)備監(jiān)控、Web開發(fā)、ORM等技術(shù)選擇:利用Python的數(shù)據(jù)結(jié)構(gòu)來對二進(jìn)制流格式進(jìn)行描述,程序可以自動地在二進(jìn)制流和JSON結(jié)構(gòu)間進(jìn)行雙向轉(zhuǎn)換?;贔lask的微Web框架,簡單易用擴展,有著豐富的插件,支持服務(wù)器推送事件。SQLAlchemy作為Python中對象關(guān)系建模的事實標(biāo)準(zhǔn),使得開發(fā)人員從各種數(shù)據(jù)庫的差異中解脫出來。項目實踐表明基于Python的實現(xiàn)代碼簡潔,可讀性更強,具有快速開發(fā)優(yōu)勢。

      Python;動態(tài)類型;元編程;設(shè)備監(jiān)控;Web服務(wù)器架構(gòu);對象關(guān)系映射

      0 引言

      一二十年前的網(wǎng)管開發(fā),通常采用C/C++的技術(shù)體系;然而隨著硬件性能的提高,其所帶來的運行性能優(yōu)勢越來越不明顯,而其高昂的學(xué)習(xí)成本,低下的開發(fā)效率,開發(fā)人員的參差不齊,以及由此帶來的代碼健壯性、代碼維護(hù)成本等問題,以及對Web開發(fā)支持的缺乏等等,使其越來越難以適應(yīng)現(xiàn)代網(wǎng)管的開發(fā)工作。為此,提出基于Python的輕量級軟件開發(fā)架構(gòu)。

      1 動態(tài)語言Python

      Python[1,2]是一門面向?qū)ο蟮膭討B(tài)語言[3,4],它適用于文本處理、圖形處理、科學(xué)計算[5-7]、Web網(wǎng)站、設(shè)備監(jiān)控[8]的快速開發(fā)。在編譯時獲得類型的稱為靜態(tài)類型系統(tǒng),其優(yōu)勢是可以在執(zhí)行前發(fā)現(xiàn)類型不匹配錯誤,并能根據(jù)類型信息進(jìn)行編譯時優(yōu)化以提高執(zhí)行速度;而動態(tài)類型系統(tǒng)則是在運行時才能知道變量的類型,因而在編寫代碼時無需聲明變量的類型。代碼中缺少類型聲明,降低了程序的執(zhí)行效率,卻使得代碼變得更加簡潔,開發(fā)人員不再關(guān)注于數(shù)據(jù)類型聲明這些非本質(zhì)的部分,而專注于處理業(yè)務(wù)邏輯。

      動態(tài)語言還具有在程序執(zhí)行時獲取、改變程序信息的能力。在不同的語言中稱為反射(reflection)、自?。╥ntrospection)或者元編程(meta-programming)。Python可以在運行時獲取對象的類型信息(內(nèi)置函數(shù)type/isinstance/issubclass)、查詢對象當(dāng)前擁有的屬性和方法(內(nèi)置函數(shù)dir/hasattr/getattr)、增刪對象的屬性/方法(內(nèi)置方法del)、在運行時將字符串編譯為程序并成為程序的一部分(內(nèi)置函數(shù)eval)等等。這一能力,使得開發(fā)人員可以在運行時環(huán)境中進(jìn)行即時開發(fā)。在靜態(tài)語言開發(fā)中,雖然可以設(shè)置斷點,查看或者修改變量的數(shù)值,但是新編寫的代碼只能在保存文件、整個項目重新編譯再重新運行后才能得到驗證。而在動態(tài)語言中,則可以在斷點處的上下文中立即執(zhí)行來驗證代碼的正確性,如果正確則保存新編寫的代碼,如果代碼編寫錯誤則修改后再次立即執(zhí)行。例如在Python的集成開發(fā)環(huán)境WingIDE中,可以使用Debug Probe窗口進(jìn)行運行時開發(fā)。元編程不僅可以簡化設(shè)計模式的實現(xiàn),提高開發(fā)人員對程序的操控能力,還可以在不改變已有代碼的情況下而對功能進(jìn)行追加和變更,這在開發(fā)中稱為猴子補?。╩onkey patch)。開發(fā)人員可以利用這種靈活性來修訂正在運行中的程序錯誤[9]。

      由于動態(tài)語言所具有的豐富表現(xiàn)力,使得動態(tài)語言的代碼實現(xiàn)更加簡潔,維護(hù)和排錯成本更低[10]。根據(jù)各種實際項目的對比,動態(tài)語言的代碼量只有相同靜態(tài)類型代碼的1/3到1/5,而開發(fā)效率是靜態(tài)語言的3~5倍。例如應(yīng)用C++進(jìn)行國產(chǎn)達(dá)夢數(shù)據(jù)庫開發(fā)時,需要的代碼量是近兩萬行代碼,需時數(shù)月;而遷移到Python后,利用自主開發(fā)的SQLAlchemy方言,則只需不足千行代碼,用時不到1周。由于動態(tài)類型使得在執(zhí)行時才能發(fā)現(xiàn)錯誤、閱讀程序時可用到的線索較少,因此相比靜態(tài)語言開發(fā)人員,動態(tài)語言的開發(fā)者更依賴于運行時測試用例和良好的文檔編寫習(xí)慣。

      2 軟件體系

      在衛(wèi)星通訊系統(tǒng)的綜合網(wǎng)管中(如圖1所示),需要完成該衛(wèi)星通訊系統(tǒng)的綜合業(yè)務(wù)管理、網(wǎng)絡(luò)運行狀態(tài)監(jiān)視,設(shè)備監(jiān)控等各種功能。用戶的操作內(nèi)容在進(jìn)行相應(yīng)的業(yè)務(wù)邏輯處理后,以JSON格式,由DevMonitor根據(jù)對應(yīng)的設(shè)備協(xié)議進(jìn)行轉(zhuǎn)換,由相應(yīng)的SatSide或者EarthSide模塊發(fā)送。Web客戶端以AJAX向Web Framework發(fā)送請求并注冊Server Send Event(服務(wù)器推送事件,簡稱SSE),當(dāng)設(shè)備狀態(tài)發(fā)生變化時,則沿反向路徑,由DevMonitor轉(zhuǎn)換為JSON格式后經(jīng)Web框架推送給瀏覽器。

      圖1 衛(wèi)星網(wǎng)管系統(tǒng)的基本架構(gòu)

      2.1 設(shè)備監(jiān)控

      為了獲取網(wǎng)絡(luò)運行狀態(tài),必須對網(wǎng)絡(luò)中的設(shè)備進(jìn)行監(jiān)控[11]。利用Python的pySerial、pyParallel、pyUSB、PyVISA等庫可以與設(shè)備的串口、并口、USB等接口進(jìn)行通信。在數(shù)據(jù)包的封裝格式上,底層設(shè)備通常采用自定義的二進(jìn)制流封裝格式[12,13],而Web開發(fā)中則通常使用JSON包作為Web客戶端與服務(wù)器交互的協(xié)議格式。在協(xié)議解析部分,利用Python的語言特性,用協(xié)議格式描述來替代手工為每種格式的包進(jìn)行編碼解析。如下所示,pack_des_ list的協(xié)議格式描述了表1和表2所示的包格式:

      可以看出只需要不到10行代碼就可以將這種包格式描述完成。通過將該協(xié)議描述作為參數(shù)輸入通用的解包函數(shù)depack_buffer,就可以完成自定義二進(jìn)制流格式到JSON格式的轉(zhuǎn)換,或者使用封包函數(shù)pack_buffer完成逆向操作。在實現(xiàn)新的協(xié)議格式時,只要編寫協(xié)議的格式描述,就能將數(shù)據(jù)包自動解析為相應(yīng)的數(shù)據(jù)結(jié)構(gòu),而不需要額外編寫一行代碼。

      表1 站控信息幀結(jié)構(gòu)

      表2 設(shè)備控制響應(yīng)數(shù)據(jù)字段格式

      對于每一個pack_des_list的項,第一個字段表示該項(或者稱為字段)的長度或者數(shù)目,第二個字段表示該項的名稱,如果為None表示該字段保留,解包程序?qū)⒅苯犹^。第三個字段的類型可以是dict,tuple或者list,這3種類型都是Python的基本數(shù)據(jù)類型。我們用dict(字典)來描述給定項的處理方式,如”type”:str表示該字段的類型為字符串,缺省類型為整形數(shù);”tmp”:True表示該項是臨時項,在后繼處理完畢后不會反應(yīng)到最終結(jié)果中,缺省為非臨時項。如果第三字段的類型為list(列表),則表示后面按可變長的數(shù)組解析,其長度為該項的值。如果第三字段的類型為tuple(元組),則后面為固定長數(shù)組,其長度為該項第一字段的值。list或者tuple可以進(jìn)行任意層次嵌套,如“DevNum”項下面又嵌套著”ArgNum”,表示該數(shù)據(jù)包可以一次返回多個設(shè)備的,每個設(shè)備多個參數(shù)的設(shè)置狀態(tài)。

      可以看出,讓開發(fā)人員編寫協(xié)議描述比每次單獨為每種包格式編寫封包和解包代碼要高效的多,而且不容易出錯。此外,由于協(xié)議描述本身就是Python的數(shù)據(jù)結(jié)構(gòu),這使得用戶編寫的代碼可以直接利用IDE的語法檢查工具來判斷是否出錯。此外,該協(xié)議描述能夠容易描述現(xiàn)有的協(xié)議格式,從而快速實現(xiàn)已有協(xié)議的解析。

      2.2 Web服務(wù)器

      Python的Web Framework有很多種,選擇的是Flask,其優(yōu)勢是簡單且易于擴展,有豐富的插件來實現(xiàn)認(rèn)證、鑒權(quán)、會話管理、Cache、存儲、文件上傳、ORM等各種功能。URL路由使得用戶可以使用自由彈性的網(wǎng)址,F(xiàn)lask根據(jù)約定優(yōu)于配置的設(shè)計原則,約定所有靜態(tài)文件,均放在/static/目錄下;而所有模板文件,均放入/template/目錄下。

      直接使用URL路由等于將URL地址和實現(xiàn)代碼進(jìn)行了綁定,這在簡化開發(fā)的同時也造成了兩者的緊耦合。在進(jìn)行大型項目開發(fā)時,為實現(xiàn)模塊化并行開發(fā),可以使用Flask的Blueprint(藍(lán)圖)技術(shù),將一個應(yīng)用劃分為若干Blueprint集合,然后將一個Blueprint注冊到一個應(yīng)用的URL前綴或子域名之下。可以將一個blueprint以多個不同URL rules在同一個應(yīng)用中注冊多次。在Blueprint中提供模板filters、靜態(tài)文件、模板等utilities。Blueprint除了方便模塊化開發(fā),還完成了URL組織與功能實現(xiàn)的解耦合。

      2.3 對象關(guān)系映射

      ORM將數(shù)據(jù)庫的Table映射為類,Column映射為類的屬性,Table中的每條Record則映射為一個類的對象。ORM通過更高層次的抽象,屏蔽數(shù)據(jù)庫間的差異,并代替用戶處理連接、緩存、一致性管理等細(xì)節(jié),從而提高了開發(fā)效率。由于用戶不再直接使用SQL代碼,不易產(chǎn)生SQL注入攻擊,也提高了安全性。

      Python中的SQLAlchemy可以完成Object Relational Mapping(ORM)的功能,以實現(xiàn)通過面向?qū)ο笳Z法來操控數(shù)據(jù)庫,將商業(yè)邏輯與數(shù)據(jù)庫操作邏輯分開。如圖2所示,在SQLAlchemy中Dialect負(fù)責(zé)將通用的操作命令轉(zhuǎn)換為各種數(shù)據(jù)庫的方言,從而對上層用戶操作屏蔽數(shù)據(jù)庫間的差異;Connection Pooling(連接池)用于保持和維護(hù)和DB的連接,這樣不用每次操作都建立和斷開連接,從而提高IO性能。DBAPI則是用于連接數(shù)據(jù)庫的API接口。而連接Oracle數(shù)據(jù)庫需要安裝對應(yīng)版本的Oracle instantclient和cx_Oracle庫。通過使用SQLAlchemy,用戶的實現(xiàn)代碼不在依賴于具體的數(shù)據(jù)庫,只需要少量代碼就可以完成從一種數(shù)據(jù)庫到另一種數(shù)據(jù)庫的遷移。此外,基于SQLAlchemy的Alembic庫可以方便進(jìn)行數(shù)據(jù)庫的遷移及版本控制。

      圖2 SQLAlchemy的組織結(jié)構(gòu)

      2.4 服務(wù)器推送事件

      Server Send Events(SSE)是實現(xiàn)服務(wù)器主動推送消息的最簡單方式,可以結(jié)合RESTful技術(shù)實現(xiàn)協(xié)同編輯或者實時反應(yīng)設(shè)備的狀態(tài)。在用Python 的Flask來實現(xiàn)SSE非常簡單,只需要將之前通過設(shè)備監(jiān)控解析出得結(jié)構(gòu)體直接創(chuàng)建為JSON包放入相應(yīng)的事件隊列。客戶端注冊SSE所需的服務(wù)器端處理函數(shù)需要對每類事件(event_name)的每個訂閱者(uuid)創(chuàng)建一個Queue,只要Queue中有事件,則推送給該訂閱者。SSE的服務(wù)器端處理函數(shù)定義如下:

      3 結(jié)束語

      介紹Python語言的動態(tài)特性,給出了實現(xiàn)B/S架構(gòu)的網(wǎng)管體系中所需要的設(shè)備監(jiān)控、Web服務(wù)開發(fā)、ORM的技術(shù)方案。從本文可以看出,通過采用Python的輕量級開發(fā)架構(gòu),可以極大地提高開發(fā)人員的工作效率,用更少的代碼完成相同的功能,使用戶關(guān)注于業(yè)務(wù)的實現(xiàn)而非技術(shù)細(xì)節(jié),從而使軟件的功能更加契合用戶需求,并能夠進(jìn)行快速的響應(yīng)需求變更。

      [1]Mark Lutz.Learning Python(Fifth Edition)[M].Sebastopol US:O’Reilly Media,Inc.,2013.

      [2]Mark Summerfield.Programming in Python 3 Second Edition[M].Boston US:Pearson Education,2010.

      [3]松本行弘.松本行弘的程序世界[M].北京:人民郵電出版社,2011.

      [4]Paul King.動態(tài)語言的敏捷開發(fā)實踐[C]∥QCon2010.北京,2010.

      [5]Sandro Tosi.Matplotlib for Python Developers[M].Birmingham UK:Packt Publishing,2009.

      [6]HYRY Studio.用Python做科學(xué)計算[M].北京:清華大學(xué)出版社,2012.

      [7]Hans Petter Langtangen.A Primer on Scientific Programming with Python 2rd[M].US:Springer,2015.

      [8]Hughes JM.Real World Instrumentation with Python [M].Sebastopol US:O’Reilly Media,Inc,2011.

      [9]王浩波,郭金鵬.星載環(huán)境下可重構(gòu)技術(shù)分析[J].無線電工程,2012,42(1):40-42.

      [10]孔慶玲,胡志軍,劉英,等.程序復(fù)雜性度量技術(shù)分析[J].無線電工程,2011,41(2):61-64,2011.

      [11]劉學(xué)輝,王國良.軟件進(jìn)程監(jiān)控系統(tǒng)及其實現(xiàn)[J].無線電工程,2011,41(9):62-64.

      [12]許靜.高效信息收發(fā)軟件系統(tǒng)設(shè)計分析[J].無線電工程,2011,41(9):7-10,43.

      [12]王明,何加銘,曾興斌.IP攝像頭遠(yuǎn)程監(jiān)控系統(tǒng)的設(shè)計與實現(xiàn)[J].無線電通信技術(shù),2014,40(1):71-74.

      Design on Python-based Network M anagement Software Architecture

      JIANG Hong-lei
      (The 54th Research Institute of CETC,Shijiazhuang Hebei050081,China)

      In view of such problems as low efficiency in developmentand high cost inmaintenance for networkmanagement system with C/C++languages,this paper proposes a lightweight architecture based on dynamic language Python.On the basis of Python’s dynamic-type system and meta-programming capability,this paper presents such technical selections in networkmanagement software of browser/server(B/S)architecture as devicemonitoring,web development,ORM,etc.The Python’s data structure is used to describe binary stream protocol,and the bidirectional exchange of program can be automatically performed between binary packet and JSON.The micro web framework Flask is easy to use and extend,supports Server Send Event.SQLAlchemy,as a de facto standard for ORM in Python,makes developers handle database like objects.The project practice shows that Python-based implementation is simple,more readable and has higher development speed.

      Python;dynamic types;meta programming;devicemonitoring;web server framework;ORM

      TP393

      A

      1003-3114(2015)04-87-4

      10.3969/j.issn.1003-3114.2015.04.23

      蔣洪磊.基于Python的網(wǎng)管軟件技術(shù)體系設(shè)計[J].無線電通信技術(shù),2015,41(4):87-90.

      2015-04-09

      國家部委基金資助項目

      蔣洪磊(1982—),男,博士,工程師,主要研究方向:分布式存儲、衛(wèi)星通訊網(wǎng)網(wǎng)管運控。

      猜你喜歡
      開發(fā)人員網(wǎng)管代碼
      Semtech發(fā)布LoRa Basics 以加速物聯(lián)網(wǎng)應(yīng)用
      創(chuàng)世代碼
      動漫星空(2018年11期)2018-10-26 02:24:02
      創(chuàng)世代碼
      動漫星空(2018年2期)2018-10-26 02:11:00
      創(chuàng)世代碼
      動漫星空(2018年9期)2018-10-26 01:16:48
      創(chuàng)世代碼
      動漫星空(2018年5期)2018-10-26 01:15:02
      讓W(xué)indows 10進(jìn)入開發(fā)者模式
      電腦迷(2015年12期)2015-04-29 23:22:51
      后悔了?教你隱藏開發(fā)人員選項
      電腦愛好者(2015年6期)2015-04-03 01:20:56
      “五制配套”加強網(wǎng)管
      新聞前哨(2015年2期)2015-03-11 19:29:29
      一種供鳥有限飛翔的裝置
      發(fā)射機房網(wǎng)管系統(tǒng)的設(shè)計原則及功能
      河南科技(2014年14期)2014-02-27 14:11:59
      信阳市| 小金县| 汕头市| 江城| 清河县| 恭城| 黑河市| 剑川县| 北辰区| 灵璧县| 天峨县| 山丹县| 东乡| 温泉县| 扶余县| 朝阳县| 河津市| 涿州市| 滦平县| 前郭尔| 山丹县| 沂水县| 莱阳市| 宜黄县| 沂源县| 龙游县| 奉贤区| 邯郸市| 古蔺县| 东兴市| 台前县| 辉南县| 高陵县| 通许县| 泗洪县| 五家渠市| 辽阳市| 灌阳县| 方正县| 夹江县| 泗阳县|