蒲 哲,朱名日
(桂林電子科技大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院,廣西 桂林 541004)
甘蔗作為主要制糖原料,并且能夠提煉乙醇作為替代能源,在我國農(nóng)業(yè)經(jīng)濟(jì)作物中占有重要地位,其產(chǎn)量和產(chǎn)值僅次于糧食、油料和棉花,居第4位。但是近幾年隨著甘蔗耕種面積的擴(kuò)大,栽培技術(shù)的落后,使甘蔗畝產(chǎn)量有所降低。在澳大利亞,甘蔗生產(chǎn)已基本實(shí)現(xiàn)了種植,以及甘蔗的收割、運(yùn)輸?shù)攘鞒倘坑捎?jì)算機(jī)控制達(dá)到信息化管理,對甘蔗種植進(jìn)行科學(xué)的管理是十分有價(jià)值的。農(nóng)業(yè)物聯(lián)網(wǎng)將大量傳感器節(jié)點(diǎn)組建成監(jiān)控網(wǎng)絡(luò),通過采集的信息,幫助蔗農(nóng)及時(shí)發(fā)現(xiàn)問題,使整個(gè)生產(chǎn)過程以信息和軟件為主,從而達(dá)到科學(xué)管理的目的。
WPF是微軟下一代顯示系統(tǒng),用于生成能給用戶帶來更好的視覺體驗(yàn)的Windows客戶端應(yīng)用程序。WPF的核心是一個(gè)與分辨率無關(guān)并且基于向量的呈現(xiàn)引擎,旨在利用現(xiàn)代圖形硬件的優(yōu)勢。WPF中使用XAML(Extensible Application Markup Language)標(biāo)記實(shí)現(xiàn)程序外觀的設(shè)計(jì)[1]。作為WPF跟MVP(Model-View-Presenter)結(jié)合演變過來的新型框架MVVM,能很好地應(yīng)用WPF的綁定特性,做到界面開發(fā)和業(yè)務(wù)邏輯分離,使系統(tǒng)功能模塊化,提高代碼重用率[2]?;谝陨霞夹g(shù)開發(fā)了基于農(nóng)業(yè)物聯(lián)網(wǎng)的甘蔗種植管理系統(tǒng)的后臺(tái)管理軟件,其中WPF技術(shù)使軟件界面設(shè)計(jì)更加便捷、美觀。
MVVM框架的應(yīng)用使系統(tǒng)設(shè)計(jì)更加合理,提高了系統(tǒng)的可測試性,系統(tǒng)也具備良好的可擴(kuò)展性。
系統(tǒng)采用C/S結(jié)構(gòu),為了實(shí)現(xiàn)系統(tǒng)功能的模塊化,代碼的可重用性,采用MVVM框架完成開發(fā)。系統(tǒng)框架中視圖(View)層是系統(tǒng)頁面的顯示,在視圖模型(ViewModel)層中包含為視圖準(zhǔn)備的表示模型和控制邏輯,View與ViewModel之間通過綁定(Binding)連接,實(shí)現(xiàn)交互;模型(Model)層中包括業(yè)務(wù)模型和數(shù)據(jù)訪問,在業(yè)務(wù)模型中定義了數(shù)據(jù)實(shí)體模型和業(yè)務(wù)邏輯;數(shù)據(jù)訪問層(Data Access Layer)運(yùn)用NHibernate完成對象關(guān)系數(shù)據(jù)庫的映射,把對象持久化到關(guān)系數(shù)據(jù)庫中。數(shù)據(jù)庫則提供數(shù)據(jù)源,管理系統(tǒng)中生成的數(shù)據(jù)??傮w框架如圖1所示。
圖1 甘蔗種植管理系統(tǒng)總體框架圖
通過需求分析,本系統(tǒng)主要?jiǎng)澐譃楦收岱N植地圖模塊、采集數(shù)據(jù)查詢模塊、田地信息管理模塊、種植戶管理模塊、用戶管理模塊、病蟲害防治模塊、設(shè)備配置模塊。系統(tǒng)功能結(jié)構(gòu)如圖2所示。
各模塊具體功能如下。
(1)甘蔗種植地圖模塊。
此模塊功能是運(yùn)用Google Map API與WPF結(jié)合實(shí)現(xiàn)甘蔗種植地理信息查詢功能??赏ㄟ^GPS坐標(biāo)實(shí)時(shí)顯示種植區(qū)域和無線節(jié)點(diǎn)位置。該模塊還具有天氣查詢功能,可查看當(dāng)?shù)靥鞖馇闆r,包括溫度、濕度、風(fēng)速、未來幾天天氣狀況等天氣信息。
(2)采集數(shù)據(jù)查詢模塊。
此模塊可實(shí)現(xiàn)按具體時(shí)間范圍來查詢田地里的土壤因子信息,包括有效氮(N)、有效磷(P)、有效鉀(K)的含量,土壤濕度,還可查看甘蔗的糖濃度信息,可以查詢歷史數(shù)據(jù),并生成Excel表格。
圖2 系統(tǒng)功能結(jié)構(gòu)圖
(3)田地信息管理模塊。
此模塊功能是可查詢每塊田地的具體信息,如田地編號(hào)、土地類型、土壤種類、甘蔗品種、種植時(shí)間、生長周期、灌溉方式、施肥狀態(tài)等。查看每塊田地甘蔗總體長勢情況,為下一步管理種植甘蔗工作提供依據(jù)。
(4)種植戶管理模塊。
此模塊功能可實(shí)現(xiàn)對種植戶信息的管理,錄入新的種植戶信息,如姓名、性別、聯(lián)系電話、聯(lián)系地址、照片、擁有田地等。當(dāng)甘蔗出現(xiàn)問題時(shí)可快速聯(lián)系到種植戶。對種植戶信息進(jìn)行查詢、修改、刪除操作。
(5)用戶管理模塊。
此模塊完成對管理員、用戶的管理。管理員可新添加用戶相關(guān)的信息,也可對其修改和刪除。
(6)病蟲害防治模塊。
此模塊功能是可查詢跟甘蔗病蟲害有關(guān)信息,并能了解如何防治如黑穗病、鳳梨病、甘蔗蚜蟲等病蟲害,也可通過輸入甘蔗病蟲害信息,來判斷甘蔗到底屬于哪種病害,對癥下藥。
(7)設(shè)備配置模塊。
此模塊功能是配置相關(guān)串口信息與下位機(jī)相連,也可通過串口發(fā)送命令控制下位機(jī)無線網(wǎng)絡(luò)網(wǎng)關(guān)上傳無線節(jié)點(diǎn)數(shù)據(jù)信息[3]。
系統(tǒng)采用Windows+Visual Studio 2010+SQL Server 2008的方案,開發(fā)語言采用C#語言,前臺(tái)頁面選用 Expression Blend 4 設(shè)計(jì) XAML[4],運(yùn)用 MVVM Light Toolkit幫助在系統(tǒng)中具體實(shí)現(xiàn)MVVM框架[5],運(yùn)用NHibernate實(shí)現(xiàn)對象與數(shù)據(jù)庫的映射。
Model-View-ViewModel(MVVM)是一種用于軟件工程中的架構(gòu)模式,可以說是一種量身定制的幫助開發(fā)WPF或Silverlight程序的框架[6]。MVVM優(yōu)化了WPF帶來的一些新特性,如綁定、依賴屬性(Dependency Property)、路由事件 (Routed Events)、命令(Commands)、模板(Template)等。MVVM能夠使程序的業(yè)務(wù)邏輯與用戶界面分離,讓開發(fā)者與界面設(shè)計(jì)人員能更加容易地相互協(xié)作,也能夠使程序更加容易測試、維護(hù)與升級(jí)[7]。
模型處于框架中的底層部位,它封裝了數(shù)據(jù)模型和業(yè)務(wù)邏輯,也支持?jǐn)?shù)據(jù)的訪問和存儲(chǔ)。在甘蔗種植管理系統(tǒng)中,模型用來管理系統(tǒng)中需要的數(shù)據(jù)模型和系統(tǒng)中業(yè)務(wù)邏輯流程,還可通過NHibernate與數(shù)據(jù)庫進(jìn)行交互。
視圖模型是MVVM框架中的核心部分,主要包含了屬性、命令、事件等。其中屬性是View中數(shù)據(jù)的來源,屬性可以是一個(gè)對象,也可以是一個(gè)集合,它可以通過綁定連接到View中的控件,并且綁定還支持傳輸?shù)揭晥D的數(shù)據(jù)的輸入驗(yàn)證。命令則用于根據(jù)View中用戶的輸入,做出相應(yīng)的判斷,也可以通過綁定連接到View中。在甘蔗種植管理系統(tǒng)中,當(dāng)用戶操作系統(tǒng)發(fā)出命令時(shí),首先是通過在View中綁定的命令,把用戶需求傳送到ViewModel中,然后在View-Model中根據(jù)需求內(nèi)容到相應(yīng)的數(shù)據(jù)模型中獲取數(shù)據(jù)。
視圖可以說是系統(tǒng)的界面,用戶可以通過顯示的數(shù)據(jù)模型進(jìn)行操作。例如本系統(tǒng)中采集數(shù)據(jù)查詢界面可以查詢相關(guān)采集的數(shù)據(jù)信息,該界面就是一個(gè)視圖,系統(tǒng)中的視圖是依靠XAML創(chuàng)建的。
MVVM框架最主要的目的是為了視圖與模型的分離,分離后便于后期在原先的功能上進(jìn)行擴(kuò)展和維護(hù),當(dāng)視圖發(fā)生變化時(shí)視圖模型與模型并不需要改動(dòng),而且可以應(yīng)用Expression Blend 4軟件對視圖界面進(jìn)行設(shè)計(jì),縮短系統(tǒng)開發(fā)周期[8]。
下面詳細(xì)說明模型、視圖模型、視圖之間的信息是如何交互的。MVVM框架中模型、視圖模型、視圖相互關(guān)系如圖3所示。
為了分公司的生產(chǎn)經(jīng)營,王經(jīng)理有一半時(shí)間在外面跑,學(xué)習(xí)經(jīng)驗(yàn)、訪問業(yè)主、檢查工地、匯報(bào)工作……為了趕時(shí)間,他經(jīng)理把飛機(jī)和火車定在晚間,有時(shí)候連續(xù)幾天下來,同行的小伙子都有些吃不消,他卻依舊精神抖擻,一有空閑,不是組織摜蛋,就是打籃球,很多時(shí)候堅(jiān)持打個(gè)全場,仿佛自己還是那個(gè)英姿少年,灌籃高手。
圖3 模型、視圖模型、視圖之間交互圖
模型、視圖模型、視圖可以很容易地通過數(shù)據(jù)綁定、命令、數(shù)據(jù)驗(yàn)證相互交互[9]:
(1)數(shù)據(jù)綁定(Data Binding)。
數(shù)據(jù)綁定是MVVM框架中很重要的一部分,由于WPF提供了數(shù)據(jù)綁定這個(gè)新特性,在設(shè)計(jì)View-Model和Model時(shí)同樣支持?jǐn)?shù)據(jù)綁定[10]。當(dāng)生成類時(shí),可以應(yīng)用INotifyPropertyChanged接口實(shí)現(xiàn)數(shù)據(jù)綁定,假如屬性為集合時(shí),也可以應(yīng)用ObservableCollection<T>來聲明類。通過數(shù)據(jù)綁定可以實(shí)現(xiàn)View與ViewModel和Model之間屬性的交互。
(2)命令(Commands)。
命令可以提供數(shù)據(jù)在View上的編輯和顯示,在ViewModel中可以為用戶定義操作或行為動(dòng)作的命令。命令也可以綁定到View中的控件上,但是在ViewModel中定義命令時(shí)需要實(shí)現(xiàn)ICommand接口。
(3)數(shù)據(jù)驗(yàn)證(Data Validation)。
MVVM Light Toolkit可以快速地在項(xiàng)目中具體實(shí)現(xiàn)MVVM設(shè)計(jì)模式。MVVM Light Toolkit可以安裝到Visual Studio中并提供開發(fā)MVVM項(xiàng)目模板和代碼段。在MVVM Light庫中也包含一些幫助開發(fā)程序的類,例如ViewModelBase類用于在ViewModel中實(shí)現(xiàn)RaisePropertyChanged(通知屬性更改)、IsDesign-Mode(判斷是否是 Blend設(shè)計(jì)模式)等基本功能。RelayCommand類實(shí)現(xiàn)MVVM中命令的生成,并通過Execute執(zhí)行委托生成的方法對事件進(jìn)行處理。Messenger類通過Send<T>泛型方法和Register<T>泛型方法實(shí)現(xiàn)不同頁面和窗體間的參數(shù)傳遞問題。
在甘蔗種植管理系統(tǒng)中,當(dāng)把用戶信息屬性綁定到View頁面中,并發(fā)生更改通知Model時(shí),運(yùn)用MVVM Light Toolkit中ViewModelBase類可實(shí)現(xiàn)其過程,相關(guān)代碼如下:
用戶執(zhí)行查詢數(shù)據(jù)命令時(shí),通過綁定到View頁面中的SearchCommand命令來進(jìn)行事件的處理。命令的實(shí)現(xiàn)可通過RelayCommand類實(shí)現(xiàn),相關(guān)代碼如下:
在用戶登錄系統(tǒng)時(shí),需要判斷用戶是否登錄成功以便是否要彈出主窗體時(shí),運(yùn)用Messenger類可以實(shí)現(xiàn)從登錄頁面往主頁面?zhèn)鬏斒欠竦卿洺晒Φ膮?shù),相關(guān)代碼如下:
NHibernate是面向.NET環(huán)境的對象/關(guān)系數(shù)據(jù)庫的映射工具[12]。對象/關(guān)系數(shù)據(jù)庫映射(Object/Relational Mapping,ORM)用來把對象模型表示的對象映射到基于SQL的關(guān)系模型數(shù)據(jù)結(jié)構(gòu)中去。NHibernate從數(shù)據(jù)庫底層把.NET對象持久化到關(guān)系數(shù)據(jù)庫中,還能自動(dòng)生成SQL語句,減少程序開發(fā)時(shí)人工處理ADO.NET和SQL語句的時(shí)間。
在甘蔗種植管理系統(tǒng)中,以實(shí)現(xiàn)通過NHibernate把田地信息對象持久化到數(shù)據(jù)庫中為例,實(shí)現(xiàn)過程如圖4所示。
圖4 NHibernate設(shè)置步驟圖
(1)在項(xiàng)目App.config中配置 NHibernate連接節(jié)點(diǎn)信息,例如數(shù)據(jù)庫連接字符,生成IDbCommands對象的超時(shí)時(shí)間等信息。主要代碼如下:
(2)在數(shù)據(jù)庫中構(gòu)建田地信息(Area)表,包括田地編號(hào)、田地名稱、田地類型、種植時(shí)間等信息。
(3)在項(xiàng)目中聲明需要被持久化的Area類。代碼如下:
(4)配置持久化Area對象屬性的映射文件Area.hbm.xml。其中class屬性中 lazy賦值為true可使用延遲加載,主鍵id設(shè)為AreaID,其余屬性按照數(shù)據(jù)庫中聲明依次設(shè)定。主要代碼如下:
(5)在數(shù)據(jù)訪問層中調(diào)用NHibernate API實(shí)現(xiàn)調(diào)用數(shù)據(jù)庫基本功能。相關(guān)代碼如下:
Google Map是Google公司提供的電子地圖服務(wù),可以通過提供的Google Map API二次開發(fā),實(shí)現(xiàn)甘蔗種植地圖管理模塊。運(yùn)用Google Map JavaScript API v3[13]創(chuàng)建甘蔗種植地理位置地圖,通過坐標(biāo)在地圖上Marker標(biāo)記出無線節(jié)點(diǎn)位置和運(yùn)用Polygon多邊形標(biāo)識(shí)出甘蔗種植區(qū)域面積。運(yùn)用其他API實(shí)現(xiàn)地圖放大、縮小,選擇種植點(diǎn)功能。
WPF中WebBrowser可以把Google Map的HTML文件加載到程序中。當(dāng)要實(shí)現(xiàn)Google Map與WPF交互時(shí),WPF需要調(diào)用HTML文件中JavaScript。以往需要運(yùn)用COM組件MSHTML時(shí),并不是每臺(tái)計(jì)算機(jī)都安裝MSHTML。這時(shí)可以應(yīng)用WebBrowser中InvokeScirpt方法調(diào)用HTML中JavaScript方法,例如:
if(webBrowser1.Document!=null){
webBrowser1.InvokeScript(“togglePlant”);}//顯示種植區(qū)域
采用MVVM框架幫助解決了系統(tǒng)設(shè)計(jì)中耦合度的問題,實(shí)現(xiàn)頁面與業(yè)務(wù)邏輯分離,使在設(shè)計(jì)頁面時(shí)可同時(shí)編寫后臺(tái)代碼,更改頁面時(shí)也無需變動(dòng)后臺(tái)代碼[14]。采用WPF中的控件模板(Template)和樣式(Style)對原有的控件進(jìn)行設(shè)計(jì),以便清晰直觀地顯示數(shù)據(jù),方便用戶操作。部分運(yùn)行頁面如甘蔗種植地圖管理頁面、田地管理頁面、病蟲害管理頁面分別如圖5、圖6、圖7所示。
經(jīng)過單元測試,系統(tǒng)能夠正常穩(wěn)定地運(yùn)行,實(shí)現(xiàn)了對采集的信息和種植甘蔗相關(guān)信息管理的設(shè)計(jì)目的。用戶可以方便地查詢信息,對甘蔗的生長狀態(tài)有全面的了解。MVVM框架的應(yīng)用也使得系統(tǒng)設(shè)計(jì)流程更加規(guī)范,通過 Model、View、View Model之間的交互實(shí)現(xiàn)了界面設(shè)計(jì)與后臺(tái)邏輯代碼的分離,NHibernate封裝了對象與數(shù)據(jù)庫之間的交互,建立了一個(gè)易于維護(hù),便于測試,有良好的擴(kuò)展性的應(yīng)用系統(tǒng)。
圖5 甘蔗種植地圖頁面圖
圖6 田地管理頁面圖
圖7 病蟲害管理頁面圖
[1]劉鐵錳.深入淺出WPF[M].北京:中國水利水電出版社,2010.
[2]程國雄,胡世清.基于Silverlight的RIA系統(tǒng)架構(gòu)與設(shè)計(jì)模式研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2010,31(8):1706-1709,1713.
[3]陳荔,張菁.基于串口自定義協(xié)議傳輸文件的設(shè)計(jì)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2012,22(2):45-48.
[4]Dino Esposito,Andrea Saltarello.Microsoft.NET:Architecting Applications for the Enterprise[M].Microsoft Press,2010.
[5]Laurent Bugnion.MVVM Light Toolkit[EB/OL].http://www.galasoft.ch/mvvm,2012-12-10.
[6]Jarnjak F.Flexible GUI in robotics applications using Windows presentation foundation framework and model view viewmodel pattern[C]//Proceedings of the 4th International Conference on New Trends in Information Science and Service Science.2010:176-179.
[7]Gao Beibei,Zhang Shudong,Yao Naiming.A multidimensional pivot table model based on MVVM pattern for rich Internet application[C]//Proceedings of the 2012 International Symposium on Computer,Consumer and Control.2012:24-27.
[8]程國雄,胡世清.數(shù)字化圖書及英語交互學(xué)習(xí)RIA平臺(tái)的研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2010,31(13):3103-3107.
[9]Josh Smith.WPF Apps with the Model-View-ViewModel Design Pattern[EB/OL].http://msdn.microsoft.com/enus/magazine/dd419663.aspx,2009-02-28.
[10]John Papa.Data Binding in WPF[EB/OL].http://msdn.microsoft.com/en-us/magazine/cc163299.aspx,2007-12-05.
[11][美]Matthew MacDonald.WPF編程寶典:C#2010版[M].王德才譯.北京:清華大學(xué)出版社,2011.
[12]傅棋燦,史浩山.基于Linq to NHibernate數(shù)據(jù)庫應(yīng)用系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].微型電腦應(yīng)用,2010,26(12):44-46.
[13]Google.Google Maps JavaScript API V3 Reference[EB/OL].https://developers.google.com/maps/documentation/javascript/reference?hl=zh-CN,2013-05-30.
[14]Dino Esposito,Andrea Saltarello.Microsoft.NET 企業(yè)級(jí)應(yīng)用架構(gòu)設(shè)計(jì)[M].北京:人民郵電出版社,2010.