1引言
實時操作系統()是嵌入式應用軟件的基礎和開發平臺,應用程序都是建立在它之上。實時嵌入式操作系統的種類繁多,大體上可分為兩種:商用型和免費型。商用型的實時操作系統功能穩定、可靠,有完善的技術支持和售后服務,但價格昂貴。免費型的實時操作系統在價格方面具有優勢,目前主要有、μC/OS等。
與其它嵌入式操作系統相比,嵌入式具有開放源代碼、高可靠性以及強大的網絡功能等優勢,因此選用了嵌入式系統作為移動終端的軟件平臺。
2車輛概述
車輛是融全球定位技術()、地理信息技術(GIS)和通用分組無線業務()于一體的高科技系統,由移動終端、網絡和監控中心組成[1]。移動終端安裝在各個移動車輛上,其上的接收器實時采集衛星定位信息,然后通過串口1傳送給ARM處理器。ARM處理器先解算出有用的數據(經緯度、速度、狀態等),然后按照TCP/UDP協議的格式封裝成TCP/UDP數據包,接著加上IP報頭和報尾封裝成IP數據報。由于ARM處理器與通信模塊之間的通信遵循PPP(PointtoPointProtocol,點對點協議),因而,需要將IP數據報按照PPP幀的幀格式封裝成PPP幀,然后傳遞給接在串口2上的GPRS通信模塊。GPRS通信模塊通過無線鏈路將數據進一步發送到SGSN(ServingGPRSSupportNode,GPRS業務支持節點)。SGSN進行相應的協議轉換,并按照GPRS特有的GTP(GPRSTunnelProtocol,GPRS隧道協議)將數據封裝成GTP包,然后通過GPRS骨干網傳送到相應的GGSN(GatewayGPRSSupportNode,GPRS網關支持節點)。GGSN也進行相應的協議轉換,再根據外部數據網的協議格式對數據進行新的封裝,并且根據其目的IP地址選擇路由進行傳送,從而最終傳送到監控中心。監控中心在具有地理信息處理和查詢功能的電子地圖上進行車輛運動軌跡的顯示,并對被監控車輛的準確位置、速度、運動方向、行車狀態等參數進行監控和查詢。同時,監控中心也可以向移動終端發送文本信息和控制命令。
由此可見,移動終端的核心功能是接收信號、處理GPS數據以及通過GPRS網絡與監控中心進行通信(包括向監控中心發送定位信息和接收監控中心的指令)。
3移動終端軟件系統的設計
3.1總體設計
在移動終端上,軟件系統主要由三個部分組成:GPS信號接收程序、GPS數據處理程序和GPRS通信程序。在嵌入式Linux系統平臺下,移動終端的軟件系統結構如圖1所示。
3.2GPS信號接收程序
對于移動終端,它的第一個任務就是接收GPS信號。在嵌入式Linux系統平臺下,GPS信號接收程序的層次結構如圖2所示。
其中,tty層、N_TTY行規程(LineDiscipline)層和低層驅動程序是嵌入式Linux系統中串行通信驅動模塊三個固有的邏輯層,這三層之間有相互調用的接口函數。嵌入式Linux系統提供了多種行規程供各類設備進行選擇,如:TTY行規程(N_TTY)用于連接終端輸入驅動設備和終端顯示驅動設備,而PPP行規程(N_PPP)用來連接終端驅動設備和網絡驅動設備。GPS信號接收程序使用了N_TTY行規程,GPS接收器接收到的數據必須經過N_TTY行規程模塊進行規范處理。低層驅動程序用來直接對硬件進行操作,而_buffer是低層驅動程序和N_TTY行規程之間的高速接口,它保存GPS接收器接收到的數據。
在嵌入式Linux系統中,內核給接在串口1上的GPS接收器提供了一個設備節點/dev/ttyS0以及標準的文件系統接口[2]。這樣,GPS信號接收程序對設備節點/dev/ttyS0的操作就會被內核映射成對GPS接收器的操作。當GPS接收器接收到衛星信號時,會觸發低層驅動程序事先注冊到系統中的中斷處理函數,從而調用函數receive_chars()把數據填充到_buffer中,然后調用函數tty__buffer_()將數據傳遞給N_TTY行規程模塊。N_TTY行規程模塊中的函數n_tty_receive_buf()對數據進行規范化處理后將其存入tty緩沖區中,供應用層的GPS信號接收程序來讀取。
當應用層的GPS信號接收程序開始運行時,它會向文件系統發出讀請求,文件系統發現此請求的對象為tty設備,于是調用函數tty_(),接著調用函數_chan()讀取tty緩沖區中的數據。
3.3GPS數據處理程序
GPS接收器與嵌入式Linux平臺之間的通信協議有很多種,這里采用的通信協議是NMEA-0183,它規定了GPS數據的輸出速率為4,800波特,其輸出都是字符,工作模式為8-N-1。通信協議NMEA-0183中包含的語句有GPGGA、GPGLL、GPGSA、GPGSV、GPRMC、GPVTG等,要想知道車輛的位置信息,至少要提取出GPGGA、GPGLL、GPRMC中的一種。NMEA-0183協議報文的語句格式如圖3所示。
其中,$為串頭,表示串的開始;AA為識別符;XXX為語句名;ddd…ddd為數據字段,字母或數字;*表示串尾;hh表示$與*之間所有字符代碼的校驗和;《CR》為回車控制符;《LF》為換行控制符。
在車輛中,主要關心的是時間、車輛的位置和速度等信息。因此,在移動終端上,GPS數據處理程序的主要功能是從GPS接收器接收到的數據中提取出GPRMC定位語句,忽略掉信息[3]。此后,移動終端上的GPRS通信程序負責將相關的數據發送給監控中心。
3.4GPRS通信程序
3.4.1撥號到GPRS網絡的基本原理
移動終端要想通過GPRS通信模塊訪問,首先得附著在GPRS網絡上,然后發起(PacketDataProtocol,分組數據協議)上下文激活過程[4],如圖4所示。只有通過此過程,GPRS通信模塊才能與GGSN建立一條邏輯通路,從而訪問。
3.4.2移動終端上撥號程序的實現
在嵌入式Linux系統平臺下,移動終端利用pppd(包含)撥號到GPRS網絡。pppd是一個用戶空間的后臺服務進程(),而是pppd所帶一個輔助工具,用來與GPRS通信模塊建立會話。在上下文激活過程中,完成了第①步,而pppd完成了第②、③、④、⑩步。pppd撥號程序的層次結構如圖5所示。
其中,N_PPP層就是PPP協議層。PPP協議模塊不僅提供簡單的數據鏈路層功能,它還提供諸如鑒權(如PAP/),數據壓縮/解壓(如CCP)和數據加密/解密(如ECP)等擴展功能。由于GPRS通信程序要求透明化地使用這些擴展功能,而PPP協議模塊本身無法對各種策略進行選擇,于是pppd應運而生。PPP協議模塊中策略性的內容都移到了pppd中,由pppd完成對鑒權、壓縮/解壓和加密/解密等擴展功能的選用。
在運行pppd的時候,pppd首先讀取配置文件中的配置信息,其中包含了設置PPP協議模塊的參數、GPRS通信模塊連接的端口(/dev/ttyS1)以及對chat進行調用的語句,等等。隨后pppd調用chat,chat也會讀取相應的配置文件(其中包含一些應答語句對和AT命令),然后使用默認的行規程N_TTY向GPRS通信模塊發送AT命令,接著chat將控制權返還給pppd。pppd將行規程切換為N_PPP,而pppd與PPP協議模塊之間采用了設備文件來進行通信,設備文件名是/dev/ppp。通過系統調用,pppd可以讀取PPP協議模塊的數據包(當然,PPP協議模塊只會把應該由pppd處理的數據包發給pppd)。通過write系統調用,pppd可以把要發送的數據包傳遞給PPP協議模塊,而通過系統調用,pppd可以設置PPP協議模塊的參數,可以建立/關閉連接。
此后,pppd執行了PDP上下文激活過程的第②、③、④步。等PDP上下文激活過程的第⑤-⑨步(與移動終端不直接相關)完成之后,pppd執行第⑩步,在函數_ppp_()中調用(PPPIOCNEWUNIT)創建一個網絡接口(如ppp0)。當PPP協議模塊在處理PPPIOCNEWUNIT時,調用函數register_netdev()向內核注冊PPP網絡接口,該網絡接口的傳輸函數指向函數ppp_start_xmit()。值得注意的一點是,如果關閉進程pppd,行規程會由N_PPP切換回默認的N_TTY,因此,在移動終端與監控中心通信的過程中不能關閉pppd進程。
至此,移動終端完成了向GPRS網絡的撥號,這樣它就擁有了一個可以用于與監控中心進行通信的網絡接口(如ppp0)。
3.4.3移動終端與監控中心的數據交互
前面,移動終端已經與監控中心建立了網絡鏈接。接下來,移動終端就可以與監控中心進行通信了。GPRS通信程序的層次結構如圖1的右半部分所示。
在移動終端向監控中心發送定位信息的過程中,移動終端上的GPRS通信程序通過socket接口發送TCP/IP數據包,內核根據IP地址和路由表,找到PPP網絡接口,然后調用函數ppp_start_xmit(),此時控制權就轉移到了PPP協議模塊。函數ppp_start_xmit()調用函數ppp_xmit_process()去發送隊列中的所有數據包,而函數ppp_xmit_process()會進一步調用函數ppp_send_frame()去發送單個數據包。函數ppp_send_frame()根據前面pppd對PPP協議模塊的設置調用壓縮等擴展功能之后,又經函數ppp_()調用函數pch-》chan-》ops-》start_xmit()發送數據包。函數pch-》chan-》ops-》start_xmit()是具體的傳輸方式,對于串口發送方式,則是ppp_async.c:ppp_asynctty_open中注冊的函數ppp_async_send(),函數ppp_async_send()經函數ppp_async_()調用函數tty-》driver-》write()(定義在低層驅動程序中)把數據發送到串口2(GPRS通信模塊接在串口2上)。
ppp_async.c在初始化時(ppp_async_init),調用函數tty_register_ldisc()向tty注冊了行規程N_PPP的處理接口,也就是一組回調函數。在移動終端接收監控中心指令的過程中,當GPRS通信模塊收到數據時,就會回調N_PPP行規程中的函數ppp_asynctty_receive()來接收數據。函數ppp_asynctty_receive()調用函數ppp_async_input()把數據buffer轉換成sk_buff,并放入接收隊列ap-》rqueue中。ppp_async另外有一個tasklet(ppp_async_process)專門處理接收隊列ap-》rqueue中的數據包,ppp_async_process一直掛在接收隊列ap-》rqueue上,一旦被喚醒,它就調用函數ppp_input()讓PPP協議模塊處理該數據包。在函數ppp_input()中,數據被分成兩路,一路是協議控制數據包,放入隊列pch-》file.rqb中,交給pppd處理。另外一路是用戶數據包,經函數ppp_do_recv()、ppp_receive_frame()進行PPP協議相關的處理后,再由函數netif_rx()提交給上層的TCP/IP協議模塊進行處理,最后經socket接口傳遞給應用層的GPRS通信程序。
4總結
近幾年,智能交通系統(包括車輛監控系統)發展非常迅速,因此,移動終端將會有非常廣泛的應用前景。隨著市場需求的不斷擴大,更加豐富的功能將會被集成到移動終端上,而嵌入式Linux系統憑借其自身的優勢將會被越來越多地應用到這個領域。
評論
查看更多