摘要:随着手持设备的飞速发展,嵌入式GIS(地理信息系统)的应用日益广泛,而嵌入式Linux由于其开放性、廉价性、健壮性和安全性,越来越广泛地成为嵌入式GIS的主要开发平台。针对基于嵌入式Linux的嵌入式GIS的实现进行了整体上的设计,并介绍了GPS(全球定位系统)通信代理和嵌入式GIS人机交互应用程序。
关键词:嵌入式GIS; GPS; NMEA0183协议; Qte/Qtop ia
引 言
嵌入式GIS(地理信息系统)是指GIS在嵌入式设备例如掌上电脑、手机等手持设备上的应用。可为GIS提供一种移动式的应用,具备GIS的基本功能,例如电子地图浏览、空间位置信息编辑等,若设备中包含GPS(全球定位系统)模块或外接GPS设备,则还可提供GPS定位、测距、测速等功能。
目前,大部分嵌入式GIS系统都是以Windows CE为基础进行开发的,这是由于W indows系统在PC市场占有的绝对优势和巨大影响力造成的。但其在开发成本、软件自主权以及安全性方面都存在一些问题。而Linux由于其自身的开放性、廉价性、健壮性、实时性和安全性已经成为越来越多的嵌入式应用开发的首要平台。在嵌入式L inux环境下实现GIS也相应地成为嵌入式GIS发展的一个重要方面。但是,国内外目前基于L inux的嵌入式GIS的研究相对滞后,因此,研究基于嵌入式Linux的嵌入式GIS开发对于实现具有自主知识产权的高性能、高安全性的嵌入式GIS具有重要意义。
实现方案
本文介绍的基于嵌入式L inux的嵌入式GIS是运行于安装有Qtop ia环境的手持式设备的应用。本文设计的嵌入式GIS应用可用于两种情况:一种是手持设备上安装有GPS模块;另一种是手持设备上没有安装GPS模块,而是通过网络获取GPS信息。
图1所示为嵌入式GIS应用程序的功能结构示意图。它主要有两部分组成:一部分为与用户进行交互的应用程序部分,另一部分为与GPS设备进行通信的后台代理程序,此代理程序需与GPS设备处于同一物理位置,与GPS设备通过串口进行通信,它与GIS应用程序可位于同一设备中,也可位于不同的位置,通过网络进行通信。
GPS通信代理程序的实现
GPS设备与嵌入式平台之间进行数据传送,大多采用异步串行传送方式, GPS作为DTE (数字终端设备)与嵌入式平台之间通过RS-232串行通信接口进行数据交换。因此,与GPS的数据通信实际上即完成了Linux下的串口编程。两者之间的通信协议有很多种选择,而目前绝大多数GPS生产厂商都采用的是NMEA0183通信协议。
NMEA0183通信协议
NMEA0183协议是GPS串口通信的通信协议,在完成GPS通信时,并不需要了解协议的全部内容,只需了解通信基本参数和所需信息的语句格式,从中选取有用信息,而忽略其他信息。
1)NMEA0183的基本通信参数
符合NMEA0183标准的通信参数为: 波特率=4 800 bit/ s,数据位= 8,奇偶校验:无,停止位= 1位。
2)NMEA0183的报文格式
NMEA 0183 协议报文的语句串(ASCII字符) 格式全部信息见图2。
具体内容为:
$:串头,表示串开始,所有GPS语句的起始标志;
AA:识别符;
XXX:语句名;
ddd.ddd:数据字段,字母或数字;
* :星号,串尾;
hh: $与3 之间所有字符代码的校验和;
在实际的GPS应用中,并不会用到NMEA的全部信息,而是根据具体的需要,从中选取有用的信息,忽略其余的信息内容。
例如: $ GPRMC, 152252, A, 2513. 3072, N,10346. 3723, E, 0. 0, 230. 4, 250503, 1. 3 ,W,A , *02
其中: $ GPRMC为串头,表示此语句为定位语句;“*”之前的内容为数据字段;“152252”为UTC (协调世界时间) 24小时制的标准时间,格式为“时时/分分/秒秒”;“A”表示信号接收状态,“A”表示接收正常,也可能为“V”,则表示一个警告,与卫星通信不正常;“2513.
GPS设备与代理程序的串口通信
嵌入式linux操作系统使用POSIX的termios接口来控制串口的行为。在系统的头文件< termios. h >中, POSIX. 1定义了一个查询和操纵终端的标准接口termios,它包含了终端特性的完整描述。定义如下:struct termios{
unsigned short c_iflag; / /输入模式标志
unsigned short c_oflag; / /输出模式标志
unsigned short c_cflag; / /控制模式标志
unsigned short c_lflag; / /本地模式标志
unsigned char c_line; / /控制协议
unsigned char c_cc[NCCS] / /控制字符}
实现与GPS设备的通信,实质上就是完成一个串口编程,对串口的属性进行正确的配置,从接收到的GPS输出数据中选取有用的信息进行处理的过程。在L inux操作系统中,所有的设备都是被当做文件来进行操作的,所有的设备以设备文件的形式存储在目录/dev/下。对串口进行数据采集的过程简单描述如下:
int fd = open ( " /dev/ ttyS0" ,O_RDWR |O_NOCTTY )
/ /打开串口设备,O_RDWR表示以读写方式打开,O_NOCTTY表示串口不是控制终端
struct termios old_op tions, new_op tions
/ /old_op tions用于保存原有的设备工作方式, new_op tions用于设置新的设备工作方式
tcgetattr ( fd, &old_op tions) / /获取当前设备方式(略) / /设置结构体new_op tions中的c_iflag、c_oflag、c_cflag、
c_lflag和c_cc,再用cfsetispeed ( )和cfsetospeed ( )函数设置波特率
tcsetattr ( fd, TCSANOW, &new_op tions) ; / /设置新的设备方式
/ /完成终端的设置后,处理串口设备的GPS数据输入,从中选取有用的信息
/ /例如需选取GPS输出数据中的定位信息
if ( ( buf[O ] = = $) &&( buf [ 3 ] = = R) &&( buf [ 4 ] = =M)
&&( buf[ 5 ] = =C) )
/ /检查语句串头,若为RMC则表示此语句为定位语句
{/ /检验校验和,如果校验和正确则继续,否则返回if ( buf[ i ] = , ) { / /提取并分解各逗号间的数据}
}
通过以上代码就可把GPS输出数据中的有用信息提取出来,这些取出的数据,可进行一些处理例如格式变换或直接传送给嵌入式平台的GIS应用程序。