whyerect
路人甲
路人甲
  • 注册日期2003-10-16
  • 发帖数2827
  • QQ
  • 铜币14枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1627回复:0

【转】基于Java的GPS接收机解析器 (1)

楼主#
更多 发布于:2004-02-20 02:15
[摘要]
  
    本文介绍了一个基于Java的GPS接收机解析器。这个Java类通过解析标准GPS接
收机的输出信号,能够为导航与控制系统提供GPS 时钟、经度、纬度、高程等一系
列信息。本类库使用标准Java语言编写,不需要任何第三方通讯类库(包括Sun 公
司的Java通讯API )的支持,稍加修改即可被广泛应用在各种便携式设备和嵌入式
系统中。
  
  
[介绍]
  
    全球定位系统(Global Position System,简称GPS )是由美国研制的导航、
授时和定位系统。该系统包括空中卫星、地面跟踪监测站、地面卫星数据注入站、
地面数据处理中心和数据通讯网络等部分。这个系统通过24颗地球同步卫星全天候
向地面发送授时和定位信号,其中高精度的信号仅供美国军方和北约盟军使用,普
通用户只能够接收和解析低经度的民用信号。如果对接收到的民用信号进行差分处
理,也可以得到精度很高的定位数据。目前一般的差分GPS 接收机都可以得到1 米
精度的定位数据,在欧美市场上已经出现了厘米级的差分GPS 接收机。普通用户只
需购买GPS 接收机,就可享受免费的导航、授时和定位服务。目前全球定位系统技
术在农业、林业、水利、交通、航空、测绘、安全防范、军事、电力、通讯、城市
管理等领域都有广泛应用。
  
    在上述所述应用领域中,GPS 接收机通常是某些便携式设备或者是嵌入式系统
的外接输入设备。一般的GPS 接收机均通过串行通讯口主动向主机发送数据,其通
讯参数为4800(波特率),8(数据位),1(停止位),0(奇偶校验位)。 由于
Java语言的平台无关性,很多基于便携式设备和嵌入式系统的应用程序都采用Java
语言进行开发。因此,一个基于标准Java语言的GPS 接收机解析器,无疑具有广泛
的应用前景。
  
    本文所介绍的基于Java的GPS 接收机解析器从标准GPS 接收机的GGA 输出信息
中解析标准时钟(Universal Time Coordinate, UTC)、纬度(Latitude)、经度
(Longitude )和高程(Altitude)等基本授时和定位信息。根据美国海军电子设
备标准接口规定,该信息包含标准时间、经纬度、高程等数据,每个数据之间用逗
号分隔,以一个回车符号结束,一般格式如下:
  
$--GGA,标准时间,纬度,南北,经度,东西,信号质量,卫星总数,水平精度,
高程,米,地理间隔,米,差分数据龄期,差分基准站ID*hh<CR><LF>
  
    $--GGA       -- GGA 信息标示符,根据接收机的不同,该标示符中的第二和
                    第三个字节会有所不同。
    标准时间     -- 一个浮点数,数据格式hhmmss.ss。
    纬度         -- 数据格式ddmm.mm,其中dd为度(整数,0 到90);mm.mm为
                    分(浮点数,0 到60)。
    南北         -- 南北半球标示符号,一个字节,S 为南半球,N 为北半球。
    经度         -- 数据格式dddmm.mm,其中ddd为度(整数,0到180);mm.mm
                    为分(浮点数,0 到60)。
    东西         -- 东西半球标示符号,一个字节,E 为东半球,W 为西半球。
    信号质量     -- 一个整数,从0 到8。
    卫星总数     -- 一个整数,从0 到24。
    水平精度     -- 一个浮点数。
    高程         -- 该地点在平均海平面以上的高程,一个浮点数。
    米           -- 长度单位标示符,一个字节,M。
    地理间隔     -- WGS-84地球椭球表面与平均海平面表面之间的距离,一个浮
                    点数。
    米           -- 长度单位标示符,一个字节,M。
    差分数据龄期 -- 上一次SC-104标定到当前的总秒数,一个浮点数。
    查分基准站ID -- 一个整数,从0000到1023。
  
    除了GGA 信息以外,一般的GPS 接收机还会输出其他类型的信息,例如AAM 信
