盧 靈,陳志華
(暨南大學(xué) 信息技術(shù)研究所,廣東 廣州 510075)
目前,基于GPS定位電子地圖的獲取主要是通過基于Mapinfo制圖工具制作的電子地圖,很多電子地圖的獲取都是直接由專業(yè)的制圖授權(quán)公司提供。針對這種情況,提出了一種基于Web網(wǎng)頁下載Google電子地圖的方式獲取GPS定位地圖的方法,使得電子定位地圖的獲取變得更加方便。
GPS定位信息需要通過GPS模塊接收衛(wèi)星定位信息,GPS模塊每一秒鐘會接收一次GPS定位信息,按照GPS標準協(xié)議格式輸出,用戶可以根據(jù)GPS標準協(xié)議格式解析出從GPS模塊[1]接收過來的GPS定位信息,由于本設(shè)計只需要使用到經(jīng)緯度信息進行定位,所以,需要解析出GPS模塊傳輸過來的經(jīng)緯度信息。
使用串口2作為GPS模塊的控制設(shè)備,在Linux操作系統(tǒng)中,輸入指令cat/proc/devices可以查到串口2在Linux設(shè)備文件系統(tǒng)中對應(yīng)的設(shè)備文件名為”/dev/ttySAC2”,打開這個文件,即:
因為GPS模塊使用串口通信,所以需要設(shè)置串口通信的方式和波特率等信息。在串口通信設(shè)置完成之后,在GPS接收程序中定義一個結(jié)構(gòu)體,用來存放串口解析出的GPS定位信息:
GPRS模塊負責(zé)整個網(wǎng)絡(luò)通信,由GPRS無線通信[2]實現(xiàn)與服務(wù)器的通信和GPS定位電子地圖的下載。
本設(shè)計采用SIM300芯片來實現(xiàn)GPRS模塊無線通信,SIM300 GPRS模塊的初始化啟動流程如圖1所示。
使用串口1來控制GPRS模塊,在Linux操作系統(tǒng)中,串口1對應(yīng)的設(shè)備文件名為“/dev/ttySAC1”,打開該文件
設(shè)置好串口1之后,就可以在Linux操作系統(tǒng)管理GPRS模塊。
圖1 SIM300的初始化啟動流程
按照圖1中給出的初始化流程,分別向串口發(fā)送AT指令,在Linux操作系統(tǒng)下定義了負責(zé)發(fā)送控制命令和接收GPRS信息函數(shù):write(fd,send_buf,strlen(send_buf))和read(fd,rcv_buf,buf_len)。其中write函數(shù)中的send_buf就是需要發(fā)送控制GPRS模塊啟動和通信的AT命令的字符串,如果發(fā)送正常,返回值會大于0,否則,發(fā)送失敗。GPRS模塊初始化需要分別發(fā)送字符串“AT”,“AT+CREG?”,“AT+CGREG?”,“AT+CSQ”,如果每次都能夠正常發(fā)送,就可以開始GPRS無線網(wǎng)絡(luò)通信;read函數(shù)中的參數(shù)rcv_buf是GPRS接收數(shù)據(jù)存放的緩沖區(qū),buf_len是緩沖區(qū)的最大長度。
GPRS模塊主要是為了實現(xiàn)無線網(wǎng)絡(luò)數(shù)據(jù)傳輸,因此,需要對GPRS模塊連接網(wǎng)絡(luò)進行設(shè)置啟動。設(shè)置流程如圖2所示。
圖2 GPRS連網(wǎng)流程圖
如圖2所示,GPRS連接網(wǎng)絡(luò)需要設(shè)置一些連接網(wǎng)絡(luò)準備條件,如連接網(wǎng)絡(luò)數(shù)據(jù)收發(fā)格式、設(shè)置用戶名和密碼等。首先,為了發(fā)送數(shù)據(jù)方便,關(guān)閉發(fā)送數(shù)據(jù)時帶上“<>”標記號,并且關(guān)閉接收數(shù)據(jù)時帶上IP包頭,這主要是在接收數(shù)據(jù)的時候為解析IP數(shù)據(jù)包提供方便。然后是設(shè)置用戶名和密碼。最后,建立一個TCP連接,在“IP地址”填寫需要連接的IP地址,且服務(wù)器和客戶端端口號設(shè)置應(yīng)一致,建立TCP連接主要是提高數(shù)據(jù)傳輸?shù)目煽啃?,TCP是面向可靠連接的,這樣就完成了GPRS無線網(wǎng)絡(luò)TCP通信,可以進行TCP無線網(wǎng)絡(luò)連接。
服務(wù)器需要與GPS定位終端實現(xiàn)GPRS無線通信,因此,服務(wù)器需要建立網(wǎng)絡(luò)連接。
VC下的MFC[3]提供了豐富的網(wǎng)絡(luò)套接字處理函數(shù),處理流程如圖3所示。
圖3 服務(wù)器網(wǎng)絡(luò)連接流程圖
首先,需要為服務(wù)器和客戶端創(chuàng)建網(wǎng)絡(luò)套字,通過套字來進行網(wǎng)絡(luò)通信,在創(chuàng)建好套字之后,必須把網(wǎng)絡(luò)事件關(guān)聯(lián)到窗口事件中。MFC中通過函數(shù)WSAAsyncSelect將網(wǎng)絡(luò)事件關(guān)聯(lián)到窗口中,在網(wǎng)絡(luò)事件關(guān)聯(lián)處理完成之后,可以讀入窗口中輸入的IP地址和端口號,然后使用bind函數(shù)綁定IP地址和端口號,最后,使用listen函數(shù)偵聽客戶端連接。
電子地圖是GPS車載定位的最終目的,是通過服務(wù)器Web瀏覽器實現(xiàn)下載Google電子地圖定位的,所以需要實現(xiàn)服務(wù)器的Web網(wǎng)頁瀏覽。
在MFC下添加Web瀏覽器控件。只需要用m_web?Browser.Create函數(shù)創(chuàng)建一個Web瀏覽事件,通過這個事件實現(xiàn)Web網(wǎng)頁瀏覽,然后使用函數(shù)m_webBrowser.Navi?gate函數(shù)連接需要連接的網(wǎng)頁。針對 Navigate(URL,NULL,NULL,NULL)中的參數(shù)URL做一個詳細的說明。
URL是Web瀏覽器需要瀏覽的網(wǎng)頁,由于GPS定位需要瀏覽到Google電子地圖網(wǎng)頁,所以,需要對Google電子地圖網(wǎng)頁訪問參數(shù)詳細了解。下面是一個Google靜態(tài)電子地圖網(wǎng)頁地址的格式:
其中:center是地圖的中心位置,一般輸入經(jīng)度和緯度;size是電子地圖的總大?。粃oom是電子地圖的放大比例;maptype是地圖的移動方式;markers是中心點標記;key是網(wǎng)址申請密鎖;sensor是使用用戶傳感器確定用戶位置。
有了Google靜態(tài)地圖網(wǎng)頁的具體參數(shù)格式,就可以根據(jù)這些參數(shù)得到所需要的電子地圖。通過GPS模塊得到車輛的經(jīng)緯度定位信息,在URL參數(shù)center后面填寫GPS定位信息即可,然后在markers后面同樣給出定位點標記方式,最后設(shè)置電子地圖大小和縮放比例,并把包含所有Google地圖參數(shù)信息的URL作為Web網(wǎng)頁的訪問地址,就可以下載到GPS定位電子地圖。
由于通過Web網(wǎng)頁下載的地圖只是網(wǎng)頁形式的地圖,要通過CSocket網(wǎng)絡(luò)套接字傳輸?shù)貓D。首先,需要將網(wǎng)頁地圖轉(zhuǎn)換為Bmp位圖格式形式保存起來,然后再將Bmp位圖電子地圖轉(zhuǎn)換為BYTE數(shù)組格式通過CSocket網(wǎng)絡(luò)套接字傳輸出去。
VC的WebBrowser控件有一個函數(shù)URLDownloadTo?File,可以實現(xiàn)將Web下載的電子地圖保存起來,該函數(shù)完整格式為:URLDownloadToFile(NULL,URL,PATH,0,NULL),只要在PATH下面給出網(wǎng)頁圖片的存放路徑,就可以將網(wǎng)頁下載的電子地圖保存。
電子地圖下載完成之后,需要將電子地圖轉(zhuǎn)換成BYTE形式保存,才能直接發(fā)送到GPRS無線網(wǎng)絡(luò)接收端。Bmp位圖包含4個內(nèi)容[4],即位圖頭文件、位圖信息頭、位圖彩色表和位圖數(shù)據(jù)。位圖頭文件包含了位圖標示、位圖總大小和位圖信息頭地址到實際像素數(shù)據(jù)之間的字節(jié)偏移量;位圖信息頭文件包含了位圖大小、高度、單位像素占用比特位數(shù)分辨率等信息;位圖彩色表包含RGB三色度的分量強度;位圖數(shù)據(jù)就是實際位圖像素存放數(shù)據(jù)。根據(jù)位圖的內(nèi)容信息,一幅位圖的所有信息都在位圖數(shù)據(jù)中,位圖頭文件和位圖信息頭文件包含了位圖的一些參數(shù)數(shù)據(jù),所以,要實現(xiàn)位圖保存到BYTE類型的數(shù)組中,就需要將位圖的頭文件、信息頭文件和位圖數(shù)據(jù)都讀入BYTE類型的數(shù)組中。具體算法如圖4所示。
如圖4所示,首先,讀入位圖的頭文件,頭文件中包含了位圖文件類型(bfType)、文件大?。╞fSize)和位圖頭文件地址到位圖數(shù)據(jù)之間的偏移量(bfOffBits)這幾個重要信息,由位圖類型檢查讀入文件是否為Bmp位圖,標志為“BM”,由文件大小檢查Bmp位圖是否損壞;位圖信息頭的大小等于位圖頭文件地址到位圖數(shù)據(jù)之間的偏移量減去位圖頭文件大小,計算式(偽代碼)為:
圖4 位圖轉(zhuǎn)換為BYTE數(shù)組保存算法流程圖
位圖數(shù)據(jù)大小等于位圖文件大小減去位圖頭文件地址到位圖數(shù)據(jù)之間的偏移量,計算式(偽代碼)為:
有了位圖信息頭文件大小和位圖數(shù)據(jù)大小,就可以在內(nèi)存空間中申請位圖相應(yīng)信息數(shù)據(jù)的存放空間,然后將這些位圖數(shù)據(jù)復(fù)制到申請的內(nèi)存空間,可以使用VC提供的file.Read函數(shù)實現(xiàn)位圖數(shù)據(jù)的復(fù)制。
服務(wù)器主要實現(xiàn)3個功能,即連接GPRS無線網(wǎng)絡(luò)、電子地圖的獲取和處理。
首先,服務(wù)器連接GPRS無線網(wǎng)絡(luò),連接成功之后,開始接收GPRS傳輸過來的數(shù)據(jù),包含一些對于電子地圖的處理功能指令,主要有3個指令:獲取電子地圖指令、放大電子地圖指令和縮小電子地圖指令;其次,在接收到GPRS指令之后,服務(wù)器需要根據(jù)接收到的指令構(gòu)建Web瀏覽器的URL連接Google電子地圖地址,設(shè)置好連接參數(shù);最后,將Web瀏覽器接收的電子地圖處理并發(fā)送到GPRS無線網(wǎng)絡(luò)終端。整個流程如圖5所示。
首先,服務(wù)器需要實現(xiàn)與GPRS無線網(wǎng)絡(luò)連接,在VC中,需要使用CSocket網(wǎng)絡(luò)套接字實現(xiàn)與GPRS模塊的點對點連接,連接成功后,服務(wù)器開始偵聽GPRS網(wǎng)絡(luò)通信連接,當接收到GPRS傳送過來的控制指令之后,判斷是否獲取電子地圖的數(shù)據(jù),如果是,就將這些數(shù)據(jù)構(gòu)建Web訪問Google電子地圖網(wǎng)頁的URL,從Google電子地圖網(wǎng)頁上獲取GPS定位地圖。在獲取到需要的電子地圖之后,接下來就是對電子地圖的處理。
圖5 服務(wù)器系統(tǒng)流程圖
電子地圖是以網(wǎng)頁的形式下載到服務(wù)器VC控制界面上的,需要先將電子地圖保存成Bmp位圖格式,為了方便網(wǎng)絡(luò)傳輸,還需要將保存的Bmp位圖轉(zhuǎn)換成BYTE數(shù)組格式,最后通過網(wǎng)絡(luò)發(fā)送到車載終端,由GPRS無線網(wǎng)絡(luò)通信模塊接收數(shù)據(jù)并保存,最后將保存的圖片數(shù)據(jù)在終端顯示出來。
GPS定位信息接收數(shù)據(jù)打印輸出如圖6所示,從圖6中可以看到GPS協(xié)議格式幾個常見參數(shù)的信息,如GGA,GLL等信息,并且給出了經(jīng)緯度提取出來的信息,根據(jù)GPS接收的經(jīng)緯度信息可以直接用來作為服務(wù)器定位參數(shù)。服務(wù)器端仿真圖如圖7所示,在接收到GPRS無線網(wǎng)絡(luò)傳輸過來的經(jīng)緯度信息之后,開始下載電子地圖,顯示結(jié)果如圖7所示,并自動完成對圖片的處理,并發(fā)送到GPRS終端,完成GPS定位終端電子地圖的下載。結(jié)果可靠、正確。
針對GPS定位系統(tǒng)中地圖獲取問題,提出了一個基于Web瀏覽器下載Google定位地圖的方案。該方案詳細地分析了GPS定位信息獲取和GPRS無線網(wǎng)絡(luò)通信實現(xiàn),并通過GPRS將GPS定位信息發(fā)送到VC制作的服務(wù)器,服務(wù)器在接收到GPS定位信息后構(gòu)建Web網(wǎng)頁訪問Google地圖網(wǎng)址URL,并最后實現(xiàn)GPS定位地圖的下載,通過對下載地圖處理,實現(xiàn)將地圖傳輸?shù)紾PS定位終端,最終實現(xiàn)Web瀏覽器下載和處理GPS定位地圖。整個設(shè)計可靠,而且解決了圖片網(wǎng)絡(luò)傳輸?shù)碾y題,并且地圖獲取方案簡單,具有很好的市場應(yīng)用價值。
[1]張志強,王才.基于GPS/GPRS的車輛監(jiān)控系統(tǒng)中車載臺的設(shè)計[J].自動化與儀器儀表,2007(5):17-19.
[2]劉憲鵬,吳長貴,凌筱清.基于GPRS遠程顯示系統(tǒng)的設(shè)計與實現(xiàn)[J].微計算機信息,2011,27(1):124-126.
[3]劉銳宇,梁水,宋坤.Visual C++開發(fā)技術(shù)大全[M].北京:人民郵電出版社,2009.
[4]徐慧.Visual C++數(shù)字圖像實用工程案例精選[M].北京:人民郵電出版社,2004.