王東 楊杰
摘要:針對(duì)溫室大棚上位機(jī)采用LabVIEW、OneNet等公有云平臺(tái)開發(fā)存在需要授權(quán)、需要公網(wǎng)支持或者數(shù)據(jù)不受控等問題,文章介紹了一種基于插件的上位機(jī)開發(fā)方式,根據(jù)軟件界面的功能特點(diǎn),將界面劃分成內(nèi)容展示區(qū)、菜單和按鈕功能區(qū)、PAD區(qū)等通用模塊,利用C#的反射功能,將通用模塊設(shè)計(jì)為插件掛載到工作臺(tái)上,實(shí)現(xiàn)功能與界面的分離,提高系統(tǒng)的穩(wěn)定性和可擴(kuò)展性。經(jīng)實(shí)踐驗(yàn)證,該系統(tǒng)穩(wěn)定可靠。
關(guān)鍵詞:插件;上位機(jī);MQTT;C#
中圖分類號(hào):TP311.5
文獻(xiàn)標(biāo)志碼:A
0 引言
近年來,隨著經(jīng)濟(jì)的不斷發(fā)展,人們對(duì)各類經(jīng)濟(jì)作物的需求越來越大,為提高經(jīng)濟(jì)作物的產(chǎn)量以及應(yīng)對(duì)四季變化,各種農(nóng)業(yè)設(shè)施投入也越來越大,溫室大棚也由傳統(tǒng)的簡易溫室大棚向智能化大棚轉(zhuǎn)變。伴隨著信息技術(shù)的高速發(fā)展,我國已通過信息技術(shù)實(shí)現(xiàn)對(duì)溫室大棚的遠(yuǎn)程管理,從而提高了溫室大棚環(huán)境監(jiān)測的效率,降低了工作人員的勞動(dòng)強(qiáng)度,也使環(huán)境監(jiān)測更加準(zhǔn)確和及時(shí)。大量研究人員對(duì)此進(jìn)行了研究,如陳煒明等[1]采用單片機(jī)控制傳感器采集大棚內(nèi)環(huán)境參數(shù),并通過CC1101 射頻模塊將數(shù)據(jù)傳輸?shù)街锌貑纹瑱C(jī),實(shí)現(xiàn)對(duì)各類設(shè)施的控制和相關(guān)信息的顯示;黃力等[2]設(shè)計(jì)了由各類硬件設(shè)施采集溫室大棚的環(huán)境參數(shù),并通過智能綜合網(wǎng)關(guān)將數(shù)據(jù)上傳到中國移動(dòng)打造的PaaS物聯(lián)網(wǎng)開放平臺(tái),實(shí)現(xiàn)數(shù)據(jù)的管理及交互;舒丹丹等[3]在溫室大棚中組建了ZigBee無線傳感網(wǎng)絡(luò),將采集的數(shù)據(jù)統(tǒng)一匯總后再經(jīng)WiFi網(wǎng)關(guān)上傳到上位機(jī)和手機(jī)App客戶端;李國利等[4]基于ESP32監(jiān)控系統(tǒng)的下位機(jī),并使用Blinker 作為物聯(lián)網(wǎng)接入方案,設(shè)計(jì)上位機(jī)手機(jī)App,實(shí)現(xiàn)了溫室大棚數(shù)據(jù)的監(jiān)測;侯波等[5]將GSM作為無線數(shù)據(jù)傳輸?shù)耐?,LabVIEW作為上位機(jī)數(shù)據(jù)處理平臺(tái)實(shí)現(xiàn)溫室大棚的環(huán)境監(jiān)測系統(tǒng);楊青青等[6]通過Arduino UNO 為系統(tǒng)主控板采集環(huán)境參數(shù),并通過通信模塊將數(shù)據(jù)上傳到OneNet云平臺(tái),實(shí)現(xiàn)了上位機(jī)微信小程序的數(shù)據(jù)展示效果;張君雁等[7]利用.Net Framework4.0、開源數(shù)據(jù)庫MySQL5.5和串口通信開發(fā)了溫室大棚的HMI程序;周萬禹等[8]利用STM32單片機(jī)開發(fā)了溫室大棚的下位機(jī)系統(tǒng),并通過NB-IoT通信模塊將數(shù)據(jù)上傳到華為OceanConnet物聯(lián)網(wǎng)平臺(tái),實(shí)現(xiàn)了對(duì)溫室大棚環(huán)境的監(jiān)測;熊琰等[9]利用C#語言開發(fā)了基于ZigBee的校園火災(zāi)防范系統(tǒng)上位機(jī)軟件,利用串口通信可以展示各監(jiān)測點(diǎn)的狀態(tài)。從以上的文獻(xiàn)中可知,溫室大棚監(jiān)控系統(tǒng)主要分為上位機(jī)和下位機(jī)兩部分,下位機(jī)采用單片機(jī)對(duì)環(huán)境參數(shù)進(jìn)行采集,通過無線或串口通信將數(shù)據(jù)上傳到上位機(jī)實(shí)現(xiàn)展示,而上位機(jī)的開發(fā)主要包括由中國移動(dòng)開發(fā)的OneNet等現(xiàn)成物聯(lián)網(wǎng)平臺(tái)或采用LabVIEW等軟件進(jìn)行自定義開發(fā)。雖然OnetNet等公有云平臺(tái)功能強(qiáng)大,運(yùn)行穩(wěn)定,但必須有外網(wǎng)支持,同時(shí)還受限于平臺(tái)的各類規(guī)范,數(shù)據(jù)可能存在安全隱患。自定義的開發(fā)方式能利用已有的開發(fā)模塊和開發(fā)模式,數(shù)據(jù)管理能夠受控,容易形成自有的知識(shí)產(chǎn)權(quán),且運(yùn)行環(huán)境可以根據(jù)項(xiàng)目的需要選擇因特網(wǎng)或局域網(wǎng)。因此本文介紹一種基于插件的溫室大棚監(jiān)控系統(tǒng)上位機(jī)軟件開發(fā)方式,軟件利用插件實(shí)現(xiàn)界面與功能的分離,同時(shí)基于MQTT通信協(xié)議,能夠及時(shí)接收和向客戶端發(fā)送溫室大棚的實(shí)時(shí)數(shù)據(jù),使系統(tǒng)具有良好的穩(wěn)定性和可擴(kuò)展性。
1 總體方案介紹
溫室大棚監(jiān)控系統(tǒng)的主要目的是監(jiān)控溫室大棚的環(huán)境參數(shù),并根據(jù)情況對(duì)溫室大棚內(nèi)的設(shè)施設(shè)備進(jìn)行控制,整個(gè)系統(tǒng)包括用于數(shù)據(jù)采集和控制的下位機(jī)及數(shù)據(jù)存儲(chǔ)處理的上位機(jī)兩個(gè)部分,如圖1所示。
下位機(jī)由單片機(jī)和用于環(huán)境監(jiān)測的傳感器如光照、濕度、溫度等傳感器和無線通信模塊等構(gòu)成。上位機(jī)主要用于接收和存儲(chǔ)由下位機(jī)上傳的數(shù)據(jù)、歷史數(shù)據(jù)展示、用戶管理、客戶端實(shí)時(shí)數(shù)據(jù)展示等。為了提高上位機(jī)軟件的穩(wěn)定性和可維護(hù)性,系統(tǒng)采用插件的方式進(jìn)行設(shè)計(jì)開發(fā),所有的功能模塊都掛接到系統(tǒng)的工作臺(tái)上,由工作臺(tái)對(duì)所有的模塊統(tǒng)一管理。
2 上位機(jī)功能介紹
根據(jù)總體方案,上位機(jī)主要實(shí)現(xiàn)三大部分功能:一是與下位機(jī)對(duì)接,對(duì)下位機(jī)進(jìn)行管理及控制;二是對(duì)終端用戶管理,并向用戶提供數(shù)據(jù)查詢和展示;三是基礎(chǔ)功能,即各類通信協(xié)議對(duì)接及數(shù)據(jù)存儲(chǔ)。為方便各終端與上位機(jī)之間的及時(shí)通信,上位機(jī)選擇基于TCP的MQTT通信協(xié)議,各模塊如圖2所示。
3 上位機(jī)系統(tǒng)設(shè)計(jì)
本系統(tǒng)設(shè)計(jì)的運(yùn)行環(huán)境為Windows 7及以上系統(tǒng),采用運(yùn)行于.NET Framework和.NET Core(完全開源,跨平臺(tái))的高級(jí)程序設(shè)計(jì)語言C#開發(fā)。移動(dòng)客戶端單獨(dú)進(jìn)行開發(fā),只需要通過網(wǎng)絡(luò)與上位機(jī)進(jìn)行交互即可。
為提高系統(tǒng)的可靠性、穩(wěn)定性和可維護(hù)性,未來在不修改現(xiàn)有源代碼的基礎(chǔ)上能夠進(jìn)行功能擴(kuò)展,本文設(shè)計(jì)了基于插件的框架,并在此基礎(chǔ)上實(shí)現(xiàn)上位機(jī)的各種功能。
3.1 插件框架設(shè)計(jì)
根據(jù)上位機(jī)總體框圖,上位機(jī)分為不同的功能模塊,因此插件框架主要實(shí)現(xiàn)各類功能模塊的管理,實(shí)現(xiàn)各功能與界面之間的分離,降低偶合。根據(jù)常用軟件的界面布局和功能特點(diǎn),將軟件的主要界面抽象為內(nèi)容展示區(qū)、菜單和按鈕功能區(qū)、PAD區(qū)等通用模塊,利用C#的反射功能,將通用模塊設(shè)計(jì)為插件掛載到工作臺(tái)上,實(shí)現(xiàn)功能與界面的解耦。菜單和工具欄主要用于啟動(dòng)命令,而中間的內(nèi)容展示區(qū)和PAD區(qū)分別代表了兩種典型的界面:VIEW和PAD。VIEW顯示主要內(nèi)容,PAD顯示日志、屬性等簡要信息,且可以隱藏。菜單和工具欄上的命令,需要由用戶點(diǎn)擊或者設(shè)置為由插件框架在啟動(dòng)時(shí)自動(dòng)調(diào)用,而VIEW和PAD的顯示需要由其他命令來啟動(dòng)或者在啟動(dòng)時(shí)由框架自動(dòng)調(diào)用。
菜單或工具按鈕在用戶點(diǎn)擊時(shí),等同于調(diào)用某一功能函數(shù)。為規(guī)范和統(tǒng)一調(diào)用,所有菜單和工具欄按鈕的執(zhí)行函數(shù)都由一個(gè)ICommand接口來對(duì)應(yīng),包括一個(gè)Run成員函數(shù),對(duì)應(yīng)該命令需要執(zhí)行的功能。每個(gè)按鈕或者菜單項(xiàng)都有相應(yīng)的圖標(biāo)、名稱、是否有效等屬性,在接口中只有一個(gè)Run函數(shù)是不足以表達(dá)的,因此定義抽象類AbstractMenuCommand繼承于ICommand,以便默認(rèn)實(shí)現(xiàn)一些相應(yīng)的屬性。每個(gè)實(shí)際的菜單項(xiàng)或工具欄按鈕都對(duì)應(yīng)一個(gè)具體的繼承于AbstractMenuCommand的實(shí)現(xiàn)類,并在其中實(shí)現(xiàn)ICommand接口的成員,以實(shí)現(xiàn)具體要執(zhí)行的功能。
框架中的內(nèi)容展示區(qū)是軟件的主要界面,根據(jù)軟件的功能定義,它們顯示的界面各不相同,但主框架并不知道該區(qū)域應(yīng)加載的內(nèi)容,若直接定義各類控件,無法將界面和功能進(jìn)行分離,也無法對(duì)其進(jìn)行擴(kuò)展,因此,將主界面抽象成一個(gè)IViewContent接口,里面的用戶自定義控件(自定義控件中的子控件由用戶自行設(shè)計(jì),即具體顯示的界面),使得主框架只需要維護(hù)一個(gè)IViewContent列表,便能知道當(dāng)前打開的主界面窗口,而具體的用戶自定義控件由接口規(guī)范為ViewContentControl屬性。當(dāng)其他插件要與該界面進(jìn)行交互時(shí),只要找到某個(gè)IViewContent,將其屬性ViewContentControl轉(zhuǎn)換成對(duì)應(yīng)的用戶自定義控件的具體實(shí)現(xiàn),即可對(duì)其中的成員或函數(shù)等進(jìn)行操作,實(shí)現(xiàn)無需修改主界面的代碼就可通過其他插件對(duì)其進(jìn)行操作,從而實(shí)現(xiàn)了用戶功能和界面的相互分離,更加符合軟件工程的要求,使開發(fā)的軟件具有更好的穩(wěn)定性和可維護(hù)性。具體的類圖如圖3所示。
為便于所有插件能在不同的地方對(duì)框架中的插件進(jìn)行操作,本文利用單例模式設(shè)計(jì)工作臺(tái)類,即WorkBenchSingleTon類,并在其成員中增加靜態(tài)WorkBench屬性,代表整個(gè)軟件的界面框架,在此類中加載所有其他功能插件。而此靜態(tài)屬性也方便其他模塊調(diào)用以實(shí)現(xiàn)相互通信,從而使其他所有插件都可以通過該屬性對(duì)工作臺(tái)上的各類插件進(jìn)行查詢和操作。
軟件具體的功能則由具體的配置文件進(jìn)行配置,框架在啟動(dòng)時(shí)讀取該配置文件,并根據(jù)具體的信息在相應(yīng)的執(zhí)行文件中進(jìn)行反射調(diào)用生成。如在生成過程中程序設(shè)置全局錯(cuò)誤捕捉,遇到錯(cuò)誤彈出對(duì)話框提示錯(cuò)誤信息,并退出程序。
3.2 上位機(jī)功能設(shè)計(jì)
3.2.1 客戶端管理模塊
根據(jù)上位機(jī)的總體框架可知,本軟件主要實(shí)現(xiàn)客戶端管理(MQTT)、數(shù)據(jù)儲(chǔ)存管理、用戶管理、數(shù)據(jù)查詢等功能。其中,客戶端管理需要MQTT服務(wù),應(yīng)在軟件啟動(dòng)時(shí)啟動(dòng)該服務(wù),確保軟件打開后,MQTT客戶端能連接。在本框架中,自啟動(dòng)的服務(wù)有兩種方式,一種是沒有界面要求的插件,可以直接集成在框架的工作臺(tái)中(WorkBench)中,另一種是有界面的插件,使用一個(gè)VIEW來承載,在軟件啟動(dòng)時(shí),自動(dòng)啟動(dòng)該VIEW,兩種方式各有優(yōu)缺點(diǎn)。如果集成在工作臺(tái)中,將導(dǎo)致功能與框架集成,不利用模塊的重復(fù)使用;如果集成在VIEW中,那么該窗口可能被關(guān)閉,需要做好關(guān)閉VIEW時(shí)清理對(duì)象,避免重新打開時(shí)報(bào)錯(cuò)。本軟件采用在工作臺(tái)中集成MQTT通信模塊,降低各模塊與MQTT之間交互的難度。
MQTT服務(wù)采用MQTTnet模塊,該通信模塊使用C#語言開發(fā),目前還支持.net core,因此能夠?qū)崿F(xiàn)跨平臺(tái),是一款同時(shí)支持服務(wù)端和客戶端的高性能MQTT通信模塊。在實(shí)現(xiàn)MQTTServer時(shí),該模塊只需要應(yīng)用MqttServer OptionsBuilder類初始化mqttServer類,同時(shí)設(shè)置服務(wù)器啟動(dòng)、停止、客戶端連接、斷開,訂閱主題、取消訂閱主題、消息到達(dá)等事件處理函數(shù)。由于消息處理函數(shù)為單獨(dú)的線程,在收到數(shù)據(jù)進(jìn)行界面更新時(shí)需要使用委托進(jìn)行,最終的效果如圖4所示。
3.2.2 用戶管理和數(shù)據(jù)存儲(chǔ)模塊
用戶管理主要記錄各客戶端的用戶名和密碼,確保上傳的數(shù)據(jù)都經(jīng)過授權(quán),避免數(shù)據(jù)遭到破壞以及登錄本軟件的用戶信息。
數(shù)據(jù)存儲(chǔ)模塊的主要功能是將用戶數(shù)據(jù)和MQTT模塊接收到的數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫,在MQTT服務(wù)的信息到達(dá)事件中將接收到的數(shù)據(jù)保存到數(shù)據(jù)庫。由于節(jié)點(diǎn)上報(bào)的環(huán)境數(shù)據(jù)是按約定協(xié)議傳輸?shù)?,因此,中心基站在上傳MQTT報(bào)文時(shí),直接將每次上報(bào)的數(shù)據(jù)作為一條MQTT報(bào)文的載荷即可,在上位機(jī)軟件保存時(shí)再對(duì)載荷進(jìn)行解析后保存到數(shù)據(jù)庫。為了提高開發(fā)的效率,本軟件使用MSSQL Server存儲(chǔ)數(shù)據(jù),使用Entity Framework作為數(shù)據(jù)庫訪問中間件,并將所有的表都使用自增主鍵。
3.2.3 數(shù)據(jù)查詢模塊
數(shù)據(jù)查詢模塊和前面幾個(gè)模塊類似,都設(shè)計(jì)成一個(gè)ViewContent,在其上放置自定義用戶控件。在用戶控件上,根據(jù)需要將曲線繪制模塊作為該控件的主要控件,添加其他條件查詢的控件,本模塊相對(duì)比較獨(dú)立,只需要與數(shù)據(jù)庫進(jìn)行交互,而無需與其他模塊進(jìn)行交互,具體布局如圖5所示。
4 結(jié)語
利用C#的反射功能和配置文件,設(shè)計(jì)插件框架,讓軟件所有的功能都以插件的形式加載到軟件的工作臺(tái)中,對(duì)軟件主要功能界面和操作功能進(jìn)行歸類抽象為按鈕(菜單)、主界面、PAD區(qū)等,并通過單例模式可以方便查找到工作臺(tái)中的所有功能插件,實(shí)現(xiàn)功能與界面的分離,各功能模塊可以根據(jù)接口獨(dú)立開發(fā),實(shí)現(xiàn)面向接口的開發(fā),提高軟件的穩(wěn)定性和可靠性以及在不修改源代碼的情況下對(duì)軟件進(jìn)行擴(kuò)展。本文在此基礎(chǔ)上開發(fā)的溫室大棚監(jiān)控系統(tǒng)上位機(jī)軟經(jīng)實(shí)際長時(shí)間運(yùn)行,穩(wěn)定可靠,達(dá)到了預(yù)期目的。
參考文獻(xiàn)
[1]陳煒明,李水峰,林穎意,等.基于無線通信的溫室大棚數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)[J].電子設(shè)計(jì)工程,2017(12):72-76.
[2]黃力,魏文沖.基于OneNET云平臺(tái)的農(nóng)業(yè)溫室大棚上限閾值遠(yuǎn)程監(jiān)控的實(shí)現(xiàn)[J].信息與電腦(理論版),2020(1):163-165.
[3]舒丹丹,許鐘,強(qiáng)大壯,等.基于ZigBee的溫室大棚監(jiān)控系統(tǒng)的設(shè)計(jì)[J].遼寧師專學(xué)報(bào)(自然科學(xué)版),2020(3):80-84.
[4]李國利,周創(chuàng),牟福元.基于ESP32的溫室大棚環(huán)境遠(yuǎn)程監(jiān)控系統(tǒng)設(shè)計(jì)[J].中國農(nóng)機(jī)化學(xué)報(bào),2022(3):47-52.
[5]侯波,徐小華,胡曉飛.基于LabVIEW和GSM的溫室大棚環(huán)境遠(yuǎn)程監(jiān)控系統(tǒng)設(shè)計(jì)[J].江蘇農(nóng)業(yè)科學(xué),2015(1):393-395.
[6]楊青青,秦芹,鞏倩倩,等.基于云平臺(tái)的溫室大棚環(huán)境數(shù)據(jù)采集與控制系統(tǒng)研究[J].無線互聯(lián)科技,2022(5):45-46.
[7]張君雁,楊晨輝,張志強(qiáng).溫室大棚環(huán)境控制系統(tǒng)研究[J].成都大學(xué)學(xué)報(bào)(自然科學(xué)版),2018(1):67-70.
[8]周萬禹,胡乃瑞,楊美琪,等.溫室大棚環(huán)境監(jiān)測及控制系統(tǒng)的設(shè)計(jì)[J].電子測試,2020(5):45-47.
[9]熊琰.基于ZigBee的校園火災(zāi)防范系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].現(xiàn)代信息科技,2021(12):168-171,176.
(編輯 王雪芬)
Design of upper computer software of greenhouse monitoring system
Wang Dong1, Yang Jie2
(1.School of Intelligent Manufacturing, Chongqing Industry & Trade Polytechnic, Chongqing 408000, China;
2.School of Artificial Intelligence, Chongqing Industry & Trade Polytechnic, Chongqing 408000, China)
Abstract: Aiming at the problems of authorization, public network support or uncontrolled data when the upper computer in the greenhouse is developed using LabVIEW or public cloud platforms such as OneNet ,etc. This paper introduces a plugin based upper computer development method. According to the functional characteristics of the software interface, the interface is divided into general modules such as content display area, menu and button functional area, PAD area and so on. Design a universal module as a plugin to be mounted on the workbench, achieving separation of functions and interfaces, and improving system stability and scalability. After practical verification, the system is stable and reliable.
Key words: plugins; upper computer; MQTT; C#