摘要:為實現對生長柜中環境信息遠程采集和數據顯示,同時實現攝像頭對植物的監控和對多控制節點的遠程控制,設計了一種基于Android平臺的物聯網測控系統。該系統各傳感器的數據采集、攝像頭圖像采集以及調節生長柜中環境的執行機構是由FS_WSN4412平臺進行控制,利用Android編程技術對FS_WSN4412平臺軟件的功能和界面進行了設計,通過Wifi模塊上傳數據至服務器。物聯網服務器采用Tomcat搭建,利用JSP+servlet+MVC技術完成網頁的設計。結果表明,該系統實現了對物聯網智能植物生長柜的環境參數的現場和遠程監控。
關鍵詞:智能植物生長柜;物聯網;Android;遠程監控
中圖分類號:TP271 文獻標識碼:A 文章編號:0439-8114(2016)02-0473-05
DOI:10.14088/j.cnki.issn0439-8114.2016.02.053
為解決資源與食品安全問題,智能植物生長柜以節省資源、保護環境、安全、放心、健康為出發點,得到社會的廣泛關注與認可[1,2]。智能植物生長柜是一種人工光利用型植物工廠,使用LED燈光代替自然光,并能夠通過對植物生長發育過程中的環境溫度、濕度、光照度等要素進行智能控制,為植物生長提供環保、舒適的生活環境,從而實現植物周年連續生產[3-5]。
目前,市場上常見的智能植物生長柜依賴于嵌入式設備或微電腦對生長柜中的環境參數進行采集與調節,完全由人工在現場對生長柜中環境進行監測管理,無法實現遠程監控,而且硬件資源有限,具有管理效率低、操作不便、可擴展性差等缺點[6,7]。充分利用Android技術和物聯網技術的物聯網智能植物生長柜,以Android系統作為測控中心的主控制器,結合Wifi無線通信技術,使生長柜與互聯網聯系起來,實時與服務器端進行信息交換與通訊[8,9]。通過Android端測控中心的底層驅動和界面設計,實現本地對生長柜的監控,同時實現在服務器端遠程監測生長柜中環境參數、查詢數據庫中數據,并且通過攝像頭查看柜中植物生長狀況[10-12]。該系統能夠增強智能植物生長柜作業的可靠性、安全性、準確性和快捷性,最大限度保障生長柜中植物的安全與健康。
1 系統總體設計方案
系統主要分為底層測控中心和服務器端數據中心兩部分,系統架構圖如圖1所示。測控中心部分主要包括Android主控制板、環境參數采集模塊、攝像頭模塊、Wifi通信模塊及調節環境參數執行機構等5大模塊。Android控制板為FS_WSN4412開發板,主要完成生長柜現場監控,包括傳感節點信息采集、與服務器的網絡通信和響應服務器端反饋控制等功能;參數采集模塊主要通過采用CO2TH200二氧化碳溫濕度一體化傳感器模塊、光照傳感器和DS18B20溫度傳感器實時檢測獲得植物的生長環境;攝像頭模塊主要負責生長柜現場監控和服務器端遠程監控視頻的采集;Wifi通信模塊主要采用Wifi無線通信協議同服務器端進行遠距離無線通信;執行機構采用模糊PID智能控制算法,由Android系統通過控制I/O輸出進而控制加熱棒、制冷機、加濕器、風機、(小功率)氣壓泵、電機等控制設備來調節柜體內的溫度、濕度、CO2濃度和光照度以及營養液溫度。
2 子系統的設計與實現
2.1 Android系統與傳感器的設計與實現
Android系統是Google公司開發的基于Linux平臺的開源手機操作系統。該系統采用的是運行Android4.2.1版本的FS_WSN4412開發板,該設備基于ARM Cortex-A9的四核Exynos4412處理器,其主頻1.5 GHz,運行內存1 GB,具有豐富的傳感器節點、自帶攝像頭、外設接口資源和無線傳感網絡,是一款功能強大的嵌入式、物聯網、移動互聯網平臺。硬件傳感器部分采用的是CO2TH200二氧化碳溫濕度一體化傳感器、光照傳感器和DS18B20溫度傳感器,FS_WSN4412平臺上所有資源都在Linux系統中實現基本驅動,在Android系統中實現HAL的stub,并向JNI層注冊相應服務,包括LED服務、BEEP服務以及由Android系統實現的Sensor服務。
Android中傳感器底層驅動開發的文件位于Android源碼的如下位置:
1)frameworks/base/core/java/Android/hardware/SensorManager.java;
2)frameworks/base/core/jni/Android_hardware_SensorManager.cpp;
3)frameworks/base/services/java/com/Android/server/SensorService.java;
4)frameworks/base/services/jni/com/Android_server_SensorService.cpp;
再加上sensorstub以及Linux內核驅動,構成了整個Sensor框架,用戶應用程序只需調用sensormanager類,即可操作所有的傳感器(以下各層代碼中的sensor不是代表具體的一種傳感器,而是文中所有傳感器統稱)。
2.1.1 Android Sensor驅動層 Android內核是由標準的Linux內核修改而來的,內核空間的Android硬件驅動程序和Linux設備驅動程序的編寫均是以Linux模塊來實現的,即文件操作結構體file_operations的賦值以及結構體中函數的具體實現。此外,Android Sensor驅動層還執行各傳感器的注冊、初始化和設備的注銷操作。
file_operation是將系統調用和驅動程序關聯起來的關鍵數據結構。文件操作結構體中的成員函數是字符設備驅動程序設計的主體,這些函數會在應用程序的open()、write()、read()、close()等中被調用。傳感器一般結構體定義如下:
static struct file_operations sensor_fops={
.owner =THIS_MODULE,
.open =sensor_open,
.release=sensor_close,
.read=sensor_read,
.write=sensor_write,};
2.1.2 Android Sensor HAL層 硬件驅動程序一方面分布在Linux內核中,另一方面分布在用戶空間的硬件抽象層中,增加傳感器的硬件抽象層模塊訪問Linux內核驅動程序。Stub作為直接調用Linux驅動的上層,實現簡單的I/O操作,Stub向HAL提供操作函數(Operations),而Runtime則向HAL取得特定模塊(Stub)的Operations,再回調這些操作函數。在HAL實現的stub中定義hw_module_t結構體,該結構體是HAL模塊的核心結構體,所有硬件模塊都必須將該結構體作為第一個成員,表示繼承了該結構體。根據本層架構,定義3個結構體,它們主要部分分別定義如下:
typedef_struct sensor_module_t{
Tag:HARDWARE_MODULE_TAG,
......
id:SENSORS_HARDWARE_MODULE_ID,
}sensor_module_t
typedef struct sensor_module_method_t={
int (open)(const struct sensor_module_t module const char id
struct sensor_device_t device)
}sensor_module_method_t
typedef struct sensor_device_t={
struct sensor_module_t;
int (*get_read)(struct sensor_device_t*dev,int*val);
}sensor_device_t
上層通過硬件的id調用hw_get_module()函數,即得硬件模塊sensor_module_t,并從該模塊中得到sensor_module_method_t,繼而打開得到的硬件設備sensor_device_t,然后調用設備中的get_read()函數,即可調用傳感器在Linux內核層的驅動實現,最后調用hw_device_t中的close關閉設備。
2.1.3 Android Sensor JNI層 Android系統的應用程序是用Java語言編寫的,而硬件驅動程序是用C語言來實現的,應用程序要調用傳感器驅動程序操作硬件必須通過Java本地調用JNI來調用硬件抽象層接口。JNI的數據類型與Java數據類型的相互轉化及函數注冊是通過JNINative_Method結構體實現的,代碼如下:
typedef struct{
const char* name;
const char* signature;
void* fnPtr;
}JNINative_Method
JNI層主要是將stub中的open、close等方法封裝提交給android application框架。在int中會調用open方法初始化,代碼如下:
Static jint android_init(JNIEnv*env, jclass clazz)
{ ......
if(sensors_control_open(module->common,SensorDevice)==0){
const struct sensor_t*list;
int count=module->get_sensors_list(module,list);
return count;
}}
2.1.4 Android Sensor Framework層 為硬件抽象層模塊編寫完串口的JNI方法后,需要為Android系統的Application Frameworks層增加硬件訪問服務SensorService。Application Frameworks層中包含了自定義的硬件服務SensorService,在Android系統啟動的時候,應用程序就可以通過Java接口來訪問Sensor硬件服務了。
2.2 測控端軟件設計
測控端軟件采用Android Java開發,通過互聯網為物聯網連接媒介,結合Android底層驅動開發技術,在底層開發傳感器驅動,在應用程序層編寫各傳感器數據采集程序。用戶登錄進入系統前,Android設備通過Wifi無線網絡或3G移動通信網絡等連接到互聯網服務器上。登陸后,首先輸入已經申請的用戶名和密碼,然后啟動接收相應生長柜的環境參數的后臺運行SerialService類,實現采集數據的Android端實時監控和與服務器端數據交互,物聯網智能植物生長柜測控端的具體實現如圖3所示。
測控端Android應用程序主要包含了45個Java文件和10個XML腳本文件,每一個文件的屬性和權限要在全局的配置文件manifest.xml中定義。通信模塊采用的是Wifi無線通信方式,同時為了提高系統整體的通信效率,本系統將傳感器數據采集和互聯網通信部分放在了后臺獨立運行的線程Thread中執行,可以保證系統數據的實時采集和快速反應性能。
Android完全支持JDK本身的TCP、UDP網絡通信API,同時也支持JDK提供的URL、URLConnection等網絡通信API。本系統中由于用到互聯網通信,采用了URLConnection的一個子類HttpURLConnection,其可用于向指定網站發送GET請求、POST請求。Android端互聯網通信部分核心代碼如下:
URL url = new URL(“http://219.243.13.12:80/test/UploadServlet”);//創建URL對象
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();//調用URL對象openConnection()方法來創建HttpURLConnection對象
httpURLConnection.setRequestMethod(\"POST\");//設置POST方式的請求
DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream());//獲得OutputStream對象輸出流,準備上傳文件至服務器
dos.writeBytes(s1);//調用writeBytes上傳
InputStream is = httpURLConnection.getInputStream();
InputStreamReader isr = new InputStreamReader(is,\"utf-8\");
BufferedReader br = new BufferedReader(isr);
String result = br.readLine();//獲得InputStream對象輸入流,讀取從服務端傳過來的信息
啟動Android端應用程序,登錄到物聯網智能植物生長柜測控系統,與此同時啟動后臺程序采集生長柜中植物生長環境的參數和向服務器端的參數上傳。測控端向服務器發送POST方式的請求,連接服務器端。獲得OutputStream對象輸出流,準備上傳文件至服務器,通過調用WriteBytes實現數據上傳。上傳成功后,服務器端向底層Android端發送反饋信息,底層數據中心獲得InputStream對象輸入流,讀取從服務端傳過來的信息。Android端測控中心的網絡通信程序流程如圖4所示。
2.3 服務器端軟件設計
物聯網服務器是Web服務的一種,Web服務基于標準網絡調用約定,無關操作系統或編程語言,僅通過相同的調用命令來遠程執行程序并返回結果。本項目使用Myeclipse+tomcat+MVC模式來設計開發。Web服務發布成功后,通過在瀏覽器地址欄輸入調用地址或網址進行簡單的調用,也可以通過Web服務組合技術將相關服務分為一組,按組進行服務的批量調用。
物聯網服務器接收端的軟件設計步驟如下:
1)通過item.getInputStream()獲得上傳的輸入流;
2)將上傳的生長柜中環境參數數據通過pp.split(“b|a”)進行分割;
3)接收程序用一個后臺運行的servlet,保證在服務器打開的情況下實時接收下位機傳輸的數據,并插入數據庫sql1=\"insert into car_new(carnumber, carcolor, identifydate, identifyplace, path) values (?,?,?,?,?)\";
4)調用PreparedStatement進行逐次插入。
3 實際應用
智能植物生長柜實物圖如圖5所示,Android端測控中心生長柜中溫度現場監測結果如圖6所示,數據5 s更新一次。同時采用Wifi無線網絡通信技術將環境參數傳至互聯網,服務器端測試數據如圖7所示。
4 小結
基于Android平臺的物聯網智能植物生長柜測控系統,結合互聯網通信技術,實現了實時現場與遠程監控,根據傳感器監測到的環境參數對執行機構進行相應的控制,從而達到為作物提供最佳生長環境的目的。該設計具有硬件成本低、操作界面人性化、控制方便、實時性好、遠程控制靈敏度高等特點,具有廣闊的應用前景和使用價值。
參考文獻:
[1] 古在豐樹.太陽光利用型植物工廠——先進植物工廠的可持續性與設計[M].張成波,尚慶茂,譯.北京:中國農業出版社,2010.
[2] 楊其長,張成波.植物工廠系列談(七)——植物工廠光照和溫度調控[J].農村實用工程技術( 溫室園藝),2005(11):31-33.
[3] WU X L, DONG J L, LIANG F, et al. An LED green light for new plant growth cabinet precise temperature control system[J]. Applied Mechanics and Materials, 2014,577:325-328.
[4] 江 天,張 瀟.智能LED植物生長系統[J].照明工程學報,2012(S1):10.
[5] CUI S G,HAN S L,WU X L,et al. Design of hardware of smart qlant growth cabinet[J].Applied Mechanics and Materials,2014,577:624-627.
[6] 王石磊,郭艷玲,付志剛.基于ARM的溫室環境控制系統研究[J].林業機械與木工設備,2008,36(4):19-21.
[7] MONTOYA F G,GOMEZ J,CAMA A. A monitoring system for intensive agriculture based on mesh networks and the android system[J]. Computers and Electronics in Agriculture,2013, 99(7):14-20.
[8] 馬增煒,馬錦儒,李亞敏.基于WIFI的智能溫室監控系統設計[J].農機化研究,2011(2):154-157.
[9] 公 磊,周 聰.基于Android的移動終端應用程序開發與研究[J].計算機與現代化,2008(8):86-89.
[10] 陳 強.Android底層接口與驅動開發技術詳解[M].北京:中國鐵道出版社,2012.
[11] 韓 迪,潘志宏.基于Android移動設備傳感器的體感應用[J]. 華南理工大學學報(自然科學版),2012,40(9):75-80.
[12] 鄭 萌.Android系統移植和驅動開發[M].北京:電子工業出版社,2013.