新聞中心

        EEPW首頁 > 汽車電子 > 設計應用 > 基于GPRS的車輛監控系統技術研究

        基于GPRS的車輛監控系統技術研究

        作者: 時間:2012-03-30 來源:網絡 收藏

        CP和UDP協議同在傳輸層,由于本系統每次傳輸的數據量小而且突發性強,所以采用UDP協議傳輸數據。UDP協議的主要作用是將網絡數據流壓縮成數據報的形式。一個典型的數據報就是一個二進制數據的傳輸單位。UDP協議為不可靠的傳輸協議,不提供數據傳送的保障機制。如果在從發送方到接收方的傳遞過程中出現數據報的丟失,協議本身并不能做出任何檢測或提示。因此,必須在應用層的協議中添加保障信息傳輸可靠性的確認機制。監控中心向終端下傳數據時,要求終端返回接收正確或錯誤的確認信息,監控中心收到正確的確認信息后數據下傳進程才完畢。否則,監控中心將在規定的時間內重發,直到收到正確的確認信息或發送次數標志溢出才終止。
        網絡UDP端口資源十分緊缺,變化很快;UDP由于自身特點,以及網絡UDP端口資源的有限性,在一段時間沒有數據流量后,端口容易改變,產生的影響就是從服務器中心端向終端發送數據,GPRS終端接收不到。原因是移動網關從中做了中轉,需要隔一定時間給主機發UDP包來維持該IP和端口號,這樣主機就能主動給GPRS發UDP包,筆者在測試中發現,這個間隔時間很短,約1 min發一次UDP包才能夠維持,再長時間移動網關那邊就要丟失這個端口了,逾期主機想主動發數據給終端,將無法送達。只有GPRS終端設備重新發一個UDP包過去,移動再分配一個中轉IP和端口,才能夠進行雙向通信。為保證端口有效性和數據實時性,終端設備每5 s發送一條包含定位和狀態的數據給服務器。
        2.2 基于C#發送、接收UDP數據包使用的主要方法
        (1)UDP數據類。用Visual C#實現UDP協議,最為常用,也是最為關鍵的類就是UdpClient,UdpClient位于命名空間System.Net.Sock ets中,Visual C#發送、接收UDP數據包都是通過UdpClient類的。UdpClient類主要有以下幾個方法,見表1。

        本文引用地址:http://www.104case.com/article/197032.htm

        b.jpg


        (2)接受終端UDP數據。接收UDP數據包使用的是UdpClient中的“Receive”方法。此方法的調用語法如下:public byte[]Receive(ref IPEndPoint remoteEP);參數remoteEP是一個IPEndPoint類的實例,它表示網絡中發送此數據包的節點。下面就是通過偵聽本地端口號“8 080”來獲取信息代碼:
        UdpClient server=new UdpClient(8080);
        IPEndPoint receivePoint=new IPEndPoint(IPAddress.Any,0);
        byte[]recData=server.Receive(ref receivePoint);
        recData就是接受到的UDP報文,其中UDP包頭結構如下:源端口16位,目的端口16位,長度16位,校驗和16位;上文中闡述了GPRS的UDP端口非常緊缺,隨時會變化,在每次接受到UDP報文后,必須記錄源端口、IP地址。receivePoint參數是引用類型,receive到新的UDP后,receivePoint對象的address和port屬性值就是發送源的IP地址和端口。這個IP和端口未必是真的終端的IP和端口。因為終端上的應用程序綁定本地一個端口(比如是9002),通過這個端口發送請求給路由器,路由器由此記錄下終端的內網IP和端口(9002),然后路由器分配自己的一個空閑端口(比如是7000),通過這個端口(7000)發送請求給監控中心。而對于監控中心,它沒有任何關于終端的信息,它要做的只是回信息到路由器的外網IP的7000這個端口。路由器收到發送到其7000端口的數據后會再轉發給終端。
        (3)發送UDP數據報。發送UDP數據報使用“Send”方法。“Send”方法的調用語法如下:public int Send(byte[]dgram,int bytes,IPEndPoint endPoint);參數說明:dgram要發送的UDP數據文報(以字節數組表示)。bytes數據文報中的字節數。endPoint一個IPEndPoint,它表示要將數據文報發送到的主機和端口。返回值是已發送的字節數。下面使用UDPClient發送UDP數據包的具體的調用例子:
        c.jpg
        該代碼實現了對某終端發送UDP報文后的回復。如果需要主動向終端發送報文則需要從數據庫中提取該終端最近一次的IP和端口號,調用該方法發送內容。
        2.3 數據封裝和轉存
        監控中心與客戶端的數據通信包含2種:一種是上行數據,一種是下行數據。上行數據包含終端匯報車輛的狀態信息,車輛實時信息,車輛語音信息,視頻信息等。下行信息包含對終端的回應,車輛的實時控制等信息。數據種類大約一百多種,可分為20多種格式。針對每種格式定義一個結構進行數據接受和轉存到數據庫,進行數據顯示和分析。終端返回數據一般是結構類型,為保證數據轉換準確和便捷,C#也使用同樣的結構對數據進行接受。上文中UDP報文接受到的正文是byte類型,該byte內容有報文頭和報文類型、校驗部分和正文構成。根據報文類型找到對應的C#結構體structType。利用Marshal.SizeOf(structType);獲取結構體大小,并進行分配空間:IntPtrstructPtr=Marsh al.AllocHGlobal(size);然后將byte數組拷到分配好的內存空間:Marshal.Copy(recData,0,structPtr,size);將內存空間轉換為目標結構體objectobj=Marshal.PtrToStructure(structPtr. struct Type)。為提高系統的實時響應速度,這些數據分為2種處理方式,如非緊急數據直接保存到數據庫,而如果是緊急數據,比如車輛報警數據,車輛控制數據則直接通過Socket連接發送到Web服務器,由Web服務器推送到瀏覽器監控端。

        3 結語
        本文主要分析了監控系統的GPRS通信技術,詳細介紹了基于GPRS的UDP數據通信流程和方法,實現了C#環境下接受,發送UDP數據報文,協議的定制,數據轉存等關鍵技術。本文解決的問題是監控系統的核心內容,但并不是全部,一個完整的系統還應包括終端硬件設計以及后臺監控軟件、GIS地圖顯示等許多方面。今后,應通過進一步的研究。解決系統其他相關技術。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 泗洪县| 禹州市| 西林县| 阿城市| 绥滨县| 观塘区| 鹤壁市| 自治县| 淄博市| 南华县| 阿勒泰市| 徐水县| 濉溪县| 东至县| 双城市| 行唐县| 沧源| 巴塘县| 新泰市| 高邮市| 岫岩| 南郑县| 旌德县| 顺义区| 龙山县| 昌图县| 佛坪县| 浙江省| 万源市| 蚌埠市| 固原市| 依兰县| 西华县| 克拉玛依市| 景谷| 东乌| 凤山市| 都安| 荃湾区| 阿拉善右旗| 日土县|