• Cehui8.com 测绘地理信息领域专业门户
  • 首页 > 测绘论文 > GIS

    基于GIS/GPS/GSM小型车辆监控系统的通信网关设计

    2013-07-09 15:39:19 来源: 测绘论坛 作者:
    聊聊

    摘  要:本文主要介绍了基于GIS/GPS/GSM的小型车辆监控系统的原理和涉及的相关技术,并讨论了本系统的通信网关的技术实现。
    关键词:GPS  GIS  GSM  车辆监控 短消息

    1 前言
    机动车辆的出现,给人们的生活带来了很多方便,同时也带来了很多棘手的问题,例如车辆分散不易管理,车辆盗窃,车辆遇抢等问题。如何使车辆的管理科学化和提高车辆的运营安全,已经成为一个亟待解决的重大课题。
    2 基于GIS/GPS/GSM小型车辆监控系统原理和组成
    2.1 基于GIS/GPS/GSM小型车辆监控系统的工作原理
    基于GIS/GPS/GSM小型车辆监控系统使用GPS接收机进行自动定位,车载单元的GPS接收模块接收GPS卫星(共24颗,分布在6个不同的地球轨道上)每秒钟发来的定位数据,并根据从三颗以上不同卫星发来的数据计算出自身所处的地理坐标。坐标数据通过GSM模块,利用短信的形式将车辆的位置、状态、报警器和传感器输入的信息按规定的协议编码发送至GSM网络,GSM网络将接收到的车辆定位信息传送至监控中心的通信网关上,经过通信网关处理后,转发到GIS监控终端并在地图上显示移动目标的地理位置,这样控制中心就可清楚和直观地掌握车辆的动态位置,从而把握了车辆的运营情况。在车辆在遇到紧急情况时,可通过车载设备,采用自动或手动报警,将车辆所在位置、报警类型等数据发送至控制中心,经监控计算机处理后,及时将事发车辆的精确位置显示在电子地图上,为决策解决事故的方案提供依据。另一方面,控制管理中心也可以根据当前的车辆的运行情况,给车辆发指挥信息调度车辆的行驶。
    2.2    基于GIS/GPS/GSM小型车辆监控系统的系统构成
    基于GIS/GPS/GSM小型车辆监控系统由监控中心、车载终端和GSM无线网络三个部分组成。
    监控中心是基于GIS/GPS/GSM小型车辆监控系统的核心,由通信网关和GIS监控终端组成,它主要完成各种信息的转发。一方面,接收车载终端上传的车辆信息,并且把这些信息分发给相应的GIS监控计算机,以实现对车辆的监控和管理。另外一个方面,监控中心响应GIS监控计算机发出的对车载设备的控制信息,并且把这些信息下发到相应的车载设备上,从而达到对车辆进行控制的目的。
    车载终端,由GPS接收单元、GSM模块、车载控制单元、显示屏、GPS天线和相应的传感器件等组成。车载终端通过GSM网络和监控中心进行双向的信息传输;它接收GPS定位信号,并将车辆的位置和状态信息传送到监控中心,同时接收监控中心的控制数据,并且对车辆进行控制。
    GSM网络是车载终端和监控中心进行信息交互的数据链路。其的功能是:将GPS定位信息准确的传回监控中心;将监控中心的控制数据传给车载设备。
        基于GIS/GPS/GSM小型车辆监控系统的系统结构如图1所示。
    2 何利用GSM的AT指令进行短消息的发送和接收
    (1)    设置短消息服务中心号码
    AT+CSCA=“+861380028500”(短消息中心号码)
    (2)    设置短消息的格式
    AT+CMGF=1(1:文本格式  0:PDU格式)
    (3)    发送短消息(短消息内容为TEST)
    AT+CMGS=“13666188700”
    >TEST ctr+z
    (4)    设置收到新的短消息后自动提示
    AT+CNMI=1,1,0,0,1
    当收到新的短消息,将会获得以下的提示指令:
    +CMTI:“SM”,INDEX(新短消息的存储的索引号)
    (5)    读取新短消息的内容(假设短消息的内容为“GOOD”),INDEX=8
    AT+CMGR=8
    返回短消息的内容如下:
    +CMGR:“REC UNREAD”,“+8613666188700”,“02/07/16,15:37:38”,“GOOD”
    3. 3 信网关程序的设计要点
    通信网关程序是GIS/GPS/GSM小型车辆监控系统的极为重要的一个组成部分,通信网关程序的性能如何将对整个系统的能否很好的满足用户的需求产生决定性的影响,所以通信网关的程序设计工作比较复杂。由于篇幅的关系,在这里只给出了通信网关程序的设计思路和步骤。
        结合前面提及的GSM的AT指令,利用WIN32的对串口进行操作的API函数可以很好的完成通信网关程序的设计。从MFC的WinThread类中派生一个CcomThread类,负责串口数据的接收和发送。
    (1)CcomThread类OpenConnection(LPTSTR pszDevName)负责串口的打开、配置
    BOOL CComThread::OpenConnection(LPTSTR pszDevName)
    {
    ComDev=CreateFile(pszDevName,                                         GENERIC_READ|GENERIC_WRITE,   //允许读写
                      0,  //此项为0                     
                      NULL,                      
                      OPEN_EXISTING,
                      FILE_FLAG_OVERLAPPED,
                      NULL);
        if(ComDev==(HANDLE)-1)
        return FALSE;
        dcb.DCBlength   =sizeof(DCB);
        GetCommState(ComDev,&dcb);             //得到串口初始设置
        dcb.BaudRate    =CBR_9600;                //波特率
        dcb.ByteSize    =8;                    //字节大小
        dcb.Parity      =NOPARITY;             //无奇偶效验
        dcb.StopBits    =ONESTOPBIT;
        SetCommState(ComDev,&dcb);
        SetupComm(ComDev,1024,1024);
        COMMTIMEOUTS CommTimeOuts;             //设置超时值
        CommTimeOuts.ReadIntervalTimeout=0;                      CommTimeOuts.ReadTotalTimeoutMultiplier=0;
        CommTimeOuts.ReadTotalTimeoutConstant=0;
        CommTimeOuts.WriteTotalTimeoutMultiplier=0;
        CommTimeOuts.WriteTotalTimeoutConstant=1000;
        SetCommTimeouts(ComDev,&CommTimeOuts);
        PurgeComm(ComDev,PURGE_TXCLEAR);//清除发送缓冲区
        PurgeComm(ComDev,PURGE_RXCLEAR);//清除接收缓冲区
        return TRUE;
    }
    (2)从串口接收数据的函数Recv()
    void CComThread::RECV()
    {
        DWORD dwErrorFlag;              //错误标志
        COMSTAT ComStat;    
        DWORD dwEventMask=0;       
        DWORD cByte;
    SetCommMask(comDev,EV_RXCHAR|EV_TXEMPTY);//设置监听听事件
    WaitCommEvent(comDev,& dwEventMask,os);//等待监听事件的发生
    If((dwEventMask&EV_RXCHAR)==EV_RXCHAR)
    {
        unsigned char strRecvBuf[256];
        int iRecvStrLen,i;
    ClearCommError(comDev,&dwErrorFlag,&ComStat);
    CByte= ComStat.cbInQue;
        If(Cbyte>0)
    {      iRecvStrLen=Cbyte;
               memset(strRecvBuf,0,256);
               BOOL bRead=ReadFile(ComDev,strRecvBuf,iRecvStrLen,&cByte,0);//读串口
               if(!bRead)
               {
                  ClearCommError(ComDev,&dwErrorFlag,&ComStat);
               }
               for(i=0;i<iRecvStrLen;i++)
               {
                  RecvBuf[i]=strRecvBuf[i];
                 //RecvBuf为接收缓冲区,CcomThread的类成员变量
    }
    }          
    AnalyzFrameIn(RecvBuf);// AnalyzFrameIn负责对接收的数据包进行分析
    PurgeComm(ComDev,PURGE_RXCLEAR);
    }
    (3)对串口接收的数据包进行分析
    对串口接收到的数据包,必须要进行分析和识别,通过判断数据包中包含的信息,决定下一步的执行。在接收到的数据包中,如果包含了‘>’,表明请求发送短消息成功,现在可以通过串口发送短消息;如果包含了“+CMTI”,表明有新的短消息到达,我们可以读取新的短消息;如果包含了“+CMGR”,本数据包是短消息内容的数据包,我们可以从此数据包中提取短消息的内容。
    void CComThread::AnalyzFrameIn(char *FrameIn)
    {
    if(strstr(FrameIn,">")!=NULL)//现在可以发送短消息
    {
    SnedSMS();//发送短消息
    }
         if(strstr(FrameIn,"+CMGR")!=NULL)//读短消息成功
         {
               //通知主线程处理接收到的短消息
               ::PostMessage((HWND)h_MainFrm,WM_NEWSMS,0,0);
         }
        if(strstr(FrameIn,"+CMTI")!=NULL)//收到新的短消息
        {
            //从数据包中,取出INDEX

           ReQuestReadSMS(INDEX);//请求读取新的短消息
        }

    }
    (4)请求读取短消息
    void CComThread::ReQuestReadSMS(int INDEX)
    {
    wsprintf(FrameOut,"%s"," AT+CMGR=");// AT+CMGR请求读取新短消息
    Cstring strIndex;
    StrIndex.Format(“%d”,INDEX);
        strcat(FrameOut,strIdex);
        strcat(FrameOut,"r");
        WriteComm();//把FrameOut字符串从串口发送出去

    }
    (5)请求发送短消息
    void CComThread::RequestSend(char* ID)
    {  //ID为目的车载台的SIM号码
        wsprintf(FrameOut,"%s","at+cmgs=");// at+cmgs请求发送短消息
        strcat(FrameOut,ID);
        strcat(FrameOut,"r");
        WriteComm();//把FrameOut字符串从串口发送出去
    }
    (6)往串口发送数据
    OOL CComThread::WriteComm()
    {
        COMSTAT ComStat;
        DWORD dwErrorFlag;
        DWORD dwBytesWritten;
        int FrameLengthOut;
        FrameLengthOut=Frame_Length_Out;
        for(int flo=0;flo<FrameLengthOut;flo++)
        {//通过串口发送数据
           unsigned char tempchar=FrameOut[flo];
           BOOL bWrite=WriteFile(ComDev,&tempchar,1,&dwBytesWritten,NULL);
           if(!bWrite)                 //操作不成功
           {
               TRACE("write comm ERROR!n");
               ClearCommError(ComDev,&dwErrorFlag,&ComStat);//  清除错误
               return FALSE;
           }
        }
        memset(FrameOut,0,sizeof(FrameOut));
        return TRUE;
    }
    (7)发送短消息
    void CComThread::sendSMS()
    {
           int I=strlen(FrameOut);//
           FrameOut[i++]=0x1a;// 0x1a为ctrl+z的ASCCI编码
           FrameOut[i]='';
           Frame_Length_Out=strlen(FrameOut);
           WriteComm(); 

    }
    4 结论
    基于GIS/GPS/GSM小型车辆监控系统,是针对目前GPS车辆监控应用市场中,车台容量比较小的单位用户的车辆监控需求而提出的一个系统方案。本系统通信网关采用GSM模块和通信计算机组成,用户只需要投入比较少的硬件的投资,就可以实现对车辆的监控、定位功能。

      声明①:文章部分内容来源互联网,如有侵权请联系删除,邮箱 cehui8@qq.com

      声明②:中测网登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,文章内容仅供参考。

      加群提示:我们创建了全国32个省份的地方测绘群,旨在打造本地测绘同行交流圈,有需要请联系管理员测小量(微信 cexiaoliang)进群,一人最多只能进入一个省份群,中介人员勿扰