牛曉晨,張新柱
(西安郵電大學計算機學院,陜西西安,7100121;西安郵電大學黨委組織部,陜西西安,7100121)
圈舍環境是指影響動物的生長、發育、繁殖和生產的所有外界條件,一般包括物理環境(如溫度、濕度等)和化學環境(如氨氣、硫化氫等)。環境因素對動物的生長發育等方面意義重大,當環境因素在適宜范圍內時有利于生長發育,反之則會阻礙生長發育。隨著科學技術的飛速發展,養殖業逐步走向規模化、集約化,數字化和信息化程度越來越高,因此建立起圈舍環境監測預警系統成為當務之急。
圈舍環境監測預警系統主要由環境監測和環境報警兩部分組成。首先溫、濕度等各種傳感器對圈舍內主要環境因素進行信息采集,然后通過網絡傳輸到監控中心的服務器;服務器端接收到數據后,將數據存入數據庫,同時經過分析將超出或低于正常值的數據進行標識;客戶端通過向服務器查詢超限數據來判斷是否有異常數據,若有則向用戶報警。
系統的實現離不開網絡,目前可選的網絡傳輸協議有兩種:UDP和TCP。UDP在傳送數據之前不需要先建立連接,遠程主機在接收到數據報后不需要給出任何應答。在只傳送少量數據、對實時性要求較高的應用環境下,這是一種最有效的工作方式。TCP則是提供面向連接的可靠的運輸服務,因此不可避免地增加了許多開銷。由于要傳送的數據主要是傳感器類型與監測的數據值,所以傳送信息量小;而對于環境值需要進行多次采樣,并快速傳往服務器,數據傳送的實時性要求較高。因此,本系統選用UDP協議進行數據傳送。
對于UDP數據包中的傳送內容,系統只選取了最為必要的數據進行傳送,大小僅為4個字節。表1是一個UDP數據包中的內容格式。

表1 UDP數據包內容格式
其中舍號占用第一個字節,可表示256個圈舍,范圍從0到255。第二個字節用來表示傳感器的類型和序號,例如0代表溫度、1代表濕度、2代表氨氣,由于一個圈舍的傳感器類型不會超過8個,所以使用該字節的低三位來表示類型;對于一個大點的圈舍,其某一類型的傳感器的數量可能不止一個,如有溫度傳感器10個,濕度傳感器11個,為了進行區別,需要對同一類型的傳感器進行編號,因此使用該字節的高五位用來記錄傳感器的序號。第三和第四個字節用來表示傳感器的數值,共16位可表示的范圍從0到65535;雖然溫濕度的值不會那么大,但風機轉速值往往都是數千轉;而溫濕度值雖小,但它卻是實數,有小數位,因此對于溫濕度第三個字節存整數值,第四個字節存小數值。通過對監測環境的分析,系統將最核心的數據整合組成了UDP數據包的內容,避免了冗余數據的產生,提高了網絡傳輸效率。
數據庫采用Microsoft SQL Server 2008,主要表設計有三個:傳感器表、傳感器種類表和傳感器記錄表。傳感器表主要記錄了傳感器的編號、名稱、安裝所在圈舍id、傳感器類型、序號以及上限值和下限值。正是有了上限值和下限值,服務器接收端才能判斷出傳來的值是否異常。傳感器種類表主要記錄傳感器類型編號與名稱的對應關系,如0代表溫度、1代表濕度。傳感器記錄表記錄著接收到的每條傳感器值,是核心表,其表結構如圖1。

