楊韻芳
(黎明職業(yè)大學(xué) 信息與電子工程學(xué)院,福建 泉州 362000)
針對Java程序設(shè)計(jì)本身而言,Java是一門面向?qū)ο蟮某绦蛟O(shè)計(jì)課程,課程本身涉及面廣,知識點(diǎn)偏難[1]。在該課程的教學(xué)實(shí)施過程中,學(xué)生需要具有良好的邏輯思維能力和動(dòng)手操作能力,并進(jìn)行大量的實(shí)踐上機(jī)操作才能真正掌握知識點(diǎn)。“Java程序設(shè)計(jì)實(shí)訓(xùn)”作為“Java程序設(shè)計(jì)”課程的一個(gè)延伸,旨在提高學(xué)生對面向?qū)ο蟪绦蛟O(shè)計(jì)思想的理解及Java語言的實(shí)際應(yīng)用能力。為了更好體現(xiàn)物聯(lián)網(wǎng)專業(yè)的專業(yè)特點(diǎn),本實(shí)訓(xùn)系統(tǒng)圍繞“模擬智能農(nóng)場”來展開,實(shí)訓(xùn)系統(tǒng)主要為未學(xué)習(xí)數(shù)據(jù)庫知識的大一學(xué)生設(shè)計(jì),學(xué)生通過HTTP協(xié)議訪問Web服務(wù)器端提供的數(shù)據(jù)接口,以JSON數(shù)據(jù)格式與服務(wù)器端進(jìn)行數(shù)據(jù)交互,在此基礎(chǔ)上完成系統(tǒng)開發(fā),無須考慮數(shù)據(jù)存儲的問題。通過這個(gè)實(shí)訓(xùn)也使剛剛接觸物聯(lián)網(wǎng)的學(xué)生對物聯(lián)網(wǎng)有個(gè)直觀的認(rèn)識。
現(xiàn)有程序設(shè)計(jì)類課程實(shí)訓(xùn)主要以設(shè)計(jì)型實(shí)例為主,綜合型實(shí)例較少,實(shí)訓(xùn)內(nèi)容往往忽略與專業(yè)內(nèi)其它課程之間的銜接和聯(lián)系,未能體現(xiàn)專業(yè)課程建設(shè)群的融合,不利于學(xué)生利用所學(xué)知識解決實(shí)際問題綜合能力的培養(yǎng)。主要存在以下幾個(gè)問題:
(1)高低年級學(xué)生之間彼此的學(xué)習(xí)過程割裂,缺乏實(shí)驗(yàn)經(jīng)驗(yàn)傳承,學(xué)生缺乏實(shí)際的項(xiàng)目鍛煉,且學(xué)習(xí)過程只依賴有限的實(shí)驗(yàn)課內(nèi)時(shí)間,使得實(shí)驗(yàn)實(shí)訓(xùn)效果大打折扣,影響學(xué)生的學(xué)習(xí)興趣和信心[2]。
(2)程序設(shè)計(jì)類的實(shí)訓(xùn)選題過于單調(diào),內(nèi)容不新穎,多數(shù)是基于數(shù)據(jù)庫存取操作的程序設(shè)計(jì),學(xué)生容易從網(wǎng)絡(luò)下載源碼進(jìn)行修改,應(yīng)付了事。
(3)缺少合適的實(shí)訓(xùn)教學(xué)資源,任課教師對知識點(diǎn)以及知識點(diǎn)之間的關(guān)聯(lián)性沒有更詳細(xì)的講解,現(xiàn)有的實(shí)訓(xùn)教學(xué)資源難以與教學(xué)進(jìn)度、教學(xué)知識點(diǎn)完全融合,導(dǎo)致學(xué)生在實(shí)訓(xùn)中難以更好地運(yùn)用這些知識點(diǎn)。
實(shí)訓(xùn)對象為物聯(lián)網(wǎng)專業(yè)大一新生,學(xué)生采用Java語言開發(fā)出自己的第一個(gè)管理系統(tǒng) “模擬智能農(nóng)場”。實(shí)訓(xùn)要求學(xué)生開發(fā)的系統(tǒng)可以實(shí)現(xiàn)申請一個(gè)自己的農(nóng)場,并在農(nóng)場中創(chuàng)建多個(gè)大棚種植不同的莊稼,通過各種傳感器獲取大棚的溫濕度、光照等數(shù)據(jù),進(jìn)一步控制大棚照明系統(tǒng)。要求學(xué)生利用Java語言開發(fā)完成客戶端系統(tǒng),實(shí)現(xiàn)農(nóng)場的申請,農(nóng)場信息修改,添加大棚,修改大棚信息,刪除大棚,獲取大棚溫濕度及光敏值,控制大棚照明設(shè)備及攝像頭等功能。最終,通過這個(gè)實(shí)訓(xùn)使剛剛接觸物聯(lián)網(wǎng)的學(xué)生對物聯(lián)網(wǎng)有個(gè)直觀的認(rèn)識,對系統(tǒng)開發(fā)有大致的了解。
該實(shí)訓(xùn)設(shè)計(jì)由服務(wù)器、學(xué)生端兩大部分組成,系統(tǒng)架構(gòu)如圖1所示。服務(wù)器端由嵌入式系統(tǒng)樹莓派充當(dāng),樹莓派接入各類傳感器發(fā)布并啟動(dòng)“智能農(nóng)場”實(shí)例,服務(wù)器端為學(xué)生端提供了訪問接口,接收來自學(xué)生開發(fā)的客戶端發(fā)送過來的指令,完成對數(shù)據(jù)庫的增、刪、改、查操作,并返回相應(yīng)的采集信息到客戶端,該部分功能由教師完成,它是該實(shí)訓(xùn)的基礎(chǔ)??蛻舳说摹爸悄苻r(nóng)場管理系統(tǒng)”的開發(fā)是該實(shí)訓(xùn)的任務(wù),由學(xué)生獨(dú)立完成,學(xué)生采用WinBuilder來實(shí)現(xiàn)個(gè)性化GUI系統(tǒng)界面的設(shè)計(jì),并通過GUI界面獲取用戶指令及數(shù)據(jù),同時(shí)完成數(shù)據(jù)的封裝,最后通過http請求將JSON數(shù)據(jù)發(fā)送給服務(wù)器指定接口,進(jìn)而實(shí)現(xiàn)系統(tǒng)相應(yīng)功能。
圖1 智能農(nóng)場管理系統(tǒng)架構(gòu)圖
2.3.1 樹莓派
樹莓派(Raspberry Pi)是一款以SD卡為存儲媒體并基于ARM設(shè)計(jì)的微型電腦主板,可連接多個(gè)輸入與輸出設(shè)備,具備良好的硬件擴(kuò)展性;同時(shí)樹莓派操作系統(tǒng)Raspbian自帶Java編程環(huán)境,易于完成軟件的擴(kuò)展。該實(shí)訓(xùn)系統(tǒng)采用樹莓派充當(dāng)服務(wù)器,連接溫濕度傳感器、攝像頭等硬件設(shè)備,采用SSM框架,結(jié)合Mysql數(shù)據(jù)庫實(shí)現(xiàn)服務(wù)器端軟件部分的開發(fā)。
2.3.2 相關(guān)的傳感器及連接
(1)DHT11溫濕度模塊。含有已校準(zhǔn)數(shù)字信號輸出的溫濕度復(fù)合傳感器。
(2)KY-018光敏電阻。靈敏度高,響應(yīng)速度快,光譜特性及r值一致性好。
(3)C922 PRO攝像頭。動(dòng)態(tài)背景去除,具有強(qiáng)大的音頻和視頻質(zhì)量。
(4)LED交通信號燈模塊。
系統(tǒng)硬件層采用樹莓派與以上硬件的連接實(shí)現(xiàn)數(shù)據(jù)與指令的通信,軟件層實(shí)現(xiàn)實(shí)時(shí)獲取并返回溫濕度數(shù)據(jù)、光敏數(shù)據(jù)、攝像頭數(shù)據(jù)等,并實(shí)現(xiàn)交通信號燈的切換控制,模擬控制大棚的光照。各傳感器與樹莓派的連接如圖2所示。
圖2 各傳感器與樹莓派引腳接線圖
2.3.3 工作站及開發(fā)環(huán)境
工作站由一臺接入網(wǎng)絡(luò)的個(gè)人計(jì)算機(jī)充當(dāng),要求安裝JDK1.8的Java開發(fā)環(huán)境,WinBuilder插件實(shí)現(xiàn)圖形用戶界面的開發(fā),Chrome瀏覽器及Postman插件完成服務(wù)器接口的測試。學(xué)生端要求學(xué)生采用“類MVC”來進(jìn)行開發(fā),主要分為Model層、View層、Controller層。Model層主要定義與數(shù)據(jù)庫進(jìn)行數(shù)據(jù)交換的數(shù)據(jù)模型,View層主要定義GUI系統(tǒng)界面,Controller層主要負(fù)責(zé)封裝用戶數(shù)據(jù),并完成與接口的交互。
2.4.1 數(shù)據(jù)庫設(shè)計(jì)
本實(shí)訓(xùn)系統(tǒng)所使用的數(shù)據(jù)庫采用MySQL數(shù)據(jù)庫系統(tǒng)進(jìn)行開發(fā)。MySQL數(shù)據(jù)庫是以“C/S”架構(gòu)實(shí)現(xiàn)的,支持多線程、多用戶,使用簡單,管理方便,使用的持久化框架是MyBatis[3]。實(shí)訓(xùn)系統(tǒng)數(shù)據(jù)主要由兩部分組成,一部分?jǐn)?shù)據(jù)為學(xué)生創(chuàng)建的農(nóng)場及大棚的信息,另一部分為各個(gè)大棚的傳感器采集的數(shù)據(jù)。
表1 農(nóng)場信息表
表2 大棚信息表
表3 傳感器數(shù)據(jù)采集表
2.4.2 服務(wù)接口設(shè)計(jì)
服務(wù)器端采用SSM框架實(shí)現(xiàn)。服務(wù)器端的Controller層定義了實(shí)現(xiàn)各種功能的接口,客戶端按照接口要求將請求參數(shù)發(fā)送給Controller層,Controller層調(diào)用相應(yīng)接口對獲取參數(shù)進(jìn)行處理后傳遞給Service層,Service層通過Mapper.xml對數(shù)據(jù)庫進(jìn)行操作并實(shí)現(xiàn)相應(yīng)的功能,并以JSON格式將請求數(shù)據(jù)返回客戶端。
表4 接口規(guī)則
Controller層部分代碼:
@RequestMapping(value="/rest/environment/shed_id",method= RequestMethod.POST)
@ResponseBody
public List〈Environment〉EnvironmentByShed_id(@RequestBodyEnvironmentenv) {
System.out.println("查詢某農(nóng)舍號的環(huán)境信息");
List〈Environment〉 list = EnvironmentService.EnvironmentByShed_id(env);
System.out.println("農(nóng)場號查詢農(nóng)場信息:"+list);
if (list.size() <= 0) {
Environmenten = newEnvironment();
en.setShed_id("沒有查詢到" + env.getShed_id() + "的任何環(huán)境信息" );
list.add(en);
}
return list;
}
Service層部分代碼:
importagri.dao.EnvironmentDao;
importagri.pojo.Environment;
importagri.service.EnvironmentService;
public class EnvironmentServiceImpl implements EnvironmentService {
@Autowired
EnvironmentDaoEnvironmentDao;
@Override
public List〈Environment〉EnvironmentByShed_id(Environmentenv) {
returnEnvironmentDao.EnvironmentByShed_id(env);
}
}
DAO層部分代碼:
public class Environment {
int id;
String shed_id;
double temperature;
double humidity;
double illumination;
Date collecttime;
……
@Override
public String toString() {
return "Environment [id=" + id + ", shed_id=" + shed_id + ", temperature=" + temperature + ", humidity=" + humidity+ ", illumination=" + illumination + ", collecttime=" + collecttime + "]";
}}
服務(wù)端為了從樹莓派GPIO口獲取參數(shù)及發(fā)送通信指令,工程需要引入pi4j依賴庫,該庫是專門用來控制樹莓派GPIO口以及通信的Java庫。這里提供與GPIO口通信并控制LED光模塊的方法,模擬大棚的光照控制,其他模塊的通信可參考以下代碼。
MAVE代碼:
〈dependency〉
〈groupId〉com.pi4j〈/groupId〉
〈artifactId〉pi4j-core〈/artifactId〉
〈version〉1.1-SNAPSHOT〈/version〉
〈/dependency〉
通信代碼如下:
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.PinPullResistance;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.GpioPinDigitalInput;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;
public class GpioControl {
public static void main(String[] args) throws InterruptedException {
// GPIO控制器的創(chuàng)建
finalGpioControllergpio = GpioFactory.getInstance();
// 獲取并設(shè)置樹莓派上的36號針腳(GPIO.27)的電平狀態(tài)
finalGpioPinDigitalOutput pin = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_27, "LED", PinState.HIGH);
while(true){
//設(shè)置針腳狀態(tài)為高電平,即開啟光照
pin.high();
System.out.println("開燈");
Thread.sleep(500);
//設(shè)置針腳狀態(tài)為低電平,即光閉光照
pin.low();
System.out.println("關(guān)燈");
Thread.sleep(500);
}
}
}
2.5.1 身份驗(yàn)證
學(xué)生端通過學(xué)號向服務(wù)器端申請注冊用戶,服務(wù)器端將為每一個(gè)學(xué)生端分配唯一的UUID,并將此UUID存于數(shù)據(jù)庫的user表;學(xué)生端收到UUID后,以文本的形式保存于本地。當(dāng)用戶登錄系統(tǒng)時(shí),必須讀取本機(jī)的UUID連同用戶登錄信息發(fā)送至服務(wù)器,只有當(dāng)UUID、用戶名、密碼均與數(shù)據(jù)庫匹配時(shí),方可登錄系統(tǒng)。
2.5.2 數(shù)據(jù)交換
學(xué)生端與服務(wù)器端采用HTTP通信,數(shù)據(jù)采用可讀性強(qiáng)、解析簡易的JSON格式進(jìn)行交互。補(bǔ)充介紹JSON,學(xué)生端將請求參數(shù)封裝成model層定義好的Java對象,調(diào)用Gson的toJson()的方法,將Java對象轉(zhuǎn)為JSON格式數(shù)據(jù),發(fā)送給服務(wù)器相應(yīng)接口。而服務(wù)器端仍然將學(xué)生端請求的數(shù)據(jù)以JSON的格式返回給學(xué)生端,學(xué)生端則調(diào)用Gson的fromJson()的方法,將JSON格式數(shù)據(jù)轉(zhuǎn)為Java對象,最終將數(shù)據(jù)傳給相關(guān)的窗體并按設(shè)計(jì)要求呈現(xiàn)出來。
實(shí)訓(xùn)系統(tǒng)由多套樹莓派服務(wù)器連接傳感器構(gòu)成,具有部署簡單、可擴(kuò)展性高等特點(diǎn),在服務(wù)器上發(fā)布并啟動(dòng)好“智能農(nóng)場”實(shí)例后,實(shí)訓(xùn)系統(tǒng)搭建成功。當(dāng)服務(wù)器啟動(dòng)后,硬件設(shè)備及軟件資源均為學(xué)生開放,服務(wù)器隨時(shí)等待學(xué)生端的連接請求。本實(shí)訓(xùn)系統(tǒng)經(jīng)過兩輪測試,硬件系統(tǒng)部署簡單快捷,服務(wù)端實(shí)例支持200位學(xué)生同時(shí)在線使用,交互順暢。由于樹莓派及各類傳感器價(jià)格低廉,兼容性高,因此本實(shí)訓(xùn)系統(tǒng)具有很好的可擴(kuò)展性;同時(shí)由于系統(tǒng)只進(jìn)行簡單數(shù)據(jù)的交互,沒有提供大量數(shù)據(jù)的下載,因此大大降低了網(wǎng)絡(luò)及數(shù)據(jù)庫的壓力,也為系統(tǒng)支持高并發(fā)性奠定了很好的基礎(chǔ)。
在短短一周的實(shí)訓(xùn)中,學(xué)生基本可以獨(dú)立完成“智能農(nóng)場管理系統(tǒng)”的開發(fā),并對系統(tǒng)代碼進(jìn)行多項(xiàng)優(yōu)化,提高了代碼的重用性,從而提高了管理系統(tǒng)的性能。在實(shí)訓(xùn)平臺的支持下,學(xué)生能快速提高物聯(lián)網(wǎng)行業(yè)相關(guān)實(shí)踐能力,感受到物聯(lián)網(wǎng)的魅力,對物聯(lián)網(wǎng)應(yīng)用開發(fā)產(chǎn)生濃厚的興趣[4]。為了讓自己的系統(tǒng)更加完美,部分學(xué)生還上網(wǎng)自學(xué),個(gè)別引用了jfreechart-1.0.12.jar及jcommon-1.0.15.jar,更多樣化地展示了傳感器采集的實(shí)時(shí)數(shù)據(jù);有的還引用了javacsv.jar,實(shí)現(xiàn)將系統(tǒng)數(shù)據(jù)導(dǎo)出并保存為csv文件。
本文介紹了“Java程序設(shè)計(jì)”課程實(shí)訓(xùn)設(shè)計(jì)目的與意義,并基于樹莓派和Java語言設(shè)計(jì)了一個(gè)“模擬智能農(nóng)場”溫濕度遠(yuǎn)程實(shí)時(shí)測量服務(wù)端[5],采用的是HTTP協(xié)議的通信數(shù)據(jù)交互方式,接收與返回學(xué)生設(shè)計(jì)的客戶端傳遞參數(shù),實(shí)現(xiàn)實(shí)時(shí)返回溫濕度參數(shù),并接收客戶端發(fā)送光照的指令。該實(shí)訓(xùn)課程經(jīng)過了多個(gè)班級的實(shí)訓(xùn),整體實(shí)訓(xùn)效果好,學(xué)生軟件開發(fā)技術(shù)獲得了較為系統(tǒng)的提高。