摘 要:研究了GPS監(jiān)控系統(tǒng)的工作原理,運(yùn)用GPS與Web地圖相結(jié)合的定位方法,基于Vc++編程實(shí)現(xiàn)了一種可對(duì)寵物或車輛進(jìn)行實(shí)時(shí)、遠(yuǎn)程監(jiān)控的自助式GPS監(jiān)控系統(tǒng)。
關(guān)鍵詞:GPS監(jiān)控系統(tǒng);串口通訊;Web地圖
中圖分類號(hào):TP311
GPS是全球定位系統(tǒng)的英文簡(jiǎn)稱。GPS技術(shù)的主要功能是可實(shí)現(xiàn)對(duì)載體目標(biāo)位置、速度等的精確捕獲及監(jiān)控。已廣泛應(yīng)用于交通、物流、公安、海洋測(cè)繪等行業(yè)的GPS監(jiān)控系統(tǒng),是成功運(yùn)用了GPS技術(shù)、無(wú)線通信技術(shù)、GIS技術(shù)及圖像處理技術(shù)等來(lái)實(shí)現(xiàn)的,可以對(duì)移動(dòng)車輛、設(shè)備或人、寵物的實(shí)時(shí)遠(yuǎn)程監(jiān)控。
根據(jù)GPS監(jiān)控系統(tǒng)架構(gòu)的不同,主要可分為兩類。一類是中心式GPS監(jiān)控系統(tǒng)和自助式GPS監(jiān)控系統(tǒng)。
自助式GPS監(jiān)控系統(tǒng)是將GPS模塊通過(guò)標(biāo)準(zhǔn)接口(串口、USB接口、藍(lán)牙等)直接連接到計(jì)算機(jī)、Pocket PC等設(shè)備,該類系統(tǒng)一般會(huì)根據(jù)用戶的需求編寫不同的應(yīng)用程序來(lái)供用戶使用,比如自主車載導(dǎo)航系統(tǒng)、GPS軌跡記錄儀等設(shè)備。本文研究的是一種基于VC++編程,通過(guò)串口接收數(shù)據(jù)的自助式GPS監(jiān)控系統(tǒng)的實(shí)現(xiàn)方法。
1 串口通訊的自助式GPS監(jiān)控系統(tǒng)的實(shí)現(xiàn)
1.1 串口的打開及初始化
打開串口工作區(qū)使用OpenWorkFlow()函數(shù),其工作是啟動(dòng)串口工作線程,該函數(shù)沒有傳入?yún)?shù),函數(shù)的返回值為BOOL型,表示啟動(dòng)串口工作區(qū)是否成功。而對(duì)串口工作區(qū)參數(shù)初始化則使用InitWorkFlow()函數(shù),該函數(shù)的傳入?yún)?shù)分別為串口名稱和DBC結(jié)構(gòu)的串口工作參數(shù),該函數(shù)的返回值為BOOL型,表示初始化串口工作區(qū)是否成功。
1.2 串口接收GPS數(shù)據(jù)
在Vc++的編程實(shí)現(xiàn)中,數(shù)據(jù)接收部分通過(guò)線程運(yùn)行函數(shù)Run()和數(shù)據(jù)接收函數(shù)RecieiveData()來(lái)實(shí)現(xiàn)。
(1)線程的運(yùn)行函數(shù)。Run()函數(shù)實(shí)現(xiàn)對(duì)應(yīng)串口的接收事件的監(jiān)測(cè),當(dāng)監(jiān)測(cè)到有數(shù)據(jù)到達(dá)時(shí),接下來(lái)執(zhí)行RecieiveData()接收函數(shù)進(jìn)行數(shù)據(jù)接收,并發(fā)送消息通知給數(shù)據(jù)處理窗體。Run()函數(shù)沒有傳入?yún)?shù),該函數(shù)返回值為線程結(jié)束時(shí)結(jié)束代碼。
(2)數(shù)據(jù)接收函數(shù)。ReceiveData()函數(shù)實(shí)現(xiàn)串口數(shù)據(jù)的接收。該函數(shù)傳入?yún)?shù)為接收數(shù)據(jù)的緩沖區(qū)的最大長(zhǎng)度,函數(shù)會(huì)取這個(gè)值與當(dāng)前緩沖區(qū)長(zhǎng)度中較小的那個(gè)值來(lái)執(zhí)行讀取。該函數(shù)返回值為BOOL,其中,TRUE表示正確接收串口數(shù)據(jù),F(xiàn)ALSE表示接收串口數(shù)據(jù)失敗。
1.3 GPS數(shù)據(jù)的解析
在接收到GPS模塊中的相關(guān)數(shù)據(jù)后,還需要對(duì)數(shù)據(jù)按協(xié)議格式進(jìn)行解析。如:CdataFlow對(duì)象,CdataFlow對(duì)象在接收到消息后,會(huì)將數(shù)據(jù)存儲(chǔ)到變量中,并對(duì)緩沖區(qū)中的數(shù)據(jù)進(jìn)行解析。
解析對(duì)象在接收到串口數(shù)據(jù)后,會(huì)觸發(fā)OnComMsg()函數(shù),此函數(shù)會(huì)存儲(chǔ)數(shù)據(jù),并調(diào)用SearchFlow()函數(shù)來(lái)查找數(shù)據(jù)包,如果查找到有效數(shù)據(jù)包,則會(huì)調(diào)用DealFlow()函數(shù)來(lái)處理數(shù)據(jù)包,并發(fā)送解碼消息,由解碼處理函數(shù)OnDecodeMsg()來(lái)具體解碼。
(1)數(shù)據(jù)處理函數(shù)。OnComMsg()函數(shù)實(shí)現(xiàn)數(shù)據(jù)處理,用于處理串口接收到的數(shù)據(jù)。當(dāng)串口數(shù)據(jù)接收線程監(jiān)測(cè)到有數(shù)據(jù)到達(dá)時(shí),會(huì)進(jìn)行及時(shí)接收,并發(fā)送消息給數(shù)據(jù)處理窗口,數(shù)據(jù)處理窗口就會(huì)調(diào)用此函數(shù)對(duì)數(shù)據(jù)進(jìn)行處理,主要是將數(shù)據(jù)存入待解析字符串中,并發(fā)送消息給主窗體,由主窗體實(shí)現(xiàn)數(shù)據(jù)在界面顯示,并調(diào)用解析函數(shù)進(jìn)行協(xié)議數(shù)據(jù)的解析。該函數(shù)的傳入?yún)?shù)是存儲(chǔ)接收數(shù)據(jù)的數(shù)據(jù)緩沖區(qū)的指針和接收到的數(shù)據(jù)的長(zhǎng)度,該函數(shù)無(wú)返回值。
(2)查找協(xié)議數(shù)據(jù)包函數(shù)。SearchFlow()函數(shù)可實(shí)現(xiàn)從待解析數(shù)據(jù)緩沖區(qū)查找協(xié)議數(shù)據(jù)包的功能。查找數(shù)據(jù)包的標(biāo)準(zhǔn)是判斷協(xié)議頭和協(xié)議尾是否與協(xié)議的定義相符,如果查找到,則將協(xié)議頭的位置、協(xié)議尾的位置以及協(xié)議數(shù)據(jù)包的長(zhǎng)度存入變量中。該函數(shù)沒有傳入?yún)?shù)。該函數(shù)返回值為BOOL型,表示是否查找到協(xié)議數(shù)據(jù)包,如果返回TRUE,則表示數(shù)據(jù)緩沖區(qū)中存在協(xié)議數(shù)據(jù)包,如果返回FALSE,則表示當(dāng)前的數(shù)據(jù)緩沖區(qū)中沒有協(xié)議數(shù)據(jù)包。
(3)協(xié)議數(shù)據(jù)包解析函數(shù)。DealFlow()函數(shù)實(shí)現(xiàn)從待解析數(shù)據(jù)緩沖區(qū)中提取協(xié)議數(shù)據(jù)包的功能。當(dāng)在數(shù)據(jù)緩沖區(qū)中查找到協(xié)議數(shù)據(jù)包后,調(diào)用此方法將協(xié)議數(shù)據(jù)包從緩沖區(qū)中提取出來(lái),并發(fā)送消息給解碼函數(shù)進(jìn)行解碼。該函數(shù)沒有傳入?yún)?shù)。該函數(shù)沒有返回值。
(4)數(shù)據(jù)解碼函數(shù)。OnDecodeMsg()函數(shù)可實(shí)現(xiàn)數(shù)據(jù)包的解碼功能。當(dāng)程序提取出協(xié)議數(shù)據(jù)包后,則發(fā)送消息給此解碼函數(shù),此函數(shù)即對(duì)數(shù)據(jù)進(jìn)行解碼,其按照相應(yīng)協(xié)議對(duì)數(shù)據(jù)進(jìn)行解析。該函數(shù)的傳入?yún)?shù)為協(xié)議數(shù)據(jù)包的數(shù)據(jù)緩沖區(qū)指針和協(xié)議數(shù)據(jù)包的數(shù)據(jù)長(zhǎng)度。該函數(shù)沒有返回值。
(5)GPS定位信息解碼函數(shù)。解碼GPS定位信息函數(shù)主要使用DecodeNEMA_GPGGA(),該函數(shù)實(shí)現(xiàn)GPS定位信息協(xié)議數(shù)據(jù)包的解碼功能,其按照協(xié)議的語(yǔ)句格式對(duì)數(shù)據(jù)進(jìn)行解析。該函數(shù)沒有傳入?yún)?shù),其返回值為GPSPack共用體指針,其中存儲(chǔ)著GPGGA語(yǔ)句的數(shù)據(jù)項(xiàng)。
1.4 地圖支持
在解析出GPS信息后,如果只是枯燥的數(shù)據(jù),那么對(duì)用戶來(lái)說(shuō)不夠直觀,無(wú)法確切地了解實(shí)際的位置在什么地方,所以需要加入地圖的支持。地圖的應(yīng)用是很復(fù)雜的過(guò)程,依靠的是GIS(地理信息系統(tǒng))技術(shù)。簡(jiǎn)單地講,目前在監(jiān)控系統(tǒng)程序中結(jié)合地圖應(yīng)用主要有兩種方式:一種是本地地圖應(yīng)用,另一種是Web地圖應(yīng)用。早期的地圖應(yīng)用是從本地應(yīng)用發(fā)展起來(lái)的,其技術(shù)已經(jīng)比較成熟了,像MapInfo的MapX、Arc/Info等都提供了本地地圖的使用。隨著本地地圖應(yīng)用中一些問題的出現(xiàn),如費(fèi)用高、占用空間大、部署麻煩等,Web地圖的應(yīng)用發(fā)展了起來(lái)。本設(shè)計(jì)中,采用的就是Web地圖應(yīng)用技術(shù),使用51ditu提供的免費(fèi)地圖引擎,實(shí)現(xiàn)GPS位置信息的圖形化顯示。地圖顯示的具體方法:將51ditu引擎的Web頁(yè)面編寫好,主要是顯示點(diǎn)的腳本函數(shù),然后在程序中調(diào)用頁(yè)面的腳本函數(shù)。
1.5 端口清理
在實(shí)際編程開發(fā)中,很多時(shí)候會(huì)忽略結(jié)束清理工作,這樣往往會(huì)導(dǎo)致一些不可預(yù)知的BUG,尤其是像串口這樣獨(dú)享的資源,一定要做清理釋放工作。清理釋放工作的主要過(guò)程就是關(guān)閉串口,主要通過(guò)CloseCom()函數(shù)來(lái)實(shí)現(xiàn),該函數(shù)清除串口工作區(qū)并關(guān)閉串口句柄。該函數(shù)沒有傳入?yún)?shù),其返回值為BOOL型,表示關(guān)閉串口是否成功。
2 結(jié)束語(yǔ)
自助式GPS監(jiān)控系統(tǒng)具有靈活、可定制的、成本價(jià)格低廉的特點(diǎn),能在一定范圍內(nèi)代替?zhèn)鹘y(tǒng)的、價(jià)格較高的GPS運(yùn)營(yíng)商提供的服務(wù)方式。自助式GPS監(jiān)控系統(tǒng)一般只需要一次的成本投入,即能獲得終身免費(fèi)使用的權(quán)利。本文研究和開發(fā)的基于Vc++編程,采用串口通訊,可對(duì)寵物或車輛進(jìn)行實(shí)時(shí)、遠(yuǎn)程監(jiān)控的自助式GPS監(jiān)控系統(tǒng),為其他相似開發(fā)和研究提供了參考。
參考文獻(xiàn):
[1]黃冰,王鵬,陳婷.基于GPS的自助式高效公交換乘查詢系統(tǒng)的研究[J].計(jì)算機(jī)工程與科學(xué),2011(12).
[2]楊金顯,袁贛南.基于MIMU/GPS的組合導(dǎo)航設(shè)計(jì)及實(shí)驗(yàn)[J].光學(xué)精密工程,2008(02).
[3]霍卓群.基于HADOOP平臺(tái)的GPS動(dòng)態(tài)導(dǎo)航系統(tǒng)[J].洛陽(yáng)理工學(xué)院學(xué)報(bào)(自然科學(xué)版),2014(01).
作者簡(jiǎn)介:周澤輝(1977-),男,講師,碩士,主要從事軟件技術(shù)、網(wǎng)絡(luò)方面的教學(xué)與研究;吳炬(1978-),男,助教,碩士,主要從事軟件技術(shù)、網(wǎng)絡(luò)方面的教學(xué)與研究。
作者單位:長(zhǎng)沙職業(yè)技術(shù)學(xué)院,長(zhǎng)沙 410300