息,ACK 信息,GNS 信息等等。本文所介绍的Java类库持续的监听GPS 接收机所在
的串行通讯口,从其输出信息中截获GGA 信息并进行解析,从而获得当前的时间和
定位信息。本类库包括三个Java模块以及一组测试数据:
  
    GPS 数据模块        -- 实时保存当前数据(GpsInfo.java)。
    GPS 接收机模块      -- 供外部程序调用(GpsReceiver.java)。
    数据接收与解析模块  -- 接收与解析GPS 信息(GpsParser.java)。
    测试模块            -- 功能测试与范例(TestGps.java)。
    测试数据            -- 一组实际GPS 测量数据(gps.dat)。
  
  
[GPS 数据模块]
  
    GPS 数据模块用来保存经过解析的授时与定位数据,同时提供访问与更新这些
数据的方法。数据接收与解析模块通过数据更新方法SetXyz()实时更新授时与定位
数据,用户应用程序通过数据访问方法GetXyz()使用授时与定位数据。考虑到可能
存在多个应用程序(线程)同时对GPS 数据进行修改的情况,所有的数据更新方法
都利用synchronized关键字和notifyAll() 方法实现了数据同步。在这个类中包含
的数据访问与更新方法比较多,部分列举如下:
  
    数据访问方法:
  
    public float GetTime()
    此方法返回当前标准时间,其返回值是一个浮点数,数据格式hhmmss.ss。
  
    public float GetLatitude()
    此方法返回当前纬度信息,数据格式ddmm.mm,其中dd为度(整数,0 到90);
    mm.mm为分(浮点数,0 到60)。
  
    public String GetNS()
    此方法返回南北半球标示符号,一个字节,S 为南半球,N 为北半球。
  
    public float GetLongitude()
    此方法返回当前经度信息,数据格式dddmm.mm,其中ddd为度(整数,0到180)
    ;mm.mm为分(浮点数,0 到60)。
  
    public String GetEW()
    此方法返回东西半球标示符号,一个字节,E 为东半球,W 为西半球。
  
    public float GetAltitude()
    此方法返回当前平均海平面以上高程,一个浮点数。
  
    数据更新方法:
  
    public void SetTime(float time)
    此方法更新当前标准时间,输入参数是一个浮点数,数据格式hhmmss.ss。
  
    public void SetLatitude(float latitude)
    此方法更新当前纬度信息,参数格式ddmm.mm,其中dd为度(整数,0 到90);
    mm.mm为分(浮点数,0 到60)。
  
    public void SetNS(String ns)
    此方法更新南北半球标示符号,一个字节,S 为南半球,N 为北半球。
  
    public void SetLongitude(float longitude)
    此方法更新当前经度信息,参数格式dddmm.mm,其中ddd为度(整数,0到180)
    ;mm.mm为分(浮点数,0 到60)。
  
    public void SetEW(String ew)
    此方法更新东西半球标示符号,一个字节,E 为东半球,W 为西半球。
  
    public void SetAltitude(float altitude)
    此方法更新当前平均海平面以上高程,输入参数是一个浮点数。
  
  
[GPS 接收机模块]
  
    GPS 接收接模块是本类库于其他应用程序的接口,本模块为其他应用程序提供
