天天看點

Palm 串行通訊GPS資料讀取的實作

作者:taling   來源:cnemb  

李魯群 ([email protected])

山東科技大學計算中心

2001 年 11 月

關于J2ME程式編寫的教程,各大網站均有介紹。但是J2ME教程的學習與實際應用畢竟還有一段距離。筆者從事J2ME一年多,已經成功地開發出基于無線網際網路palm與GPS、電子地圖結合個人導航系統。該系統利用Palm通過序列槽采集GPS資料,将GPS資料在電子地圖上定位,地圖資料的更新或空間屬性分析通過掌上電腦Palm的紅外口與手機相連,将資料請求發送到伺服器,伺服器接收請求後,将處理結果傳回給Palm使用者。以下介紹該系統中比較重要技術-

1引言目前,無論作為GIS 應用展現的自定位導航系統,大多數采用筆記本電腦或特别定做硬體,其顯示裝置的成本占去了整個系統成本的絕大部分,硬體平台的性能和成本制約這些高新技術的推廣和應用,個人消費這個巨大的市場一時還難以啟動,無法适應某些特殊行業(如:公安、消防、地名資料采集、野外探險導航等)的應用。随着計算機軟體硬體技術發展, WAP無線網際網路技術的成功應用、各種具有無線網際網路功能的移動智能終端(如:掌上電腦、WAP手機、Pager等)的出現,使得擁有這些智能終端的人們可以随時随地完成以前隻有辦公室或家裡才能完成的工作,人們可以"在移動中辦公",智能終端+無線網際網路已經成功地應用到人們生活的方方面面。與此同時,與這些智能終端配套的外圍硬體(如:GPS、GSM子產品等)的出現,進一步拓展了這些智能終端的應用領域。不言而喻,智能終端、GPS、無線網際網路等新技術在GIS領域的應用,勢必豐富GIS理論和拓展GIS應用領域。基于這些移動智能終端平台的GIS+GPS+無線網際網路一體化的研究,必然成為GIS領域中一個新興的重要研究領域。國際GIS界将GIS+GPS+無線網際網路一體化的研究稱為"移動GIS(Mobile GIS)"。

筆者從事該領域研究1年有餘,已經成功地開發出基于無線網際網路palm與GPS、電子地圖結合個人導航系統。該系統利用Palm通過序列槽采集GPS資料,将GPS資料在電子地圖上定位,地圖資料的更新或空間屬性分析通過掌上電腦Palm的紅外口與手機相連,将資料請求發送到伺服器,伺服器接收請求後,将處理結果傳回給Palm使用者。以下介紹該系統中比較重要技術-PDA(palm)GPS資料的讀取。

2 Palm掌上電腦介紹

2.1硬體介紹Palm是3Com公司的産品,其作業系統為PalmOS。Palm OS是一種32位的嵌入式作業系統。Palm提供了串行通訊接口和紅外線傳輸接口。利用它可以友善地與其他外部裝置通訊、傳輸資料。Palm OS與同步軟體(HotSync)結合可以使掌上電腦與PC機上的資訊實作同步,把桌上型電腦的功能擴充到了手掌上。Palm應用範圍相當廣泛,如:聯絡及工作表管理、電子郵件及網際網路通訊、銷售人員及組别自動化、等等。Palm外圍硬體也十分豐富,有數位相機,GPS接收器,數據機,GSM無線電話,數位音頻播放裝置,便攜鍵盤,語音記錄器,條碼掃描,無線尋呼接收器,探測儀等許多許多。

其中Palm與GPS結合的應用,可以不但可以做導航定位,還可以結合GPS做氣候的監測、地名調查等。

2.2開發工具選取目前針對Palm環境的開發工具主要有CodeWarror C、JAVA、AppForgePersonal(Basic)等等。由于Palm平台與微機硬體、軟體平台有着本質的差異,為了減少開發人員的教育訓練費用,提高開發速度,我們采用Java語言作為系統開發工具。Java技術由三個版本組成:.Micro 微版(J2ME)、. Standard标準版(J2SE)、 Enterprise企業版(J2EE)。其中J2ME主要針對消費電子類産品(如日常用品,如微小的智能卡,機頂盒,各種手持裝置等)和嵌入式裝置的開發工具和運作環境。J2ME具有很多java技術特性,它可以在各種支援java的裝置上運作、代碼短小、安全性好、 用J2ME實作的應用可以友善地更新到J2SE, J2EE。

Palm 串行通訊GPS資料讀取的實作

圖1 Java技術結構圖

3 PDA與GPS通訊的NMEA協定GPS即全球定位系統,它主要有三大組成部分,即空間星座部分、地面監控部分和使用者裝置部分。其中GPS空間星座部分、地面監控部分均為美國所控制;GPS的使用者裝置主要由接收機硬體和處理軟體組成。使用者通過使用者裝置接收GPS衛星信号,經信号處理而獲得使用者位置、速度等資訊,最終實作利用GPS進行導航和定位的目的。目前許多GPS廠商遵循NMEA0183協定針對PDA掌上電腦開發許多導航型GPS。這些GPS提供串行通訊接口,串行通訊參數為:

