基于GIS/GPS/GSM小型車(chē)輛監(jiān)控系統(tǒng)的通信網(wǎng)關(guān)設(shè)計(jì)
摘 要:本文主要介紹了基于GIS/GPS/GSM的小型車(chē)輛監(jiān)控系統(tǒng)的原理和涉及的相關(guān)技術(shù),并討論了本系統(tǒng)的通信網(wǎng)關(guān)的技術(shù)實(shí)現(xiàn)。
關(guān)鍵詞:GPS GIS GSM 車(chē)輛監(jiān)控 短消息
1 前言
機(jī)動(dòng)車(chē)輛的出現(xiàn),給人們的生活帶來(lái)了很多方便,同時(shí)也帶來(lái)了很多棘手的問(wèn)題,例如車(chē)輛分散不易管理,車(chē)輛盜竊,車(chē)輛遇搶等問(wèn)題。如何使車(chē)輛的管理科學(xué)化和提高車(chē)輛的運(yùn)營(yíng)安全,已經(jīng)成為一個(gè)亟待解決的重大課題。
2 基于GIS/GPS/GSM小型車(chē)輛監(jiān)控系統(tǒng)原理和組成
2.1 基于GIS/GPS/GSM小型車(chē)輛監(jiān)控系統(tǒng)的工作原理
基于GIS/GPS/GSM小型車(chē)輛監(jiān)控系統(tǒng)使用GPS接收機(jī)進(jìn)行自動(dòng)定位,車(chē)載單元的GPS接收模塊接收GPS衛(wèi)星(共24顆,分布在6個(gè)不同的地球軌道上)每秒鐘發(fā)來(lái)的定位數(shù)據(jù),并根據(jù)從三顆以上不同衛(wèi)星發(fā)來(lái)的數(shù)據(jù)計(jì)算出自身所處的地理坐標(biāo)。坐標(biāo)數(shù)據(jù)通過(guò)GSM模塊,利用短信的形式將車(chē)輛的位置、狀態(tài)、報(bào)警器和傳感器輸入的信息按規(guī)定的協(xié)議編碼發(fā)送至GSM網(wǎng)絡(luò),GSM網(wǎng)絡(luò)將接收到的車(chē)輛定位信息傳送至監(jiān)控中心的通信網(wǎng)關(guān)上,經(jīng)過(guò)通信網(wǎng)關(guān)處理后,轉(zhuǎn)發(fā)到GIS監(jiān)控終端并在地圖上顯示移動(dòng)目標(biāo)的地理位置,這樣控制中心就可清楚和直觀地掌握車(chē)輛的動(dòng)態(tài)位置,從而把握了車(chē)輛的運(yùn)營(yíng)情況。在車(chē)輛在遇到緊急情況時(shí),可通過(guò)車(chē)載設(shè)備,采用自動(dòng)或手動(dòng)報(bào)警,將車(chē)輛所在位置、報(bào)警類型等數(shù)據(jù)發(fā)送至控制中心,經(jīng)監(jiān)控計(jì)算機(jī)處理后,及時(shí)將事發(fā)車(chē)輛的精確位置顯示在電子地圖上,為決策解決事故的方案提供依據(jù)。另一方面,控制管理中心也可以根據(jù)當(dāng)前的車(chē)輛的運(yùn)行情況,給車(chē)輛發(fā)指揮信息調(diào)度車(chē)輛的行駛。
2.2 基于GIS/GPS/GSM小型車(chē)輛監(jiān)控系統(tǒng)的系統(tǒng)構(gòu)成
基于GIS/GPS/GSM小型車(chē)輛監(jiān)控系統(tǒng)由監(jiān)控中心、車(chē)載終端和GSM無(wú)線網(wǎng)絡(luò)三個(gè)部分組成。
監(jiān)控中心是基于GIS/GPS/GSM小型車(chē)輛監(jiān)控系統(tǒng)的核心,由通信網(wǎng)關(guān)和GIS監(jiān)控終端組成,它主要完成各種信息的轉(zhuǎn)發(fā)。一方面,接收車(chē)載終端上傳的車(chē)輛信息,并且把這些信息分發(fā)給相應(yīng)的GIS監(jiān)控計(jì)算機(jī),以實(shí)現(xiàn)對(duì)車(chē)輛的監(jiān)控和管理。另外一個(gè)方面,監(jiān)控中心響應(yīng)GIS監(jiān)控計(jì)算機(jī)發(fā)出的對(duì)車(chē)載設(shè)備的控制信息,并且把這些信息下發(fā)到相應(yīng)的車(chē)載設(shè)備上,從而達(dá)到對(duì)車(chē)輛進(jìn)行控制的目的。
車(chē)載終端,由GPS接收單元、GSM模塊、車(chē)載控制單元、顯示屏、GPS天線和相應(yīng)的傳感器件等組成。車(chē)載終端通過(guò)GSM網(wǎng)絡(luò)和監(jiān)控中心進(jìn)行雙向的信息傳輸;它接收GPS定位信號(hào),并將車(chē)輛的位置和狀態(tài)信息傳送到監(jiān)控中心,同時(shí)接收監(jiān)控中心的控制數(shù)據(jù),并且對(duì)車(chē)輛進(jìn)行控制。
GSM網(wǎng)絡(luò)是車(chē)載終端和監(jiān)控中心進(jìn)行信息交互的數(shù)據(jù)鏈路。其的功能是:將GPS定位信息準(zhǔn)確的傳回監(jiān)控中心;將監(jiān)控中心的控制數(shù)據(jù)傳給車(chē)載設(shè)備。
基于GIS/GPS/GSM小型車(chē)輛監(jiān)控系統(tǒng)的系統(tǒng)結(jié)構(gòu)如圖1所示。
2 何利用GSM的AT指令進(jìn)行短消息的發(fā)送和接收
(1) 設(shè)置短消息服務(wù)中心號(hào)碼
AT+CSCA=“+861380028500”(短消息中心號(hào)碼)
(2) 設(shè)置短消息的格式
AT+CMGF=1(1:文本格式 0:PDU格式)
(3) 發(fā)送短消息(短消息內(nèi)容為T(mén)EST)
AT+CMGS=“13666188700”
>TEST ctr+z
(4) 設(shè)置收到新的短消息后自動(dòng)提示
AT+CNMI=1,1,0,0,1
當(dāng)收到新的短消息,將會(huì)獲得以下的提示指令:
+CMTI:“SM”,INDEX(新短消息的存儲(chǔ)的索引號(hào))
(5) 讀取新短消息的內(nèi)容(假設(shè)短消息的內(nèi)容為“GOOD”),INDEX=8
AT+CMGR=8
返回短消息的內(nèi)容如下:
+CMGR:“REC UNREAD”,“+8613666188700”,“02/07/16,15:37:38”,“GOOD”
3. 3 信網(wǎng)關(guān)程序的設(shè)計(jì)要點(diǎn)
通信網(wǎng)關(guān)程序是GIS/GPS/GSM小型車(chē)輛監(jiān)控系統(tǒng)的極為重要的一個(gè)組成部分,通信網(wǎng)關(guān)程序的性能如何將對(duì)整個(gè)系統(tǒng)的能否很好的滿足用戶的需求產(chǎn)生決定性的影響,所以通信網(wǎng)關(guān)的程序設(shè)計(jì)工作比較復(fù)雜。由于篇幅的關(guān)系,在這里只給出了通信網(wǎng)關(guān)程序的設(shè)計(jì)思路和步驟。
結(jié)合前面提及的GSM的AT指令,利用WIN32的對(duì)串口進(jìn)行操作的API函數(shù)可以很好的完成通信網(wǎng)關(guān)程序的設(shè)計(jì)。從MFC的WinThread類中派生一個(gè)CcomThread類,負(fù)責(zé)串口數(shù)據(jù)的接收和發(fā)送。
(1)CcomThread類OpenConnection(LPTSTR pszDevName)負(fù)責(zé)串口的打開(kāi)、配置
BOOL CComThread::OpenConnection(LPTSTR pszDevName)
{
ComDev=CreateFile(pszDevName, GENERIC_READ|GENERIC_WRITE, //允許讀寫(xiě)
0, //此項(xiàng)為0
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
if(ComDev==(HANDLE)-1)
return FALSE;
dcb.DCBlength =sizeof(DCB);
GetCommState(ComDev,&dcb); //得到串口初始設(shè)置
dcb.BaudRate =CBR_9600; //波特率
dcb.ByteSize =8; //字節(jié)大小
dcb.Parity =NOPARITY; //無(wú)奇偶效驗(yàn)
dcb.StopBits =ONESTOPBIT;
SetCommState(ComDev,&dcb);
SetupComm(ComDev,1024,1024);
COMMTIMEOUTS CommTimeOuts; //設(shè)置超時(shí)值
CommTimeOuts.ReadIntervalTimeout=0; CommTimeOuts.ReadTotalTimeoutMultiplier=0;
CommTimeOuts.ReadTotalTimeoutConstant=0;
CommTimeOuts.WriteTotalTimeoutMultiplier=0;
CommTimeOuts.WriteTotalTimeoutConstant=1000;
SetCommTimeouts(ComDev,&CommTimeOuts);
PurgeComm(ComDev,PURGE_TXCLEAR);//清除發(fā)送緩沖區(qū)
PurgeComm(ComDev,PURGE_RXCLEAR);//清除接收緩沖區(qū)
return TRUE;
}
(2)從串口接收數(shù)據(jù)的函數(shù)Recv()
void CComThread::RECV()
{
DWORD dwErrorFlag; //錯(cuò)誤標(biāo)志
COMSTAT ComStat;
DWORD dwEventMask=0;
DWORD cByte;
SetCommMask(comDev,EV_RXCHAR|EV_TXEMPTY);//設(shè)置監(jiān)聽(tīng)聽(tīng)事件
WaitCommEvent(comDev,& dwEventMask,os);//等待監(jiān)聽(tīng)事件的發(fā)生
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為接收緩沖區(qū),CcomThread的類成員變量
}
}
AnalyzFrameIn(RecvBuf);// AnalyzFrameIn負(fù)責(zé)對(duì)接收的數(shù)據(jù)包進(jìn)行分析
PurgeComm(ComDev,PURGE_RXCLEAR);
}
(3)對(duì)串口接收的數(shù)據(jù)包進(jìn)行分析
對(duì)串口接收到的數(shù)據(jù)包,必須要進(jìn)行分析和識(shí)別,通過(guò)判斷數(shù)據(jù)包中包含的信息,決定下一步的執(zhí)行。在接收到的數(shù)據(jù)包中,如果包含了‘>’,表明請(qǐng)求發(fā)送短消息成功,現(xiàn)在可以通過(guò)串口發(fā)送短消息;如果包含了“+CMTI”,表明有新的短消息到達(dá),我們可以讀取新的短消息;如果包含了“+CMGR”,本數(shù)據(jù)包是短消息內(nèi)容的數(shù)據(jù)包,我們可以從此數(shù)據(jù)包中提取短消息的內(nèi)容。
void CComThread::AnalyzFrameIn(char *FrameIn)
{
if(strstr(FrameIn,">")!=NULL)//現(xiàn)在可以發(fā)送短消息
{
SnedSMS();//發(fā)送短消息
}
if(strstr(FrameIn,"+CMGR")!=NULL)//讀短消息成功
{
//通知主線程處理接收到的短消息
::PostMessage((HWND)h_MainFrm,WM_NEWSMS,0,0);
}
if(strstr(FrameIn,"+CMTI")!=NULL)//收到新的短消息
{
//從數(shù)據(jù)包中,取出INDEX
ReQuestReadSMS(INDEX);//請(qǐng)求讀取新的短消息
}
}
(4)請(qǐng)求讀取短消息
void CComThread::ReQuestReadSMS(int INDEX)
{
wsprintf(FrameOut,"%s"," AT+CMGR=");// AT+CMGR請(qǐng)求讀取新短消息
Cstring strIndex;
StrIndex.Format(“%d”,INDEX);
strcat(FrameOut,strIdex);
strcat(FrameOut,"r");
WriteComm();//把FrameOut字符串從串口發(fā)送出去
}
(5)請(qǐng)求發(fā)送短消息
void CComThread::RequestSend(char* ID)
{ //ID為目的車(chē)載臺(tái)的SIM號(hào)碼
wsprintf(FrameOut,"%s","at+cmgs=");// at+cmgs請(qǐng)求發(fā)送短消息
strcat(FrameOut,ID);
strcat(FrameOut,"r");
WriteComm();//把FrameOut字符串從串口發(fā)送出去
}
(6)往串口發(fā)送數(shù)據(jù)
OOL CComThread::WriteComm()
{
COMSTAT ComStat;
DWORD dwErrorFlag;
DWORD dwBytesWritten;
int FrameLengthOut;
FrameLengthOut=Frame_Length_Out;
for(int flo=0;flo<FrameLengthOut;flo++)
{//通過(guò)串口發(fā)送數(shù)據(jù)
unsigned char tempchar=FrameOut[flo];
BOOL bWrite=WriteFile(ComDev,&tempchar,1,&dwBytesWritten,NULL);
if(!bWrite) //操作不成功
{
TRACE("write comm ERROR!n");
ClearCommError(ComDev,&dwErrorFlag,&ComStat);// 清除錯(cuò)誤
return FALSE;
}
}
memset(FrameOut,0,sizeof(FrameOut));
return TRUE;
}
(7)發(fā)送短消息
void CComThread::sendSMS()
{
int I=strlen(FrameOut);//
FrameOut[i++]=0x1a;// 0x1a為ctrl+z的ASCCI編碼
FrameOut[i]='';
Frame_Length_Out=strlen(FrameOut);
WriteComm();
}
4 結(jié)論
基于GIS/GPS/GSM小型車(chē)輛監(jiān)控系統(tǒng),是針對(duì)目前GPS車(chē)輛監(jiān)控應(yīng)用市場(chǎng)中,車(chē)臺(tái)容量比較小的單位用戶的車(chē)輛監(jiān)控需求而提出的一個(gè)系統(tǒng)方案。本系統(tǒng)通信網(wǎng)關(guān)采用GSM模塊和通信計(jì)算機(jī)組成,用戶只需要投入比較少的硬件的投資,就可以實(shí)現(xiàn)對(duì)車(chē)輛的監(jiān)控、定位功能。
聲明①:文章部分內(nèi)容來(lái)源互聯(lián)網(wǎng),如有侵權(quán)請(qǐng)聯(lián)系刪除,郵箱 cehui8@qq.com
聲明②:中測(cè)網(wǎng)登載此文出于傳遞更多信息之目的,并不意味著贊同其觀點(diǎn)或證實(shí)其描述,文章內(nèi)容僅供參考。