圖1 傳感器記錄表結構圖
通過上一節可知UDP數據包中的傳送內容有四項:舍號、類型、序號和數據值。服務器接收端會通過舍號、類型和序號在傳感器表中找到對應的傳感器編號和上下限值,通過將接收到的數據值與上下限值相比較來判斷是否值異常。若超上限,超限字段值為u;若超下限,超限字段值為d;其它則值為n,表示值正常。報警字段記錄用戶是否已看到該記錄,默認為n。客戶端通過查詢該表中所有超限字段值非n,且報警字段為n的記錄,來得到需要報警的信息。
服務器端負責接收傳感器信息的網絡應用程序使用到了多線程技術。在接收信息的過程中會遇到很多意想不到的問題,其中最常見的是網絡阻塞和網絡等待。程序在處理這些問題的時候往往需要花費很多的時間,若不使用多線程技術,則程序在執行時的會出現如:運行速度慢,執行時間長,容易出現錯誤、反應遲鈍等問題。而如果把這些可能造成大量占用程序執行時間的過程放在線程中處理,則能夠大大提高應用程序的運行效率和性能。
每個正在系統上運行的程序都是一個進程,每個進程包含一到多個線程。線程是操作系統分配CPU時間的基本單位,在進程中可以有多個線程同時執行代碼。預警系統采用C/S結構,使用C#語言進行開發。C#中使用的線程都是通過命名空間System.Threading中的Thread類經實例化完成的。通過Thread類的構造函數來創建可供C#使用的線程,通過Thread中的方法和屬性來設定線程屬性和控制線程的狀態。示例代碼如下:
Thread threadReceive=new Thread(ReceiveMessage); //創建線程
threadReceive.Start();//啟動線程
上述代碼實例化一個Thread對象,并指明將要調用的方法ReceiveMessage(),然后啟動線程。
C#的委托相當于C/C++中的函數指針。函數指針用指針獲取一個函數的入口地址,實現對函數的操作。委托與C/C++中的函數指針不同之處是:委托是面向對象的,是引用類型,類型安全。委托是網絡編程中用的最多的,其主要作用是傳方法。通常的方法或者函數只能用來傳參數,有的時候一個方法可能需要另一個方法的支持,此時可以定義個委托來傳這個方法。需要注意的是,委托和所要傳的方法的返回值類型要一致。委托的使用要先定義,再聲明,接著實例化,然后傳參,最后使用。示例如下:
delegate void MyDelegate(type_1 para_1,…,type_n para_n);//定義委托
MyDelegate a;//聲明委托
a=new MyDelegate(Method);//實例化委托,Method是一方法
SomeMethod(a);//將實例化的委托作為某方法的參數使用
Private void SomeMethod(MyDelegate myDelegate)//最后在此方法的代碼中使用
{…
//使用委托
myDelegate(para_1,…,para_n);
…
}
由于在.Net上執行的是托管代碼,C#強制要求這些代碼必須是線程安全的,即不允許跨線程訪問Windows窗體的控件。為了在遵循.Net安全標準的前提下,從一個線程訪問另一個線程創建的控件,就需要用到C#的跨線程方法回調機制。C#的跨線程方法回調機制實質上是委托的一種應用,有了回調機制就能夠在.Net中寫出線程安全的代碼了。
客戶端的主要任務是通過向服務器查詢超限數據來判斷是否有異常數據,若有則向用戶報警。因此客戶端對傳感器報警的響應速度要快,并且要有閃動等提示性動作;若程序被最小化,還應能自動彈出。因此如何及時獲得報警信息、如何動態生成報警信息以及如何動態控制窗體成為了客戶端開發需要研究的主要問題。
傳感器信息源源不斷地發往服務器,經服務器端程序處理后存入數據庫。那么客戶端需要定期地去查詢服務器端的數據庫,以便獲取最新的報警信息。在C#中可以使用timer(定時器)控件來實現這一需求。Timer控件和其他的WinForm控件的最大區別是它不可見,其主要作用是當Timer控件啟動后,每隔一個固定時間段會觸發相同的事件。在觸發的事件中編寫查詢數據庫的語句,并將其Interval屬性值設置在一個合理范圍內(10秒-30秒),就可及時獲取報警信息。
從前面的數據庫設計中可知一條傳感器記錄有很多項,為了更及時便利地處理查詢到的報警記錄,還需要設計一個報警信息結構體,其結構體內容與報警記錄各字段相一致。
由于報警信息可能沒有,也可能是多個,因此報警信息的顯示需要動態生成。本系統使用Label控件顯示報警信息,Label控件的動態生成算法如下:假設生成x行y列Label,首先通過查詢到的總報警信息數計算出需要生成的整行數zx和最后一行的列標ly;使用兩個嵌套的for循環生成zx行y列的Label;然后再用一個for循環生成最后一行ly列Label。在for循環中使用語句label=new Label()得到一個新的Label控件,通過對其Location、Text、ForeColor等屬性值的設定,可生成一個在指定位置使用紅色字體顯示某條報警信息的Label控件。
Label生成后,如何讓其閃動哪?本系統的設計思路是:使用一個Timer控件,其Interval屬性值設為600毫秒;觸發的事件的內容為遍歷所有生成的Label控件,并將其Visible屬性值置反,即label.Visible=!label.Visible。通過將Label的Visible屬性值不斷反復變化,就可得到閃動的Label。
因為環境報警是要優先相應的,所以不管此時客戶端程序運行在那個界面,只要報警界面沒開,就要自動關閉其它界面,打開報警界面。如果此時,程序被最小化了,還要能夠自動彈出成為當前程序焦點。對于優先相應的設計思路是:在父窗體中設置一個Timer控件,其觸發的事件的內容為首先從數據庫中獲取報警記錄數,如果不為零并且報警子窗體沒有打開,則關閉當前打開的子窗體,開啟報警子窗體。使用for語句將報警窗體名與當前打開的窗體名一一比較,可知報警窗體是否打開,比較次數為父窗體.MdiChildren.Length次。
而對于最小化自動彈出,可通過對父窗體的WindowState屬性的讀取與設置來完成。如果其值為FormWindowState.Minimized,則說明程序被最小化了,將屬性重新賦值為FormWindowState.Normal,程序即可自動彈出。
本文介紹了圈舍環境監測預警系統的功能和作用,對系統的關鍵技術進行了分析研究。網絡傳輸協議和內容的合理選定、數據庫的完善設計、多線程技術的使用以及客戶端設計難點問題的解決使得系統具有很好的易用性、穩定性和擴展性,同時具備遠距離信息傳送及時準確和報警迅速等優點。系統使得用戶能夠對圈舍環境進行遠距離監測,提高了養殖業的勞動生產率,降低了勞動強度。系統的實現提高了養殖業的信息化和數字化程度。
[1]魯純養.農業生物環境原理[M].北京:農業出版社,1994:147-150
[2]李立峰,武佩,麻碩士,于明珠.哺乳母豬舍環境監控系統的研究[J].農機化研究,2011,11(11):195-198.
[3]謝希仁.計算機網絡[M].北京:電子工業出版社,1999:230-231
[4]趙冬,郭清宇.C#多線程技術及其在網絡編程中的應用[J].許昌學院學報,2007,26(5):79-81.
[5]鄭阿奇.Visual C#網絡編程[M].北京:電子工業出版社,2011:23-50