第一种方案采用支持3G网络的EVDO模块MC8630,结合以ARM9为内核的AT91SAM9260芯片进行位置信息回传,该方案具有传输迅速,可扩展性强的特点,可以为以后传递身体信息,环境信息提供扩展空间。第二种方案采用支持2G网络的GSM模块GTM900,结合以Cortex-M3为内核的LPC1766芯片进行定位信息传送,该方案结合良好的软件设计,具有成本低,性能稳定的特性。经过实验检测,这两种方案都能很好的解决家庭监护中老人的实时定位问题。
1 BDM100模块设计
BDM100模块是一款双系统高性能的GNSS模块,能够同时支持BD2 B1,GPS L1两个频点,很好适应低成本,低功耗领域,可以进行大规模的北斗系统集成应用。模块的结构框图如下图所示:
图1 BDM100模块结构框图
从芯片结构框图中可以看到,BDM100支持UART,SPI,1PPS,I2C等多种接口。其可以通过相关器,FFT和匹配滤波器混合应用以及算法优化,在各种复杂环境下保持出色的捕捉跟踪能力和快速TTFF功能。采用多路径抑制技术和高质量的原始观测数据,可以保证很好的授时,导航精度。BDM100芯片可以采用多系统混合定位的方式,这样可以提高定位精准度,因为本文采用北斗定位系统,所以只选取其北斗定位功能。另外,BDM100芯片有3个串口,用户可以自行设置其波特率,默认波特率是9600,并且可以通过串口3进行固件升级。该模块的定位精度可达到3米,测速精度可以达到0.1米/秒。本系统采用的外围应用电路图如下:
图2 BDM100模块外围电路图
本系统的两个方案均使用串口1与MCU通讯,串口3预留出接口以便日后升级。特别注意:模块正常启动时,在复位信号有效期内,保持串口3输入引脚电平恒定为高,否则模块将进入升级固件模式,无法正常启动。模块复位信号低电平有效,且持续时间不得小于2毫秒;该模块配备的天线必须为+2.85V有源天线,天线连接至模块的GNSS_ANT引脚,有源天线内部集成LNA(低噪声放大器),可以直接连接到模块GNSS_ANT引脚,若采用非+2.85V的有源天线,则需要为天线供电。
本文所使用的BDM100模块在其采用的软件接口协议中,主要通过消息的传递来完成信息的传送,其中“消息”是全ASCLL码组成的字符串。消息的基本格式为:
表1 BDM100模块消息格式
其中所有的消息都以$(0x24)开始,后面紧跟消息名,之后跟有不定数目的参数或数据。消息名与数据之间均以逗号(0x2C)进行分隔。表示输入的消息可以以‘r’(0x0D)或‘n’(0x0A)或两者的任意组合结束,而表示输出的消息则全部以‘rn’组合结束。消息名和参数中的字母均不区分大小写。
BDM100模块在使用之前需要进行初始化,初始化过程就是模块和主控芯片之间进行消息交互的过程。BDM100模块具有授时和定位功能,本系统只用到其定位功能,所以对于授时功能的初始化不做描述。
本系统需要用到的初始化指令如下表所示:
表2 BDM100模块初始化指令
其中在3G方案中由于采用USB接口通信,需要将波特率设置为115200(默认波特率9600),具体命令为:$CFGPRT,3,h0,115200,3,3。由于本系统用到的是北斗定位系统,而BDM100模块可以支持GPS和北斗混合定位,所以需要在初始化时将模块设置为北斗定位模式,可以采用两个命令实现—CFGSYS/CFGNAV,具体命令为:$CFGSYS,h10或者$CFGNAV,1000,1000,3,2。对于输出的消息有多种,具体的编码见下表:
表3 BDM100模块消息类型列表
本系统中用到的输出需要地理位置信息和对应的时间信息,由上面的消息类型可以看出采用GLL消息或者RMC消息皆可以满足要求,因为GLL消息比RMC消息短,信息效率比较高,所以系统在设计中采用GLL消息进行传送。因方案中连接的控制芯片处理能力限制,GLL消息需要设置其输出频率为1次/秒,而且其对应的类别和ID号分别为0和1,通过查找对应芯片软件手册得知GLL消息的最高输出频度为1Hz,所以利用CFGMSG设置其频率用的具体指令为:$CFGMSG,0,0,1。
当把以上内容处理完成,需要将设置进行保存,用到的指令为:$CFGSAVE。
初始化完成以后,BDM100芯片就会以1次/秒的速度通过接口向外输出数据,具体接收以及处理过程由与其相链接的主控芯片处理。
2 3G方案设计与实现
以3G方案设计的监护终端采用ARM926EJ-S为内核的AT91SAM9260芯片作为主控芯片,该芯片具有性能稳定,外围接口丰富,内嵌以太网,具备快速RAM和ROM,支持LINUX操作系统的特性。消息回传的3G芯片采用EVDO模块MC8630,3G服务要求网络具有较高的数据吞吐量,EVDO模块支持中国电信CDMA2000提供的所以数据分组业务,对于无线数据接入业务,EVDO的接入速度已经接近有限ADSL上网的水平,而且采用此种方式,数据传输稳定,为以后的性能扩展留下空间,满足方案设计要求。
2.1硬件设计
3G方案硬件连接框图如下:
图3 3G方案框图
其中BDM100模块和主控芯片AT91SAM9260通过UART接口连接,而3G芯片MC8630通过USB口与主控芯片连接,这样在保证接收与发送稳定性的同时,还可以为以后的性能扩展提供空间。对BDM100模块和主控芯片的连接具体电路见图2,而对3G模块和主控芯片的连接见下图:
图4 3G模块和主控芯片连接图
2.2 软件设计
在主控芯片AT91SAM9260上使用linux作为操作系统,该操作系统已经在众多嵌入式设备上面使用,其稳定性已经得到了验证。
2.2.1 BDM100模块的连接
BDM100模块采用UART串口和主控芯片通信,在linux中配置完内核之后,利用串口通信接口进行初始化和定位信息的传送。本方案中,具体的串口通信函数如下:
在进行串口通信时,要先对串口进行初始化,对应执行Serial_init函数。
具体格式:
int serial_init(char *dev, int speed, int is_block)
其中dev是设备文件地址,speed是串口波特率,is_block是设置在初始化不成功时,是否阻塞等待,直到初始化成功。
初始化函数通过调用static int open_dev(char *dev, int is_block)函数来打开设备文件,其中dev和is_block参数和初始化函数中的意义一致。打开成功,返回设备文件描述符,否则返回-1。通过调用static void set_speed(int fd, int speed)来设置波特率,其中fd表示设备描述符,speed表示速率,在调用此函数时,要停止串口工作。
初始化完成后,就可以进行数据的读写,读函数为:
int serial_read_timeout(int fd, char *str, unsigned int len, unsigned int timeout/*ms*/)
此读函数是带有超时机制的串口读,接收的数据放在str的字符串中,fd表示设备文件地址,len表示读取的长度,timeout 表示超时时间,ms级别,函数返回读取的长度。
所谓的超时机制,是指程序利用此函数读取数据时,会启动一个线程,有数据时运行,无数据时阻塞,当线程有数据时,读完数据,程序再继续,如果超时还没有读完,则放弃读取,程序继续,一般在设置的时间内,程序都能读完数据,这样做是为了防止线程死锁,无法结束线程。
串口发送函数具体格式为:
int serial_send(int fd,char *str,unsigned int len)
其中fd表示设备文件地址,发送数据放置在str中,长度为len。发送成功返回发送长度,否则返回小于0的值。
通过这样的三个函数,就可以实现BDM100模块与主控芯片AT91SAM9260的通信,可以完成相关的模块初始化操作和信息的传输。
2.2.2 MC8630模块的连接
本方案所用到EVDO射频模块,起初是无法被识别的,因为Linux默认配置中并没有打开这个选项,属于自定义电路,故需要手动配置。根据MC8630模块的电路图可以看出,CPU与MC8630通过USB口通讯,因此需要将处理器的USB口配置为3G功能。Linux对3G模块的驱动支持主要是将USB转换为串口,应用程序就可以像操作串口一样操作USB。
所以除了打开“USB driver for GSM and CDMA modems”内核选项之外,还需打开内核选项中USB功能和USB转串口转换支持,3G模块还会用到第三方的拨号软件,所以还需打开PPP拨号功能,配置完之后,编译内核。烧录系统后,重启进入/dev目录,若出现USBtty0~USBtty3这四个设备文件,表明3G模块的驱动已被正确加载。具体如下:
图5 3G模块驱动加载
在程序初始化时,利用编写好的拨号脚本绑定PPP0网卡,这样程序就可以像操作本地网卡一样操作3G模块,使用socket机制进行消息的传送。具体的拨号脚本如下:
If [‘ifconfig|grep ppp0|awk ‘(print($1))’’]
Then
echo “the ppp0 has existed!”
else
pppd call evdo &
until[‘ifconfig|grep ppp0|awk ‘(print($1))’’]
do
sleep 1
done
route del default
route add default dev ppp0
fi
在执行ifconfig命令后,系统会列出了所有的网卡,一般情况下只有eth0和lo两个网卡:eth0是常用的RJ45接口的网口,插上普通网线即可上网;lo是本地网卡;当使用pppd拨号成功之后就会出现ppp0无线网卡,此时3G模块已经连接上互联网。然而在操作系统启动的时候,一般默认网卡为eth0,故在拨号成功之后,必须修改默认的路由路径,这样如果在应用程序使用socket编程之时没有绑定指定网卡,所有网络数据都会从ppp0网卡传输。 绑定完ppp0网卡就可以使用linux socket机制进行与后台服务器的通信,本方案中采用的UDP方式和后台服务器进行通信,UDP协议的通信不需要像TCP一样事先建立链接,只需要绑定ip地址和端口号即可,但是本方案中为了以后的可扩展性,设计了socket_connect和socket_send函数,不论是TCP还是UDP,只要调用这两个函数即可,采用同样的接口,这样便于使用和扩展功能。具体如下:
int socket_connect(const int sock_fd, const char *ip_str, const unsigned int port_ui)
其中sock_fd是套接字,它是通过函数int socket_create(const int af, const int type, const int protocol, const int stime, const int rtime, const char *ifname)创建得到。ip_str是ip地址,port_ui是端口号。
int socket_send(const int sock_fd, const char * data, const int len, const int flags)
其中data是要发送的数据,len表示长度,flags一般取0即可。
接收函数:
int socket_recv_timeout(int sock_fd, char *buff, unsigned int len, unsigned int timeout/*ms*/)
具体功能用来接收网络数据,直到长度等于len,或者超时(timeout)后返回。
2.2.3服务器与3G模块通信协议
主控芯片AT91SAM9260收到BDM100模块发来的消息后,会将消息进行重组,通过3G模块传送到后台进行解析。因为系统的定位终端具有实时性,对于年月日信息的需求不是很强调,所以在初始化北斗时接收了GLL信息,它只含有时分秒的信息,本方案中采用的消息通信协议规定如下:
表4 自定义通信协议
其中起始位和校验位均用unsigned short表示,校验采用每两个字节异或操作,编译时,强迫两个字节对齐编译。
3G模块采用这种格式将消息传输到后台服务器进行处理,这样有利于保持信息的稳定和简洁性。
3 2G方案设计与实现
2G方案设计的监护终端采用基于cortex-M3为内核的LPC1766作为主控芯片,2G模块采用支持GSM网络的GTM900芯片[4]。该方案采用的2G网络技术成熟稳定,速度也能满足信息传输要求,配合健壮的软件设计,使得其在具体的应用中取得良好的效果。
3.1 硬件设计
该方案具体的硬件连接如下:
图6 2G方案框图
从图中可以看出BDM100芯片和GTM900芯片分别通过串口1和串口0与主控芯片LPC1766进行连接,其中GTM900与LPC1766的连接只需要将TXD引脚连接到RXD0,RXD连接到TXD0,然后将两个芯片的GND各自接地即可。而对应BDM100和LPC1766的连接则直接根据图2所示即可。
3.2 软件设计
在2G方案的软件设计中,由于不采用操作系统,直接根据LPC1766和其他两个芯片的说明手册进行裸版程序的设计。首先是要对BDM100芯片和GTM900芯片进行初始化操作,此处GTM900芯片的初始化操作要在BDM100芯片之前,因为BDM100初始化之后就直接输出位置信息GLL,而在本方案的程序设计中,只设置了一个接收串口数据的全局数组变量RecUartBuf[100],如果先初始化BDM100芯片,则GLL信息会和GTM900初始化信息冲突。另外,在UART接收程序中,因为每次接收的数据长度不固定,所以不能设置为多字节中断,在本方案中将程序设置为一字节中断,并设置定时器中断,用来判定数据是否传送完毕,在之前的BDM100芯片介绍中,将位置信息GLL的频率设置为1次/秒,则在本方案中将定时器中断设置为0.5s,这样就可以有足够的时间接收并传递信息,在定时器中断函数中将信息标志变量RecUartFlag设置为1,表示有数据进入,此时利用Uart0Sent函数将传递过来的GLL信息通过2G模块发送到后台服务器。
在本方案中,因为保证程序健壮性的需要,GLL位置定位消息传送到后台服务器的格式是不经过重组的原始信息,对于信息的重组和解析任务则交予后台服务器程序处理。
4 系统测试
监护终端的数据通过3G或者2G网络传送到服务器之后,服务器根据通讯协议对其解析。得到数据后,服务器进行如下操作:
1) 校验数据是否有错,有错则丢弃,并要求终端重新获取一次信息并立即传输。
2) 根据数据中的值重组还原,得到经纬度及当前的时间(格式为: XX时XX分XX秒)。
3) 根据经纬度信息,调用地图服务,获取具体位置。
4.1 3G方案测试
通过串口软件获得的北斗定位信息如下:
图7 北斗信息串口软件显示
其中显示北纬32度02438675分,东经118度48951303分,后面的090528等表示UTC时间。为了统一格式,将MM度XX分格式转化为MM.NN分(1度等于60分),故118度48951303分相当于118.81585505度,32度02438675分相当于32.04064458度。而其中UTC时间相当于0时区的时间,对应北京时间为东八区的时间,所以要加上8小时才是标准的北京时间,查找BDM100软件接口协议可得GLL消息显示的UTC时间格式为XX时XX分XX秒,例如090528,对应的UTC时间为9时5分28秒,对应的北京时间为17时5分28秒。后台服务器程序显示消息:
图8 北斗信息3G服务器端显示
从图中可以看到与串口通信软件显示消息一致,验证了系统的可用性和稳定性。
4.2 2G方案测试
同样再次利用串口通讯软件获取GLL消息:
图9北斗信息串口软件显示
后台服务器程序显示消息:
图10 北斗信息2G服务器端显示
从图中可以看出与串口通信软件显示消息一致,验证了2G方案的可行性。
为了验证定位的准确性,打开地球在线(http://www.earthol.com/),输入当前的经纬度信息,查看定位情况。
图11 北斗信息定位测试
如图所示,北斗定位的位置为A12号楼,而笔者所在的位置为图中蓝色标记所在的A10号楼,误差在30米左右,由于免费版本的goole地图其官方宣称误差在50米以内,所以本次试验的误差在合理范围内,表明基于北斗BDM100模块的定位终端运行成功。
结 语
北斗卫星定位系统作为我国自主研制的全球卫星定位系统在满足军事用途的同时,也在不断的加紧民用化进程,本文设计了两种方案解决家庭监护中位置定位的问题,其中3G方案不仅可以传输位置信息,也为以后传输各种身体信息,环境信息提供了接口和可扩展的空间。2G方案的优点在于其性能稳定,成本较低,对应具有单一需求的用户会是一个很好的选择。这两种方案设计合理,性能稳定,对其它工程设计具有一定参考价值。