当前位置:首页 >> 应用技术 >> 无线通信 >> 基于Windows Mobile的蓝牙GPS数据采集方法的改进
基于Windows Mobile的蓝牙GPS数据采集方法的改进

  1. 前言

  随着手机软件硬件技术的发展,手机的功能越来越强大,同时手机与外界的数据连通显的愈发重要。蓝牙通信作为一种短距离无线通信技术标准,正逐渐普及,现在部分中高档手机已经配置了蓝牙模块。蓝牙有着比红外更快的速度、更远的传输距离、无角度等限制,为数据连通和交换提供了极大的便利,这为蓝牙发展和基于蓝牙的应用提供了广阔应用的前景。

  2. GPS系统介绍

  通常的GPS定位信息格式是NEMA0183格式,数据内容较少,因此多用RS-232串口将定位信息从GPS接收机传送到计算机中进行信息提取处理。对于嵌入式设备,采用CF卡GPS或者SD卡GPS信号接收机,该类型设备被映射为一个标准的串行口设备,GPS数据的获取也与通常的串行口通信相同。从串口读取数据有多种实现方法,在这里对串口数据读取部分不做详细的说明。下面对GPS接收机的接受数据过程做一个介绍。

  正常工作状态下,GPS接收机就会不断地把接收并计算出的GPS导航定位信息传送到计算机中。没有进一步处理之前缓存中是一长串字节流,这些信息在没有经过分类提取之前是无法加以利用的。因此,必须通过程序将各个字段的信息从缓存字节流中提取出来,将其转化成有实际意义的,可使用的信息。同其它通讯协议类似,对GPS进行信息提取必须首先明确其帧的数据结构,然后才能根据其结构完成对各定位信息的提取,现对该规范中作者用到的$GPRMC格式举例介绍如下:

格式举例

  3. GPS数据获取通常解决方法

  通常情况下,PDA的蓝牙通信一般是虚拟串口连了一个GPS,所以要做的主要工作是找出PDA上蓝牙模块模拟出的对应串口,找到对用的串口后,我需要从串口中将GPS数据读出来。

    GPS数据获取通常解决方法

  通常的GPS数据的读取如下:

  void ProcessGPSData(CString & strGPS)

  {

         CString sTime,sPositionX,sPositionY,sGpsStatus;       //读取到的gps数据

         sTime = "";                                                      //当前GPS时间

         sPositionX = "";                                               //当前位置X

         sPositionY = "";        

                //当前位置Y

         int iPosiRMC = strGPS.Find(_T("$GPRMC,"));   //获取位置时间信息

         int iGPSlength =  strGPS.GetLength();

         if (iPosiRMC!= -1)                   &

nbsp;                //获取位置、时间信息

         {     int SectionID="0";                                        //记录当前读取位置

                for (int i= iPosiRMC;i

                {

                       if ((strGPS.GetAt(i))==','){

                              SectionID++; continue;

                       }

                       else

                       {

  switch (SectionID)

                              {

                                     case 1:          &n

bsp;                            //提取出时间

                                            sTime+=strGPS.GetAt(i);      break;

         case 2:                                //判断GPS信号是否可信                    if(strGPS.GetAt(i)=='A')    {sGpsStatus = "A";……}

                                            else if(strGPS.GetAt(i)=='V') { sGpsStatus = "V";……}

                                      break;

           case 3: //提取出纬度

                                         sPositionY+=strGPS.GetAt(i); break;

                &n

bsp;                 case 5://提取出经度     

                                         sPositionX+=strGPS.GetAt(i); break;

                                  default:

                                         break;

                               }/*End switch*/

   }/*End if*/   

                }/*End for*/

         }/*End if*/

  If (sGpsStatus == "A") {…… //如果GPS信号状态有效,做相应的处理}

  }

  以上的GPS数据读取方法,在利用SD卡式样的GPS接收机或CF卡式样的GPS接收机情况下,在大部分PDA上均能调试通过,程序能可靠的运行。部分利用蓝牙GPS接收机作为GPS模块的PDA中,一般只要找到对应的虚拟串口,程序中数据的读取与普通的串口读取方法类似,用户可以通过Holux的GPSViewer查找到对应的串口。

 4.模拟串口解决方法所遇到的问题

  大显CU928机型是一款性价比较高的机型:处理器采用Intel PXA 263的400MHz CPU和高通MSM5500芯片组;内存容量为64MB;具有SD/MMC扩展能力;操作系统为Microsoft Wireless Mobile 2003 Pocket Phone Edition ;支持WAP浏览器,支持红外接口,内置蓝牙接口。

  以上介绍的方法虽然对大部分的PDA切实可行,但笔者在使用大显CU928机型时发现,PDA开发蓝牙GPS数据采集程序时,用GPS Viewer时可发现虚拟串口,并且用该程序接收数据也正常。但在用上述的程序实现方法访问对应的串口时,打开串口正常,但接受不到GPS数据。通常的解决方法是在应用软件和蓝牙设备之间再添加一个应用软件,如GPS GATE,笔者没有做这样的尝试,因为添加应用软件会降低系统的可靠性,同时也提高软件的最终成本。

  5. 一种新的改进思路

  所有的I/O操作都是通过读写文件描述符而产生的,文件描

述符是一个和打开的文件相关联的整数,这个文件并不只包括真正存储在磁盘上的文件,还包括一个网络连接、一个命名管道、一个终端等,而套接口就是系统进程和文件描述符通信的一种方法。目前最常用的套接口是字:字节流套接口(基于TCP)和数据报套接口(基于UDP)。为了执行网络输入输出,一个进程必须做的第一件事就是调用Socket函数获得一个文件描述符。当用socket建立了套接口后,可以调用connect为这个套接字指明远程端的地址;如果是字节流套接口,connect就使用三次握手建立一个连接;如果是数据报套接口,connect仅指明远程端地址,而不向它发送任何数据。

  基于连接的TCP方式。以该模式编程时,服务端有一个进程(或多个进程)在指定的端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以按设计的数据交换方法和格式进行数据传输。在本系统中,蓝牙GPS接收机(被发现设备)作为一个服务器端,接收客户端(手机蓝牙接收模块)在发出的服务端连接请求。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。同时能保证数据到达的先后顺序。

  另外一种socket的通信方式是基于无连接的UDP数据通信。使用无连接的UDP协议时,服务端进程创建一个socket,之后调用recvfrom接收客户端的数据报,然后调用sendto将要返回客户端的消息发送给客户进程。客户端也要先创建一个socket,再使用sendto向服务端进程发出请求,使用recvfrom得到返回的消息。该通信方式是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

  在GPS应用中,数据到达的顺序有一定的要求影响,本系统采用前一种基于连接的方式。将蓝牙GPS数据接收部分模拟成网络形式,在可靠的连接上读取GPS数据。

  6.改进方法的代码实现

  首先,建立PDA与蓝牙GPS的连接,以下代码说明了建立Socket连接的过程

  WSADATA wsd;

  WSACleanup();

  int i = WSAStartup(MAKEWORD(1,1), &wsd);

  if (i)//Initialization socket failed

  {

      …//显示错误消息,返回

  }

  m_btSocket = socket(AF_BT, SOCK_STREAM, BTHPROTO_RFCOMM);

  if (m_btSocket == INVALID_SOCKET)  //create socket failed

  {  

          …//显示错误消息,返回

  }

  SOCKADDR_BTH sa;

  memset (&sa, 0, sizeof(sa));

  sa.addressFamily = AF_BT;

  sa.btAddr = 0x0000*********

*;   //蓝牙GPS物理地址

  定义sa.serviceClassId.Data4[7]=0xFB;

  sa.port = 1;

  if (connect(m_btSocket, (SOCKADDR *)&sa, sizeof(sa)))

  {

  str.Format(_T("CONNCET failed %d %04x %08x"),WSAGetLastError (),GET_NAP(sa.btAddr), GET_SAP(sa.btAddr));

  m_status.SetWindowText(str);

         closesocket (m_btSocket);

  }

  else

  {

  SOCKADDR_BTH sa3;

  int len;

  if (0 == getsockname(m_btSocket, (SOCKADDR *)&sa3, &len))

  …//显示Socket连接成功信息

  &

nbsp;      m_status.SetWindowText(str);

  }

  pThreadRecv=::AfxBeginThread(_RecvThread, m_btSocket);  //开始TCP线程

  在接收线程中,将接收到的GPS数据提取所需要的信息即可。

  while(recv(m_btSocket,readBuf,256,0))

  {…//处理接收到的GPS数据}

  GPS数据提取部分与以上介绍的方法相同。

  7. 结论

  本文创新点:基于Windows Mobile的蓝牙GPS数据采集方法的改进,将通常的蓝牙GPS虚拟串口数据采集方法转换成基于Socket通信方法,解决了部分系统由于在虚拟串口过程中不一致而导致无法从虚拟串口中读取数据的问题,以上的解决方法在CU928机型接收蓝牙GPS数据的中已经调试成功。该解决方法已经在一个监控系统中取得成功的应用,该解决方法对类似的蓝牙通信方案应用有一定的参考和实用价值。

  参考文献

  [1] 汪兵 李存斌 陈鹏/等编著,《EVC高级编程及其应用开发》,中国水利水电出版社

  [2] 洪大永/编著,《GPS全球定位系统技术及其应用》厦门大学出版社

  [3] 曹双贵富魏蒋芹韩晓春. 基于蓝牙和多线程技术的网络化数采系统[J]微计算机信 息2005,21

  [4] PAUL A.LONGLEY/等编著 唐中实/等译 《地理信息系统(原理与技术)第二版》,     电子工业出版社

  [5] BJARNE STROUSTRUP,贝尔实验室/编著 裘宗燕/译,《C++程序设计语言》,机械工业出版社

  [7] 马建仓等编著,《蓝牙核心技术与应用》 第一版 北京 科学出版社

  [8] 陆小锋,陆亨立,张芳琴. GPRS 与GPS 在汽车信息服务系统中的设计应用[J]微计算机信息2005,3:188- 189

 

 

来源:微计算机信息/作者:张增华 程明霄

热门资料
关于我们 | 设为首页 | 会员服务 | 广告服务 | 投诉建议 | 联系我们 | 友情链接
联系电话:0755-82703064   82952456   传真:0755-82990057   E-mail:service[at]dianziw.com  

粤ICP备07023256号