基于J2ME的防汛信息系統(tǒng)的研究
一、 引言
在雨季,汛情瞬息萬(wàn)變,防汛管理與決策對(duì)時(shí)效性要求非常高。如果防汛人員不能及時(shí)掌握最新的防汛信息,將會(huì)給防汛工作帶來(lái)極大的困難,甚至災(zāi)難性的后果。因此,非常有必要建立完善的防汛信息系統(tǒng)。但是防汛工作往往覆蓋地域廣大,涉及人員眾多,而且工作環(huán)境復(fù)雜,這都會(huì)影響信息及時(shí)準(zhǔn)確的傳達(dá)。移動(dòng)通信覆蓋范圍廣,具有三A(任何時(shí)間、任何地點(diǎn)、任何方式)的特點(diǎn),正好可以滿足防汛工作的需要。手機(jī)上網(wǎng)主要通過(guò)兩種方式:WAP和J2ME。WAP只能訪問(wèn)使用WML語(yǔ)言編寫的網(wǎng)頁(yè),功能受到很多限制;J2ME可以和J2EE無(wú)縫結(jié)合,并且J2ME程序界面友好,輸入輸出方便,安全性高。所以本文采用J2ME和J2EE技術(shù),開發(fā)了一套防汛信息系統(tǒng)來(lái)提高防汛工作的效率。
二、J2ME
J2ME是Sun公司專門為開發(fā)小型的資源受限的消費(fèi)性電子設(shè)備的應(yīng)用程序所提供的Java版本,被廣泛應(yīng)用于手機(jī)、PDA和電視機(jī)頂盒等小型資源受限設(shè)備。J2ME實(shí)際上是一系列規(guī)范的集合(JSR)。因?yàn)樗婕暗降脑O(shè)備在硬件配置和性能上千差萬(wàn)別,為了方便應(yīng)用程序的開發(fā),J2ME體系結(jié)構(gòu)采用模塊化、可擴(kuò)展的設(shè)計(jì),主要包括了4層:主機(jī)操作系統(tǒng)、配置、簡(jiǎn)表和廠商可選包。不同層次的規(guī)范相互協(xié)作來(lái)提供一個(gè)完整的移動(dòng)Java平臺(tái)。
J2ME的優(yōu)點(diǎn)包括:
(1) 編寫一次,到處運(yùn)行。J2ME程序具有良好的跨平臺(tái)性和可移植性。
(2)與J2EE無(wú)縫結(jié)合。
(3)良好的安全性
J2EE是一種利用Java平臺(tái)來(lái)簡(jiǎn)化企業(yè)解決方案的開發(fā)、部署和管理相關(guān)的復(fù)雜問(wèn)題的體系結(jié)構(gòu),它規(guī)范了分布式體系的應(yīng)用開發(fā)。J2EE也采用了分層結(jié)構(gòu),典型的J2EE結(jié)構(gòu)的應(yīng)用程序包括四層:客戶層、表示邏輯層(Web層)、業(yè)務(wù)邏輯層和企業(yè)信息系統(tǒng)層。每一層上定義了相應(yīng)的組件和容器。各層相互獨(dú)立,通過(guò)標(biāo)準(zhǔn)的JavaAPI來(lái)調(diào)用和傳遞參數(shù)。J2EE作為一個(gè)廣泛而通用的標(biāo)準(zhǔn),大大簡(jiǎn)化了應(yīng)用開發(fā)和移植的過(guò)程。
三、防汛信息系統(tǒng)
本系統(tǒng)采用WebLogic做為應(yīng)用服務(wù)器,數(shù)據(jù)庫(kù)管理系統(tǒng)為MS Sqlserver2000。整個(gè)系統(tǒng)主要包括四個(gè)模塊:用戶登錄模塊、水情查詢模塊、天氣查詢模塊、用戶定制模塊。
(1)用戶登錄模塊
該模塊實(shí)現(xiàn)用戶身份驗(yàn)證功能,只有合法用戶才能登陸系統(tǒng)來(lái)獲得數(shù)據(jù)信息。手機(jī)每次上網(wǎng)的IP地址都是動(dòng)態(tài)分配的,用戶在登錄時(shí)會(huì)向數(shù)據(jù)庫(kù)中寫入本次登錄的IP地址,用于用戶定制模塊中服務(wù)器通過(guò)Socket主動(dòng)向客戶端發(fā)送信息。
(2)水情更新和查詢模塊
這個(gè)模塊是是防汛信息系統(tǒng)的重點(diǎn)。只有保持各水文測(cè)站數(shù)據(jù)的實(shí)時(shí)更新并保證數(shù)據(jù)的準(zhǔn)確可靠,才能保證防汛工作的正常進(jìn)行。通過(guò)手機(jī)登錄系統(tǒng)后,各水文測(cè)站可以更新數(shù)據(jù),其它用戶可以查詢各水文測(cè)站當(dāng)前的和歷史的水情數(shù)據(jù)。因?yàn)榭紤]到手機(jī)輸入數(shù)據(jù)比較困難,服務(wù)器還應(yīng)該提供通過(guò)Web方式網(wǎng)上更新數(shù)據(jù)的功能。
(3)天氣更新和查詢模塊
天氣情況也是防汛工作要考慮的一個(gè)重要因素。用戶可以通過(guò)手機(jī)查詢各主要城市的天氣預(yù)報(bào)及歷史同期天氣,以便對(duì)天氣情況做出正確的判斷。
(4)用戶定制模塊
在汛期,水情瞬息萬(wàn)變,防汛信息系統(tǒng)應(yīng)該具有在出現(xiàn)緊急情況的時(shí)候能夠主動(dòng)通知相關(guān)責(zé)任人的功能。用戶定制模塊可以讓用戶根據(jù)自己情況定制所需的信息,系統(tǒng)會(huì)在定制信息出現(xiàn)的時(shí)候自動(dòng)向用戶手機(jī)發(fā)送信息來(lái)提醒用戶及時(shí)處理。
客戶端和服務(wù)器端的連接如圖2所示:
在本系統(tǒng)中,客戶端和服務(wù)器之間主要通過(guò)HTTP協(xié)議進(jìn)行通信,工作流程如下:
(1) 用戶啟動(dòng)手機(jī)上的MIDlet進(jìn)入登錄界面,輸入用戶名和密碼進(jìn)行登錄。MIDlet用Connector類的open方法建立一個(gè)到服務(wù)器端的連接,并把這個(gè)連接強(qiáng)制轉(zhuǎn)換成為HttpConnection類型。
(2) 客戶端用HttpConnection類的openInputStream方法和openOutputStream方法來(lái)返回輸入輸出流并通過(guò)它們來(lái)發(fā)送請(qǐng)求和接收響應(yīng)信息。
(3) 服務(wù)器端接收到客戶端的連接請(qǐng)求后,把它封裝成一個(gè)HttpServletRequest對(duì)象,調(diào)用相應(yīng)的Servlet,通過(guò)EJB或JavaBean訪問(wèn)數(shù)據(jù)庫(kù),并把處理結(jié)果返回客戶端的MIDlet。
(4) 客戶端MIDlet使用輸入流接收服務(wù)器端返回的結(jié)果,根據(jù)返回的是”station”(測(cè)站)、”person”(普通用戶)還是”none”(無(wú)此用戶)而在屏幕上呈現(xiàn)不同的界面。
(5) 登錄成功后,MIDlet重新建立HttpConnection來(lái)進(jìn)行數(shù)據(jù)更新或查詢操作。
四、技術(shù)難點(diǎn)和解決方案
4.1 用戶定制信息的接收
用戶定制的信息有兩種發(fā)送的方式:
(1)定時(shí)發(fā)送。用于把用戶定制的日常信息每天定時(shí)發(fā)送給用戶。
(2)緊急發(fā)送。當(dāng)出現(xiàn)緊急汛情時(shí)即時(shí)把信息發(fā)送到相關(guān)的責(zé)任人。
在客戶端,對(duì)相關(guān)信息的接收是通過(guò)J2ME的PUSH注冊(cè)功能來(lái)實(shí)現(xiàn)的。Push技術(shù)是一種能夠使得Midlet應(yīng)用程序不需要用戶的操作而自行啟動(dòng)運(yùn)行的機(jī)制。在通常的網(wǎng)絡(luò)連接中,是客戶端主動(dòng)去連接服務(wù)器,服務(wù)器接受請(qǐng)求并把處理結(jié)果返回客戶端。而Push技術(shù)不同,它不需要應(yīng)用程序通過(guò)“拉(pull)”的方式通過(guò)網(wǎng)絡(luò)取得數(shù)據(jù),客戶端需要的數(shù)據(jù)會(huì)被主動(dòng)“推(push)”向客戶端的移動(dòng)設(shè)備。當(dāng)移動(dòng)設(shè)備接收到信息時(shí),相關(guān)的Midlet會(huì)被激活并開始運(yùn)行,處理發(fā)送過(guò)來(lái)的數(shù)據(jù)。
服務(wù)器端使用Socket可以自動(dòng)向與其相聯(lián)的客戶端發(fā)送數(shù)據(jù),這就為Push技術(shù)提供了保證。先由客戶端的 MIDlet注冊(cè)好服務(wù)類型,地址,端口號(hào),當(dāng)服務(wù)器端檢測(cè)到有緊急情況發(fā)生或用戶定制的情況發(fā)生時(shí),就會(huì)將相應(yīng)的消息通過(guò)Socket發(fā)送到客戶端,客戶端會(huì)啟動(dòng)相應(yīng)的MIDlet對(duì)該消息進(jìn)行相應(yīng)處理。
J2ME平臺(tái)從MIDP2.0開始增加了對(duì)Push注冊(cè)的支持。Push機(jī)制可以通過(guò)如下兩種方式激活Midlet:一種是基于接入的網(wǎng)絡(luò)連接的,當(dāng)客戶端接收到網(wǎng)絡(luò)Push來(lái)的信息后就自動(dòng)啟動(dòng)Midlet運(yùn)行;另一種是基于計(jì)時(shí)器的警告通知,當(dāng)。Push 注冊(cè)機(jī)制可以使MIDlet 自動(dòng)運(yùn)行,運(yùn)行方式有兩種:一種基于定時(shí)技術(shù),當(dāng)?shù)竭_(dá)特定時(shí)間,程序就會(huì)運(yùn)行;另一種基于網(wǎng)絡(luò),當(dāng)設(shè)備受到網(wǎng)絡(luò)推送的信息時(shí),可以啟動(dòng)程序運(yùn)行。本系統(tǒng)采用第一種方式來(lái)實(shí)現(xiàn)定制信息的發(fā)送。
要在客戶端使用Push技術(shù),必須事先進(jìn)行Push注冊(cè)。Push注冊(cè)有兩個(gè)方法:靜態(tài)注冊(cè)和動(dòng)態(tài)注冊(cè)。靜態(tài)注冊(cè)需要將 Push注冊(cè)信息添加到JAD文件中,在Midlet Suite安裝時(shí)完成注冊(cè)。靜態(tài)注冊(cè)的缺點(diǎn)是必須通過(guò)Midlet Suite安裝過(guò)程來(lái)實(shí)現(xiàn),一但安裝好后就無(wú)法添加新的注冊(cè),同時(shí)如果要取消Push注冊(cè),也必須卸載Midlet Suite。動(dòng)態(tài)注冊(cè)是MIDlet通過(guò)Push Registry接口API來(lái)實(shí)現(xiàn)的,可以在程序運(yùn)行時(shí)添加或取消Push注冊(cè),增加了靈活性。本文采用了動(dòng)態(tài)注冊(cè)的方法。
在動(dòng)態(tài)注冊(cè)時(shí)MIDlet需要告訴AMS它所要連接的服務(wù)器的IP地址、端口號(hào)和要啟動(dòng)的MIDlet類,實(shí)現(xiàn)代碼如下:
…
String midletClassName=”com.water.PushInfo”;//這是自動(dòng)運(yùn)行處理數(shù)據(jù)的Midlet
String ConnectionURL =”socket://:6789”;
String AllowedSender=”*”;//*表示允許接收任意地址發(fā)送的信息
PushRegistry.registerConnection(midletClassName, ConnectionURL, AllowedSender);
…..
這樣,當(dāng)AMS監(jiān)測(cè)到端口號(hào)為6789的Socket服務(wù)器發(fā)送來(lái)的數(shù)據(jù)后,就會(huì)啟動(dòng)com.water包下的PushInfo來(lái)處理這些數(shù)據(jù)。
取消注冊(cè)可以使用PushRegistry.unregisterConnection(ConnectionURL)來(lái)完成。
4.2 數(shù)據(jù)庫(kù)連接池技術(shù)
本例采用了數(shù)據(jù)庫(kù)連接池技術(shù)。傳統(tǒng)的Web應(yīng)用程序進(jìn)行數(shù)據(jù)庫(kù)操作時(shí)一般要經(jīng)過(guò)(1)建立數(shù)據(jù)庫(kù)連接;(2)進(jìn)行數(shù)據(jù)庫(kù)的增加、刪除、修改、查詢操作;(3)斷開數(shù)據(jù)庫(kù)連接這三個(gè)步驟。這種方式有一個(gè)重要的缺點(diǎn):要為每個(gè)Web請(qǐng)求建立一次數(shù)據(jù)庫(kù)連接并對(duì)其進(jìn)行管理,這些操作都會(huì)耗費(fèi)大量的時(shí)間和資源。數(shù)據(jù)庫(kù)連接池的基本思想是預(yù)先建立一些連接,放置在內(nèi)存對(duì)象中以備使用。當(dāng)程序中需要建立數(shù)據(jù)庫(kù)連接時(shí),只需從內(nèi)存中取出一個(gè)來(lái)用而不用重新建一個(gè)連接。同樣,使用完畢后,只需將此連接放回到內(nèi)存中即可,而連接的建立和斷開都由連接池自身來(lái)管理。Weblogic服務(wù)器提供了圖形化的界面來(lái)建立數(shù)據(jù)庫(kù)連接池,設(shè)置比較簡(jiǎn)單。建立好數(shù)據(jù)庫(kù)連接池和數(shù)據(jù)源后,就可以在Servlet中通過(guò)JavaBean或EJB來(lái)調(diào)用,代碼如下:
…
Hashtable ht = new Hashtable();
ht.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
ht.put(Context.PROVIDER_URL,"t3://localhost:7001");
try
{
Context ctx=new InitialContext(ht);
DataSource ds=(DataSource)ctx.lookup("WaterJNDI");
Connection con=ds.getConnection();
…
}catch(Exception e){
…
}
…
五、結(jié)束語(yǔ)
本系統(tǒng)為各級(jí)防汛部門有關(guān)人員提供防汛信息(包括歷史、實(shí)時(shí)水雨情、工情、旱情、災(zāi)情等)的查詢服務(wù),并在有緊急情況時(shí)主動(dòng)通知相關(guān)責(zé)任人,從而使防汛人員可以隨時(shí)隨地掌握最新的防汛信息,提高了防汛工作的效率。
隨著移動(dòng)通信技術(shù)的發(fā)展和3G技術(shù)的即將實(shí)施,無(wú)線網(wǎng)絡(luò)具有良好的發(fā)展前途,使用手機(jī)、PAD等小型設(shè)備與 Internet進(jìn)行網(wǎng)絡(luò)通信也必將成為未來(lái)發(fā)展的方向之一。隨著J2ME技術(shù)的不斷完善和小型設(shè)備功能的更加成熟,支持移動(dòng)商務(wù)和移動(dòng)通信的應(yīng)用程序一定會(huì)得到更快、更大的發(fā)展和廣泛應(yīng)用。
六、創(chuàng)新點(diǎn)
本文作者創(chuàng)新點(diǎn)是把J2ME應(yīng)用于防汛工程,并且應(yīng)用了MIDP2.0中的Push注冊(cè)來(lái)主動(dòng)向客戶端發(fā)送消息。在服務(wù)器端使用了數(shù)據(jù)庫(kù)連接池技術(shù),提高了訪問(wèn)數(shù)據(jù)庫(kù)的效率。
本系統(tǒng)能有效的提高防汛工作的效率,使得緊急情況也能得到及時(shí)處理,從而大大降低了防汛工作的失誤。本系統(tǒng)預(yù)估計(jì)經(jīng)濟(jì)效益為50萬(wàn)元。
參考文獻(xiàn)
[1] 吳敏,劉萍.基于J2ME和J2EE的手機(jī)銀行設(shè)計(jì)與實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,2006.22:294-296.
[2] 王莉,潘正運(yùn),劉偉.一種基于J2ME的移動(dòng)警務(wù)應(yīng)用系統(tǒng)的新型設(shè)計(jì)[J].計(jì)算機(jī)工程,2006.7:283-285.
[3] 方安平,李樹析. MIDP2.0在移動(dòng)郵件中的研究與應(yīng)用 [J].武漢理工大學(xué)學(xué)報(bào)·信息與管理工程版,2006.6:52-55
[4] 張璞,文登敏.基于J2ME和J2EE的移動(dòng)電子商務(wù)系統(tǒng)研究[J].成都信息工程學(xué)院.2006.8:505-507
[5] 郝玉龍,李向前.J2ME移動(dòng)應(yīng)用開發(fā)[M].清華大學(xué)出版社·北京交通大學(xué)出版社,2006