<CODE>波特律=4800 資料位=8位 停止位=1位 無奇偶校驗</CODE>

GPS與掌上電腦通訊時,通過序列槽每秒鐘發送10條資料。實際導航應用讀取GPS的空間定位資料時,我們可以根據需要每隔幾秒鐘更新一次經緯度和時間資料。而更頻繁的資料更新就沒有必要了,而且會白白浪費Palm掌上裝置有限的電池。我們不需要了解NMEA 0183通訊協定的全部資訊,僅需要從中挑選出我們需要的那部分定位資料。其餘的資訊我們忽略掉。 

如果此時和衛星的通訊正常的話,可以接收到的資料格式樣如下:<CODE>$GPRMC,204700,A,3403.868,N,11709.432,W,001.9,336.9,170698,013.6,E*6E</CODE>

資料說明如下:$GPRMC 代表GPS推薦的最短資料204700 UTC_TIME 24小時制的标準時間,按照小時/分鐘/秒的格式A A 或者 V A表示資料"OK",V表示一個警告3403.868 LAT 緯度值,精确到小數點前4位,後3位N LAT_DIR N表示北緯,S表示南緯11709.432 LON 經度值,精确到小數點前5位,後3位W LON_DIR W表示西經,E表示東經

如果目前沒有和衛星取得聯系,那麼字元串的格式為:  $GPRMC,UTC_TIME,V,...  下面是一個例子:  $GPRMC,204149,V,,,,,,,170698,,*3A

4 J2ME 串行讀寫GPS資料的實作Palm的J2ME對GPS序列槽資料讀寫可以采用兩種方式,一種是采用對序列槽采用原始單個位元組資料讀寫,另一種采用緩沖區位元組數組讀寫。(注意:J2ME為Palm提供的KVM的1.0版本不支援串行通訊速率4800波特,GPS串行通訊速率為4800波特,必須采用CLDC1.02以上版本或KAWT提供的Color KVM)

在實際Palm對序列槽GPS資料讀寫實驗中,我們發現前者效率低、讀寫速度慢,平均每3-7秒才能讀取到所需的GPS定位資料,而後者讀寫速度快,可以每秒讀到所需的GPS資料,沒有GPS資料丢失。是以,在此僅介紹後一種GPS的讀取方式。

J2ME和Palm Profile中已經提供了對序列槽讀寫的類Protocol,通過構造Protocol執行個體serialPort,利用serialPort.openInputStream()獲得輸入流InputStream,利用InputStream将GPS序列槽資料讀入到一個緩沖區位元組數組,将位元組數組轉化為字元串,判斷GPS坐标标志"$GPRMC",截取坐标資料。

Palm 串行通訊GPS資料讀取的實作

圖2 Palm對GPS讀取UML協作圖

見源程式PrintMe.java

<CODE>package earth_survy;

import java.util.*;

import javax.microedition.io.*;

import java.io.*;

import com.sun.kjava.*;

import com.sun.cldc.io.palm.comm.*;

public class GetGpsData extends Spotlet {

        static Graphics g=Graphics.getGraphics();

        static Protocol serialPort = new Protocol();

 static String url="0;baudrate=4800;bitsperchar=8;stopbits=1;parity=none";

        static InputStream is;

// Open the serial Port for Gps Data Input

public boolean openPort(){

      try {

           serialPort.open(url,1, true);

           is=serialPort.openInputStream();

          return true;

      }

      catch (Exception ex) {

          return false;

      }

 }



 file://Close the serial Port



 public boolean closePort(){

   try {

         is.close();

         serialPort.close();

         return true;

   }

   catch (Exception ex) {

         return false;

   }

 }

 file://Read the GPS data

 file://Mark is "$GPRMC

 file://rdLen is the buffer length

 file://getlen is the return lenth;



 public String readGpsData(String mark,int rdlen,int getlen){

    byte[] readBuffer = new byte[rdlen];

    String rawGpsData;

    String Gprmc;



 while (true){

    try{

         file://Read raw GPS data into a buffer;

          is.read(readBuffer);

          rawGpsData=new String(readBuffer);

         file://determin the positon of  the Mark==> $GPRMC;

         int pos=rawGpsData.indexOf(mark);

         if (pos>-1)

            {

               Gprmc=rawGpsData.substring(pos);

               if (Gprmc.length()>getlen)

                {

                  Gprmc=Gprmc.substring(0,getlen);

                 break;

                 }

                }

       }

    catch(Exception e){

               }

}

return Gprmc;

//end loop

}//end method

}</CODE>      
參考文獻
  • 龔健雅.整體SIS的資料組織與處理方法.武漢:武漢測繪科技大學出版社,1993
  • http://www.palmheart.net/document/
  • C.Thomas Wu.An Introduction to Object-Oriented Programming with Java.2001
  • 蔣慧等.UML設計核心技術.北京:希望電子出版社.2001
關于作者 李魯群,男,遼甯省沈陽市人,博士生,進階工程師,從事計算機網絡應用、Web GIS、Mobile GIS研究。Email: [email protected]

繼續閱讀