999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

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

2015-01-10 00:25:20蔣洪磊
無線電通信技術(shù) 2015年4期
關(guān)鍵詞:數(shù)據(jù)庫語言設(shè)備

蔣洪磊

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

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

蔣洪磊

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

針對C/C++在網(wǎng)管開發(fā)中效率低下、維護和調(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)來對二進制流格式進行描述,程序可以自動地在二進制流和JSON結(jié)構(gòu)間進行雙向轉(zhuǎn)換。基于Flask的微Web框架,簡單易用擴展,有著豐富的插件,支持服務器推送事件。SQLAlchemy作為Python中對象關(guān)系建模的事實標準,使得開發(fā)人員從各種數(shù)據(jù)庫的差異中解脫出來。項目實踐表明基于Python的實現(xiàn)代碼簡潔,可讀性更強,具有快速開發(fā)優(yōu)勢。

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

0 引言

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

1 動態(tài)語言Python

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

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

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

2 軟件體系

在衛(wèi)星通訊系統(tǒng)的綜合網(wǎng)管中(如圖1所示),需要完成該衛(wèi)星通訊系統(tǒng)的綜合業(yè)務管理、網(wǎng)絡(luò)運行狀態(tài)監(jiān)視,設(shè)備監(jiān)控等各種功能。用戶的操作內(nèi)容在進行相應的業(yè)務邏輯處理后,以JSON格式,由DevMonitor根據(jù)對應的設(shè)備協(xié)議進行轉(zhuǎn)換,由相應的SatSide或者EarthSide模塊發(fā)送。Web客戶端以AJAX向Web Framework發(fā)送請求并注冊Server Send Event(服務器推送事件,簡稱SSE),當設(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è)備進行監(jiān)控[11]。利用Python的pySerial、pyParallel、pyUSB、PyVISA等庫可以與設(shè)備的串口、并口、USB等接口進行通信。在數(shù)據(jù)包的封裝格式上,底層設(shè)備通常采用自定義的二進制流封裝格式[12,13],而Web開發(fā)中則通常使用JSON包作為Web客戶端與服務器交互的協(xié)議格式。在協(xié)議解析部分,利用Python的語言特性,用協(xié)議格式描述來替代手工為每種格式的包進行編碼解析。如下所示,pack_des_ list的協(xié)議格式描述了表1和表2所示的包格式:

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

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

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

對于每一個pack_des_list的項,第一個字段表示該項(或者稱為字段)的長度或者數(shù)目,第二個字段表示該項的名稱,如果為None表示該字段保留,解包程序?qū)⒅苯犹^。第三個字段的類型可以是dict,tuple或者list,這3種類型都是Python的基本數(shù)據(jù)類型。我們用dict(字典)來描述給定項的處理方式,如”type”:str表示該字段的類型為字符串,缺省類型為整形數(shù);”tmp”:True表示該項是臨時項,在后繼處理完畢后不會反應到最終結(jié)果中,缺省為非臨時項。如果第三字段的類型為list(列表),則表示后面按可變長的數(shù)組解析,其長度為該項的值。如果第三字段的類型為tuple(元組),則后面為固定長數(shù)組,其長度為該項第一字段的值。list或者tuple可以進行任意層次嵌套,如“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服務器

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

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

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

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

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

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

2.4 服務器推送事件

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

3 結(jié)束語

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

[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做科學計算[M].北京:清華大學出版社,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]孔慶玲,胡志軍,劉英,等.程序復雜性度量技術(shù)分析[J].無線電工程,2011,41(2):61-64,2011.

[11]劉學輝,王國良.軟件進程監(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攝像頭遠程監(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)管運控。

猜你喜歡
數(shù)據(jù)庫語言設(shè)備
諧響應分析在設(shè)備減振中的應用
語言是刀
文苑(2020年4期)2020-05-30 12:35:30
基于MPU6050簡單控制設(shè)備
電子制作(2018年11期)2018-08-04 03:26:08
讓語言描寫搖曳多姿
數(shù)據(jù)庫
財經(jīng)(2017年2期)2017-03-10 14:35:35
累積動態(tài)分析下的同聲傳譯語言壓縮
數(shù)據(jù)庫
財經(jīng)(2016年15期)2016-06-03 07:38:02
500kV輸變電設(shè)備運行維護探討
數(shù)據(jù)庫
財經(jīng)(2016年3期)2016-03-07 07:44:46
數(shù)據(jù)庫
財經(jīng)(2016年6期)2016-02-24 07:41:51
主站蜘蛛池模板: 精品国产乱码久久久久久一区二区| 国产乱人伦精品一区二区| 97超级碰碰碰碰精品| 午夜激情婷婷| 2048国产精品原创综合在线| 中国国语毛片免费观看视频| 国产成人欧美| 国产内射一区亚洲| 欧美成人h精品网站| 男人的天堂久久精品激情| 人妻一本久道久久综合久久鬼色| 正在播放久久| 91国内在线视频| 国产制服丝袜91在线| 国产精品自在在线午夜| 国产精品污污在线观看网站| 91外围女在线观看| 国产在线一二三区| 日韩一区精品视频一区二区| 伊人久久久久久久| 日韩国产综合精选| 午夜国产不卡在线观看视频| 久久国产高潮流白浆免费观看| 国产成人乱无码视频| 国产91蝌蚪窝| 婷婷色一二三区波多野衣| 午夜无码一区二区三区在线app| 欧美成人影院亚洲综合图| 欧美第九页| 一级高清毛片免费a级高清毛片| AV网站中文| 视频在线观看一区二区| 国产精品一区在线麻豆| 国产丝袜丝视频在线观看| 免费看黄片一区二区三区| 91亚洲免费视频| 无码一区中文字幕| 亚洲国产日韩视频观看| 亚洲视频色图| 国产97色在线| 婷婷亚洲视频| 在线观看国产精品第一区免费| 日韩视频精品在线| 欧美成人h精品网站| 欧美日韩成人在线观看| 国产精品久久久久久影院| 狠狠色丁婷婷综合久久| 国产精品成人免费视频99| 9丨情侣偷在线精品国产| 亚洲色图在线观看| 国产精品免费福利久久播放| 国产91视频免费| 丁香婷婷久久| 一本一本大道香蕉久在线播放| 欧美精品xx| 91精品啪在线观看国产| 天堂亚洲网| 69精品在线观看| 欧美福利在线观看| 欧美综合在线观看| 午夜老司机永久免费看片| 亚洲欧美日韩高清综合678| 网友自拍视频精品区| 色婷婷久久| 久久国产精品无码hdav| 亚洲成人77777| 国产69精品久久久久孕妇大杂乱| 999国产精品| 天天躁夜夜躁狠狠躁躁88| 美女国内精品自产拍在线播放 | 免费A级毛片无码无遮挡| 在线另类稀缺国产呦| 国产精品私拍在线爆乳| 国产精品网拍在线| 九九视频在线免费观看| 国产免费人成视频网| 亚洲最新在线| 狠狠色丁婷婷综合久久| 2019年国产精品自拍不卡| 国产chinese男男gay视频网| 国产第一页免费浮力影院| 久久鸭综合久久国产|