了连接、启动、切断GPS 接收机以及实时查询GPS 数据的方法。具体介绍如下:
  
    构造方法:
  
    public GpsReceiver(String GpsDevice, int Factor)
    public GpsReceiver(String GpsDevice, int Factor, boolean Record)
  
    其中:
  
    GpsDevice -- 即将使用的GPS 设备名称。如果GPS 接收机与计算机的串口COM1
                 或者是COM2相连接,则使用"COM1"或者是"COM2"作为设备名称,
                 以此类推;如果使用GPS 数据文件代替GPS 接收机的输入,则使
                 用该文件名作为设备名称,例如"gps.dat"。
  
    Factor    -- 如果使用GPS 数据文件代替GPS 接收机的输入,则可以利用此变
                 量制定一个加速系数,用于快速回放等功能。普通GPS 接收机每
                 秒钟更新一次数据,如果指定加速系数为5 ,则每秒钟回放5 秒
                 钟的实际测量数据。如果从GPS 接收机接收数据,则需要将该参
                 数设定为0 。
  
    Record    -- 如果使用了GPS 接收机,则可以通过将该参数设定为true来记录
                 GPS 接收机的输出数据。这些数据可以在程序测试中模拟GPS 接
                 收机的输入。
  
    操作方法:
  
    public void StartReceiver()
    此方法启动与GPS 接收机的连接,并且开始更新授时与定位数据。
  
    public void StopReceiver()
    此方法停止更新授时与定位数据,并且切断与GPS 接收机的连接。
  
    public GpsInfo GetGpsData()
    此方法返回当前的授时与定位数据。
  
    用户在使用本类库的时候,通常是先声明一个GpsReceiver 对象,然后利用上
述StartReceiver() 方法启动与GPS 接收机的连接并且开始接收与解析授时与定位
信息。当用户不再需要使用来自GPS 接收机的信息时,可以利用StopReceiver()方
法切断与GPS 接收机的连接并且释放所占用的系统资源。
  
  
[数据接收与解析模块]
  
    数据接收与解析模块是本类库的核心部分,这个模块负责监听GPS 设备输出的
信号,从中截获并解析GGA 信息,从而得到最新的授时与定位数据。该模块可以使
用实时和模拟两种方式工作,在实时模式下使用GPS 接收机作为输入设备,在模拟
模式下使用GPS 数据文件模拟GPS 接收机的输入。此外,数据接收与解析模块还能
够将GPS 接收机的输出数据保存到数据文件中供程序测试等使用。因此,数据接收
与解析模块的构造方法与GPS 接收机模块的构造方法是类似的。
  
    构造方法:
  
    public GpsParser(String GpsDevice, int Factor, boolean Record,
                     GpsInfo Info)
  
    其中:
  
    GpsDevice -- 即将使用的GPS 设备名称。如果GPS 接收机与计算机的串口COM1
                 或者是COM2相连接,则使用"COM1"或者是"COM2"作为设备名称,
                 以此类推;如果使用GPS 数据文件代替GPS 接收机的输入,则使
                 用该文件名作为设备名称,例如"gps.dat"。
  
    Factor    -- 如果使用GPS 数据文件代替GPS 接收机的输入,则可以利用此变
                 量制定一个加速系数,用于快速回放等功能。普通GPS 接收机每
                 秒钟更新一次数据,如果指定加速系数为5 ,则每秒钟回放5 秒
                 钟的实际测量数据。如果从GPS 接收机接收数据,则需要将该参
                 数设定为0 。
  
    Record    -- 如果使用了GPS 接收机,则可以通过将该参数设定为true来记录
                 GPS 接收机的输出数据。这些数据可以在程序测试中模拟GPS 接
                 收机的输入。
  
    Info      -- 用来保存授时与定位信息的GPS 数据对象。
  
    数据接收与解析模块的核心部分是一个线程,该线程被设计成一个内置类,这
样的设计是的外部程序能够通过该类自定义的start() 和stop()方法来启动和终止
该线程。在start() 方法中将一个名为DevOn 的逻辑变量设置为真并且启动数据接
收与解析线程,在stop()方法中则将DevOn 设置为假。数据接收与解析线程在运行
过程中不断监测DevOn 的值,如果DevOn 为假,则终止自身的执行。这个设计避免
了已经不鼓励使用的(deprecated)的stop()方法来强制终止线程的执行,从而保证
了该线程的安全终止。
  
    在数据接收与解析模块中把GPS 输入设备统一当作文件进行处理,因为大多数
