車聯(lián)網(wǎng)監(jiān)控中心的研究與設(shè)計
在數(shù)據(jù)庫的表格中,設(shè)計的字段主要有車主、車牌號、車型、經(jīng)度、緯度、速度、前左車門、前右車門、后左車門、后右車門、前端蓋、后端蓋、故障代碼和駕駛員疲勞狀態(tài)等,在收到了GPRS發(fā)送過來的數(shù)據(jù)之后,根據(jù)協(xié)議進(jìn)行解碼,將其中的數(shù)據(jù)分別存入對應(yīng)的數(shù)據(jù)庫當(dāng)中。向數(shù)據(jù)庫中新增數(shù)據(jù)的代碼如下:
本文引用地址:http://butianyuan.cn/article/245925.htmAdodc1.Recordset.AddNew '將數(shù)據(jù)寫入數(shù)據(jù)庫
Adodc1.Recordset("車主") = chezhu
Adodc1.Recordset("車牌號") = chepaihao
Adodc1.Recordset("車型") = chexing
. . . . . .
Adodc1.Recordset.Update
上面的chezhu、chepaihao、chexing等變量都是獲得了車載終端數(shù)據(jù)的全局變量,利用這種方式可以將數(shù)據(jù)存入到數(shù)據(jù)庫對應(yīng)的字段當(dāng)中,便于查詢、使用和保存。
2 Android手機(jī)客戶端設(shè)計
2.1 Android中Socket通信設(shè)計
Android中提供了一個Socket的類,存在于“java.net.Socket”包中。首先要設(shè)定連接服務(wù)器的公網(wǎng)IP以及端口號,同時以輸入流InputStream()的形式來獲取從服務(wù)器傳過來的數(shù)據(jù),然后從輸入流中讀取相應(yīng)的數(shù)據(jù)存入緩沖區(qū),最后讀取緩沖區(qū)即可以得到所需要的數(shù)據(jù)。把接收到的數(shù)據(jù)存在一個字符串里面,根據(jù)Android手機(jī)客戶端和PC上位機(jī)的協(xié)議進(jìn)行數(shù)據(jù)的解碼,再把解碼后的數(shù)據(jù)存入到相應(yīng)的字段當(dāng)中,比如經(jīng)度、緯度、速度、駕駛員疲勞狀態(tài)等等。
使用手機(jī)也可以向PC機(jī)發(fā)送數(shù)據(jù)和指令,比如點(diǎn)擊了“車輛監(jiān)控”按鈕時,就需要向PC機(jī)發(fā)送指令,再通過PC機(jī)來控制車輛,從而達(dá)到手機(jī)監(jiān)控車輛的效果。當(dāng)手機(jī)需要向PC機(jī)發(fā)送數(shù)據(jù)時,建立Socket連接之后,是通過輸出流來實(shí)現(xiàn)的,先定義好所要發(fā)送的數(shù)據(jù),再用outputStream.write()語句來將數(shù)據(jù)發(fā)送到Socket服務(wù)器。
由于Socket在連接通信的時候有可能會出現(xiàn)異常,所以系統(tǒng)要求加入用來捕捉和處理異常的try-catch語句。程序運(yùn)行正常時,執(zhí)行try{}里面的代碼;當(dāng)出現(xiàn)異常時,執(zhí)行catch里面的語句捕捉和處理異常。Android中Socket通信的部分代碼如下。
try{
Socket Socket = new Socket("125.216.144.177",8091); //實(shí)例化Socket
InputStream indata = Socket.getInputStream(); //獲得從服務(wù)器傳過來的數(shù)據(jù)
byte[] buffer = new byte[indata.available()]; //緩沖區(qū)
indata.read(buffer); //讀取緩沖區(qū)
String msg = new String(buffer); //轉(zhuǎn)換字符串
System.out.println(msg); //將得到的數(shù)據(jù)進(jìn)行輸出
String[] arr= msg.split(","); //以“,”分割收到的數(shù)據(jù),存入arr[]數(shù)組當(dāng)中
OutputStream outputStream = Socket.getOutputStream(); //獲得輸出流,向服務(wù)器發(fā)送數(shù)據(jù)
byte[] buffer2 = new byte[1111] ; //定義要發(fā)送的數(shù)據(jù)
outputStream.write(buffer2, 0, 6); //開始發(fā)送數(shù)據(jù)
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace(); }
2.2 Android中電子地圖的加載與糾偏
近幾年隨著Android操作系統(tǒng)的興起,越來越多的地圖供應(yīng)商都提供了Android地圖的SDK(軟件開發(fā)包),在Android中開發(fā)地圖加載的流程如下[5]:
Android程序在開發(fā)地圖時,需要在“AndroidManifest.xml”列表中添加多個應(yīng)用權(quán)限,保證電子地圖能夠正確加載。
然后進(jìn)行初始化設(shè)置,在“SetupMap”函數(shù)中,需要設(shè)置地圖視圖、設(shè)置縮放尺度、將指定坐標(biāo)設(shè)置為地圖中點(diǎn)。
“MapView”類的“setTraffic”方法可以設(shè)置顯示地圖視圖的模式,地圖視圖的模式有衛(wèi)星圖map.setSatellite(true)、一般地圖map.setTraffic(true)、街道圖map.setStreetView。“MapController”類的“setZoom”方法可以控制地圖的縮放尺度。由全球地圖(1)到街道地圖(21),數(shù)值越大地圖細(xì)節(jié)越詳細(xì)。
Android通過“Geopoint”類來定義坐標(biāo),“Geopoint”接受的兩個參數(shù)分別是“緯度”、“經(jīng)度”值,需要以整數(shù)來表示。“Geopoint”接受的緯度和經(jīng)度手機(jī)通過Socket從上位機(jī)獲取,然后通過實(shí)例化GeoPoint ()對象,在GeoPoint ()輸入緯度和經(jīng)度即可以實(shí)現(xiàn)地圖的加載[6]。
GeoPoint point = new GeoPoint((int)(weidu),(int)(jingdu));
無論是Google地圖還是百度地圖,GPS坐標(biāo)直接輸入加載處理的位置是有偏差的,論文使用百度地圖提供的在線API坐標(biāo)轉(zhuǎn)換接口來實(shí)現(xiàn)糾偏,其語句為
GeoPoint point2 =CoordinateConvert.bundleDecode(CoordinateConvert .
fromWgs84ToBaidu(point));進(jìn)行轉(zhuǎn)換之后可以很好的解決坐標(biāo)偏移的問題,測試結(jié)果表明定位誤差在5米以內(nèi)。
為了在地圖上標(biāo)示車輛所在的位置,需要添加一個定位圖標(biāo)。在Android電子地圖中屬于覆蓋物,所有的覆蓋物都繼承“Overlay”類,本次設(shè)計自定義一個CustomItemizedOverlay子類,繼承ItemizedOverlay類,用來實(shí)現(xiàn)標(biāo)注定位圖標(biāo)和定位文字的功能。
3 系統(tǒng)的測試與結(jié)論
在設(shè)計好監(jiān)控中心和手機(jī)客戶端之后,配合硬件進(jìn)行測試,監(jiān)控中心要具備公網(wǎng)IP,圖4和圖5為監(jiān)控中心的部分界面展示,圖6為Android手機(jī)客戶端界面。
從以上測試結(jié)果可知,本次車聯(lián)網(wǎng)系統(tǒng)的設(shè)計達(dá)到了預(yù)期目標(biāo),系統(tǒng)總體運(yùn)行流暢,上位機(jī)監(jiān)控中心和Android手機(jī)能夠正確顯示車輛的基本信息、精確顯示車輛的位置、對車輛進(jìn)行監(jiān)控和控制、警示駕駛員是否疲勞等,便于車輛的管理、監(jiān)控、調(diào)度、遠(yuǎn)程診斷等,為我國的智能交通行業(yè)的發(fā)展提供有力的參考。
評論