的操作系统均将串行端口设置为系统保留文件,应用程序只需要对该文件进行读写
即可以通过串行端口与外界设备进行通讯。一个GPS 接收机解析器只需要从串行端
口实时读取数据而并不需要向GPS 接收机发送控制指令,使用标准文件输入函数来
读取GPS 接收机的输入信号,完全能够满足功能上的要求。这样的设计使得数据接
收与解析模块在实时模式和模拟模式下都能够使用同样的数据接收与解析程序,大
大的简化了整个程序的结构。此外,利用标准文件输入函数来对GPS 接收机进行操
作,避免了在类库中使用例如javax.comm等第三方通讯API ,大大的提高了本类库
的可移植性。
  
    由于GPS 接收机的每一条信息均以回车换行符号结束,在数据接收与解析模块
中使用了BufferedReader来读取GPS 接收机的输入信息。GPS 接收机的所有输入信
号,首先被系统存放在一个缓冲区里面。数据接收与解析模块利用readLine()方法
每次从该缓冲区里面读取一行数据,如果该行数据包含GGA 数据标示符,则利用该
数据解析授时与定位信息,反之则将该行数据舍弃继续读取下一行数据进行判断和
处理。
  
    由于普通GPS 接收机的数据更新频率为1 秒,在模拟模式下,数据接收与解析
模块每读取到一条GGA 数据就暂停1 秒钟,从而模拟GPS 接收机的输入。如果用户
指定了一个大于1 的加速系数,则根据加速系数计算暂停的时间,例如在加速系数
为5 的情况下暂停时间为200 毫秒,因此回放模拟的速度相当于实际速度的5 倍。
这个功能在耗时较长的程序测试中非常有用。考虑到一般应用程序所能够获得的时
钟信号的精度不是很高的缘故,我们不推荐使用大于50的加速系数。
  
    此外,数据接收与解析模块还提供了数据记录功能。利用数据记录功能能够将
实测到GPS 信号保存到一个数据文件里面供回放和测试使用。该功能自动产生一个
扩展名为.gps的数据文件,主文件名根据当时的系统时间自动生成,在通常的情况
下不会发生数据覆盖的问题。
  
  
[程序测试]
  
    在本类库中提供了一个测试程序和一组测试数据。利用这个程序和数据用户可
以使用实时和模拟两种方式对本类库进行测试,也可以在这个测试程序的基础上开
发自己的应用程序。测试环境包括多种版本的Windows 95/98/2000操作系统,四个
不同型号的差分GPS 接收机,两个常规Java虚拟机以及两个嵌入式Java虚拟机。测
试结果表明,本类库在以上不同条件的各种组合下均能够利用实时和模拟两种模式
正常工作。
  
  
[结论]
  
    本文设计和实现了一个基于Java的GPS 接收机解析器,全面测试结果表明,这
个GPS 接收机解析器能够实现如下功能:

  
    (1) 在实时模式下,从GPS 接收机接收与解析授时与定位数据。
  
    (2) 在模拟模式下,利用GPS 数据文件回放授时与定位数据。用户可以通过设
        定一个加速系数来改变数据回访的速度。
  
    (3) 能够将实测到GPS 信号保存到一个数据文件里面供回放和测试使用。
  
    (4) 本类库不需要任何第三方通讯类库(包括Sun 公司的Java通讯API )的支
        持,稍加修改即可被广泛应用在各种便携式设备和嵌入式系统中。

喜欢0 评分0
[face=隶书]
强极则辱 情深不寿
谦谦君子 温润如玉
[/face]
______________________________________
游客

返回顶部