《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于嵌入式Linux的3G無(wú)線視頻終端的設(shè)計(jì)與實(shí)現(xiàn)
基于嵌入式Linux的3G無(wú)線視頻終端的設(shè)計(jì)與實(shí)現(xiàn)
摘要: 本文在一塊ARM開(kāi)發(fā)板上實(shí)現(xiàn)了多種功能,包括無(wú)線數(shù)據(jù)視頻終端,通過(guò)外接視頻服務(wù)器實(shí)現(xiàn)了現(xiàn)有視頻服務(wù)器的3G功能擴(kuò)展,通過(guò)采用了Netfilter與socket結(jié)合的方法,將數(shù)據(jù)包獲取功能從用戶態(tài)載入Linux內(nèi)核態(tài),避免了數(shù)據(jù)的內(nèi)存拷貝,提高了處理效率,同時(shí)引入內(nèi)核緩沖機(jī)制。解決了3G撥號(hào)延時(shí)而造成的視頻服務(wù)器丟包問(wèn)題,配合Netfilter用戶工具iptables的使用,可以在本系統(tǒng)上實(shí)現(xiàn)NAT,包過(guò)濾防火墻等功能。方便對(duì)流經(jīng)系統(tǒng)數(shù)據(jù)包的管理。
Abstract:
Key words :
 

  隨著網(wǎng)絡(luò)技術(shù)和嵌入式技術(shù)的迅猛發(fā)展,通過(guò)網(wǎng)絡(luò)來(lái)實(shí)現(xiàn)視頻監(jiān)控已經(jīng)得到了廣泛的應(yīng)用,3G網(wǎng)絡(luò)以其高帶寬使得傳輸流暢的視頻信息成為可能,本文在采用3G技術(shù)的基礎(chǔ)上設(shè)計(jì)了一款基于嵌入式Linux的無(wú)線終端,在數(shù)據(jù)處理部分采用了Linux的Netfilter架構(gòu),通過(guò)掛載鉤子函數(shù)來(lái)實(shí)現(xiàn)數(shù)據(jù)包在內(nèi)核態(tài)的獲取及高效轉(zhuǎn)發(fā),并且通過(guò)在Linux內(nèi)核開(kāi)辟一片緩沖區(qū),解決了視頻服務(wù)器與3G模塊撥號(hào)延時(shí)而造成的速率不匹配的問(wèn)題,減少了數(shù)據(jù)丟包。配合Netfilter用戶態(tài)管理工具iptables的使用,可實(shí)現(xiàn)包過(guò)濾防火墻,及NAT等功能,從而便于本系統(tǒng)對(duì)流經(jīng)其數(shù)據(jù)包的管理。

  另一方面對(duì)嵌入式Linux的視頻采集程序的設(shè)計(jì)進(jìn)行了詳細(xì)的介紹,并將其實(shí)際應(yīng)用到了本系統(tǒng)的數(shù)據(jù)采集模塊中去,完成了數(shù)據(jù)的采集工作,同時(shí)針對(duì)目前市場(chǎng)上對(duì)與3G模塊通常只提供Windows CE下的驅(qū)動(dòng)這一情況,開(kāi)發(fā)了嵌入式Linux系統(tǒng)下的3G模塊驅(qū)動(dòng)程序,在軟件設(shè)計(jì)上充分發(fā)揮了開(kāi)源軟件的優(yōu)勢(shì),采用高效的Xvidcore編解碼庫(kù),來(lái)完成視頻的編碼,以及使用PPP源碼來(lái)編譯撥號(hào)上網(wǎng)工具,成本低廉并且縮短了系統(tǒng)的開(kāi)發(fā)周期,使得本系統(tǒng)具有較強(qiáng)的工程實(shí)用價(jià)值。

  1 系統(tǒng)硬件結(jié)構(gòu)

  硬件上采用“ARM 3G模塊”系統(tǒng)架構(gòu)。ARM與3G模塊采用分離模塊的設(shè)計(jì)方法,通過(guò)USB線相連,較整體設(shè)計(jì)而言具有更好的靈活性,使得一些現(xiàn)有的以ARM為主處理器的系統(tǒng)能夠很好地?cái)U(kuò)展3G功能,便于產(chǎn)品的過(guò)渡。本系統(tǒng)的核心處理器是S3C2440A,S3C2440A是一款由SamSu-ng半導(dǎo)體公司推出的基于ARM920T內(nèi)核的16/32位RISC微處理器。內(nèi)部帶有全性能的MMU(內(nèi)存處理單元),主頻為400MHz最大可達(dá)到533MHz,提供了一個(gè)數(shù)字?jǐn)z像頭接口(Camera Interface)。具有高性能、低功耗、接口豐富和體積小等優(yōu)良特性。而3G模塊核心部件采用的是MC8630模塊,該模塊具有語(yǔ)音、短信和高速數(shù)據(jù)業(yè)務(wù)等功能,可以廣泛應(yīng)用于高速數(shù)據(jù)傳輸、安防、無(wú)線媒體、直放站監(jiān)控、鐵路終端和車載監(jiān)控等領(lǐng)域。

  系統(tǒng)硬件結(jié)構(gòu)如圖1所示。

a.jpg

  2 系統(tǒng)軟件設(shè)計(jì)

  系統(tǒng)主要由視頻采集模塊、數(shù)據(jù)處理模塊、網(wǎng)絡(luò)轉(zhuǎn)發(fā)模塊組成。

  2.1 視頻采集模塊設(shè)計(jì)

  根據(jù)項(xiàng)目的實(shí)際需要,在本系統(tǒng)中視頻數(shù)據(jù)來(lái)源主要有兩個(gè)方面:

  1)系統(tǒng)與可提供主動(dòng)上傳功能的視頻服務(wù)器通過(guò)RJ45網(wǎng)線直接相接 主要用于完成多路視頻圖像采集。視頻服務(wù)器的主要功能是將攝像頭采集的數(shù)據(jù)完成編碼壓縮,并且將壓縮的數(shù)據(jù)以IP包的形式發(fā)送給接收端,由于該類視頻服務(wù)器通常是在局域網(wǎng)內(nèi)使用,目前還很少有對(duì)于3G網(wǎng)絡(luò)的支持,隨著3G技術(shù)在國(guó)內(nèi)發(fā)展的不斷深入,將在很大程度上取代有線網(wǎng)絡(luò)。所以本系統(tǒng)可作為現(xiàn)有視頻服務(wù)器的3G功能擴(kuò)展。針對(duì)在外接視頻服務(wù)器時(shí)只需對(duì)收到的數(shù)據(jù)包進(jìn)行轉(zhuǎn)發(fā)而無(wú)需對(duì)IP數(shù)據(jù)本身做分析處理的問(wèn)題,并且在系統(tǒng)啟動(dòng)到3G模塊撥號(hào)成功獲得IP地址之間會(huì)有一定的延遲,在本系統(tǒng)中提出了采用Linux的Netfilter架構(gòu)的方法以及緩沖機(jī)制,通過(guò)在數(shù)據(jù)流經(jīng)TCP/IP協(xié)議棧時(shí)掛載鉤子函數(shù),實(shí)現(xiàn)IP數(shù)據(jù)在內(nèi)核態(tài)的獲取,并且通過(guò)在內(nèi)核開(kāi)辟一塊足夠大的環(huán)形緩沖區(qū)來(lái)存儲(chǔ)數(shù)據(jù)。由于系統(tǒng)需要頻繁對(duì)緩沖區(qū)進(jìn)行讀寫,為避免產(chǎn)生內(nèi)存碎片,在本系統(tǒng)中采用了環(huán)形隊(duì)列的數(shù)據(jù)結(jié)構(gòu)。在3G模塊獲得IP地址后,再通過(guò)驅(qū)動(dòng)讀取緩沖區(qū)中的數(shù)據(jù),由3G網(wǎng)絡(luò)完成轉(zhuǎn)發(fā),從而降低丟包率并且提高數(shù)據(jù)包的轉(zhuǎn)發(fā)效率。因?yàn)閭鹘y(tǒng)的方法是采用socket API來(lái)進(jìn)行網(wǎng)絡(luò)編程,其對(duì)數(shù)據(jù)的訪問(wèn)通常發(fā)生在用戶態(tài),對(duì)于Linux操作系統(tǒng)來(lái)說(shuō),用戶進(jìn)程的優(yōu)先級(jí)和所占用的CPU時(shí)間要遠(yuǎn)遠(yuǎn)小于內(nèi)核線程,同時(shí)內(nèi)核進(jìn)程擁有較高的執(zhí)行優(yōu)先度,故在網(wǎng)絡(luò)布局允許獲得IP數(shù)據(jù)包的條件下,將用戶態(tài)的數(shù)據(jù)包獲取功能載入內(nèi)核態(tài),可進(jìn)一步提高系統(tǒng)的處理能力,增加系統(tǒng)的有效帶寬,本方法還可用于其他對(duì)IP數(shù)據(jù)本身進(jìn)行處理并且對(duì)處理效率有苛刻要求的系統(tǒng)中,例如:本方法在本實(shí)驗(yàn)室與某航空院合作開(kāi)發(fā)的IP-TS協(xié)議轉(zhuǎn)換器上也得到了成功的應(yīng)用,具有一定的通用性。Netfilter是Linux 2.6.x系列內(nèi)核提供的一套數(shù)據(jù)包過(guò)濾框架,基于該框架的軟件能夠?qū)崿F(xiàn)如數(shù)據(jù)包過(guò)濾、網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)等功能。要使用Netfilter,在內(nèi)核編譯時(shí)設(shè)置“Network Packet Fihering”選項(xiàng)。Netfilter提供了一個(gè)抽象、通用化的框架,作為中間件,為每種網(wǎng)絡(luò)協(xié)議(IPv4、IPv6等)定義一套鉤子函數(shù)。對(duì)于Ipv4協(xié)議定義了5個(gè)鉤子函數(shù),這些鉤子函數(shù)在數(shù)據(jù)報(bào)流過(guò)協(xié)議棧的5個(gè)關(guān)鍵點(diǎn)被調(diào)用,Netfilter可以在通過(guò)TCP/IP協(xié)議棧的路徑中的幾個(gè)定義良好的點(diǎn)上捕獲數(shù)據(jù)包,IPv4中的一個(gè)數(shù)據(jù)包通過(guò)netfilter系統(tǒng)的過(guò)程如圖2所示。

b.jpg

  NF_IP_PRE_ROUTING

  在對(duì)數(shù)據(jù)包進(jìn)行初始正確性檢查(校驗(yàn)和等)后,截獲該數(shù)據(jù)包。

  NF_IP_LOCAL_IN

  如果數(shù)據(jù)包將要到達(dá)本地主機(jī),則捕獲該數(shù)據(jù)包。

  NF_IP_FORWARD

  如果數(shù)據(jù)包將要到達(dá)某些其他主機(jī),則捕獲該數(shù)據(jù)包。

  NF_IP_LOCAL_OUT

  在本地捕獲其目的地是外部的已創(chuàng)建的數(shù)據(jù)包。

  NF_IP_POST_ROUTING

  這是最后的鉤子,在此之后將傳輸數(shù)據(jù)包。

  內(nèi)核netfilter結(jié)構(gòu)在/usr/src/inelude/linux/netfilter.h中定義,類似如下:

c.jpg

  參數(shù)是:

  list

  Netfilter本身是一個(gè)鉤子鏈;它指向netfilter鉤子的頭部,通常設(shè)置為{NULL,NULL}。

  hook

  該函數(shù)在數(shù)據(jù)包碰到鉤子點(diǎn)時(shí)被調(diào)用。該函數(shù)與前面描述的函數(shù)相同,它必須返回NF_ACCEPT、NF_DROP或NF_QUEUE。如果返回NF_ACCEPT,則下一個(gè)鉤子將被附加到將要調(diào)用的點(diǎn)。如果返回NF_DROP,則數(shù)據(jù)包被丟棄。如果返回NF_QUEUE,則對(duì)數(shù)據(jù)包進(jìn)行排隊(duì)。sK_buff指針被傳遞到該函數(shù)中,并用數(shù)據(jù)包信息如IP報(bào)頭、TCP報(bào)頭等進(jìn)行填充,可以使用sk_buff結(jié)構(gòu)指針來(lái)操作或刪除數(shù)據(jù)包(要?jiǎng)h除數(shù)據(jù)包,只需將skb指針設(shè)置為空即可)。

  pf

  協(xié)議簇;例如,適用于IPv4的PF_INET。

  hooknum

  鉤子的掛載點(diǎn),由于本系統(tǒng)不需要在本地對(duì)數(shù)據(jù)包進(jìn)行任何處理,因此選擇的掛在點(diǎn)為NF_IP_PRE_ROUTING,在對(duì)數(shù)據(jù)包進(jìn)行正確性校驗(yàn)后就調(diào)用鉤子函數(shù)處理數(shù)據(jù)包。Priority表明鉤子的優(yōu)先級(jí),在本系統(tǒng)中采用高優(yōu)先級(jí)處理NF_IP_PRI_FIRST。

  內(nèi)核數(shù)據(jù)處理的關(guān)鍵是鉤子函數(shù)的編寫,此函數(shù)規(guī)定了數(shù)據(jù)包在到達(dá)時(shí)需要進(jìn)行的處理過(guò)程。

  鉤子函數(shù)框架如下:

d.jpg

  設(shè)定好特定的鉤子函數(shù)之后,調(diào)用函數(shù)

  int nf_register_hook(struct nf_hook_ops*req);

  將鉤子函數(shù)注冊(cè)至內(nèi)核。一旦該結(jié)構(gòu)注冊(cè)到內(nèi)核中,Linux將調(diào)用這里定義的函數(shù)來(lái)處理數(shù)據(jù)包。

  使用函數(shù)

  void nf_unregister_hook(struct nf_hook_ops*req);

  可以將已經(jīng)注冊(cè)入內(nèi)核的鉤子函數(shù)取消,此時(shí),接收到數(shù)據(jù)包將按照內(nèi)核的默認(rèn)規(guī)則來(lái)進(jìn)行處理。流程如圖3所示。

e.jpg

  2)直接采用CMOS攝像頭作為視頻采集裝置 該視頻采集模塊在硬件上S3C2440帶有CMOS攝像頭接口,在開(kāi)發(fā)板上通過(guò)稱為CAMERA的接口引出,并且?guī)в衏amera控制器,在本系統(tǒng)中使用了OmniVision公司的OV9650攝像頭。S3C2440支持ITU-R BT601/656格式的數(shù)字圖像輸入,支持2個(gè)通道的DMA,Preview通道和Codec通道,參見(jiàn)圖4。

f.jpg

  Preview通道可以將YCbCr4:2:2格式的圖像轉(zhuǎn)換為RGB(16bit或24bit)格式的數(shù)據(jù),并存放于為PreviewDMA分配的內(nèi)存中,最大分辨率為640×480。主要用于本地液晶屏顯示,Codec通道可以輸出YCbCr4:2:0或YCbCr4:2:2格式到為Codec DMA分配的內(nèi)存中。最大分辨率為4 096x4 096,主要用于圖像的編解碼處理。在本系統(tǒng)中使用的是Codec通道。

  視頻采集模塊的設(shè)計(jì)采用的是V4L2(Video for Linux Two)V4L2,它是Linux下開(kāi)發(fā)視頻采集設(shè)備驅(qū)動(dòng)程序的一套規(guī)范,該規(guī)范采用分層的方法給驅(qū)動(dòng)程序的開(kāi)發(fā)提供了清晰的模型和一致的接口,并且正對(duì)視頻設(shè)備的應(yīng)用程序編程也提供了一系列接口函數(shù)。其中應(yīng)用程序處于最上層,V4L2處于中間層,而實(shí)際的硬件設(shè)備則處于下層,其本身包括兩層驅(qū)動(dòng)結(jié)構(gòu),上層是videodev模塊,下層為V4L2驅(qū)動(dòng)程序。video-dev通過(guò)V4L2驅(qū)動(dòng)程序的成員函數(shù)來(lái)調(diào)用V4L2驅(qū)動(dòng)。在V4L2驅(qū)動(dòng)的驅(qū)動(dòng)程序初始化過(guò)程中,它首先枚舉它將要處理的系統(tǒng)中的設(shè)備,為每個(gè)設(shè)備填充struct v412_device結(jié)構(gòu),并且將指向該結(jié)構(gòu)的指針傳遞給v412_register_device()函數(shù),該函數(shù)調(diào)用v4L2_deviee結(jié)構(gòu)體中的初始化函數(shù)對(duì)設(shè)備進(jìn)行初始化。當(dāng)v412驅(qū)動(dòng)程序初始化完成后,v412通過(guò)傳遞一個(gè)包含驅(qū)動(dòng)程序成員函數(shù),次設(shè)備號(hào)以及相關(guān)信息的結(jié)構(gòu)給videod-ev,從而完成它將要處理設(shè)備在videodev的注冊(cè)工作,當(dāng)應(yīng)用程序通過(guò)系統(tǒng)調(diào)用觸發(fā)了某個(gè)驅(qū)動(dòng)程序時(shí),控制權(quán)首先傳遞給videodev中的函數(shù),videodev將應(yīng)用程序傳遞的文件或i節(jié)點(diǎn)結(jié)構(gòu)指針轉(zhuǎn)換為相應(yīng)的v412結(jié)構(gòu)指針,并調(diào)用v412中的處理函數(shù)。以本系統(tǒng)以O(shè)V9650攝像頭為例,其驅(qū)動(dòng)框架如圖5所示。

g.jpg

  視頻采集過(guò)程如下,應(yīng)用程序首先打開(kāi)視頻設(shè)備文件,攝像頭在系統(tǒng)中對(duì)應(yīng)的設(shè)備文件為/dev/camera,通過(guò)系統(tǒng)調(diào)用“open(“/ dev/camera”,O_RDWR)”函數(shù)打開(kāi)該設(shè)備,獲得一個(gè)文件描述符fd,利用ioctl(fd,VIDIOCGPICT,&capability)函數(shù)獲取攝像頭的相關(guān)信息,例如設(shè)備名稱、支持的最大最小分辨率、信號(hào)源信息等,填充在結(jié)構(gòu)體video_capability中,通過(guò)調(diào)用ioctl(fd,VIDIOCGPICT,&pict-ure)獲取圖像的相關(guān)信息如采集圖像的對(duì)比度、亮度、調(diào)色板等屬性,并且填充在video_picture結(jié)構(gòu)體中,在獲取這類信息后,可根據(jù)實(shí)際需要來(lái)對(duì)其重新賦值,具體做法是將需要設(shè)置的值賦給相應(yīng)結(jié)構(gòu)體,然后通過(guò)系統(tǒng)調(diào)用ioctl(fd,VIDIOCSPICT,&)函數(shù)寫入設(shè)備。在圖像獲取方式上使用mmap()系統(tǒng)調(diào)用來(lái)實(shí)現(xiàn)內(nèi)存映射達(dá)到各進(jìn)程共享內(nèi)層的目的,利用共享內(nèi)存通信的一個(gè)顯而易見(jiàn)的好處是效率高,因?yàn)檫M(jìn)程可以直接讀寫內(nèi)存,而不需要任何數(shù)據(jù)的拷貝。使用mmap方式獲取圖像數(shù)據(jù),需要首先設(shè)置圖像幀的緩沖區(qū)結(jié)構(gòu),即struct video_mmap,如每次采集幀數(shù),圖像高度、寬度,圖像調(diào)色板格式等等。然后調(diào)用ioctl(fd,VIDIOCMCAPTURE,&grab_buf)啟動(dòng)捕獲過(guò)程。調(diào)用iotcl(fd,VI-DIOCSYNC,&frame)等待采集完成,若該函數(shù)成功返回則表示采集完畢,采集到的圖像將放在通過(guò)mmap()映射的內(nèi)存區(qū)域內(nèi),讀取該內(nèi)存數(shù)據(jù)即可獲得圖像數(shù)據(jù),其中frame為當(dāng)前截取的幀數(shù),V4L2允許一次采集多幀數(shù)據(jù),可通過(guò)設(shè)置grab buf.frame來(lái)實(shí)現(xiàn)。調(diào)用close(fd)函數(shù)關(guān)閉設(shè)備文件,終止圖像采集。

  2.2 視頻數(shù)據(jù)處理模塊設(shè)計(jì)

  由視頻采集模塊獲取的視頻圖像需要通過(guò)3G網(wǎng)絡(luò)來(lái)進(jìn)行傳輸,而從攝像頭直接采集的未經(jīng)壓縮的數(shù)據(jù)量非常大,為了在不影響圖像質(zhì)量的前提下提高傳輸效率,本系統(tǒng)中對(duì)原始獲得的視頻圖像進(jìn)行了壓縮編碼。由于MPEG-4是專門為播放流式媒體的高質(zhì)量視頻而設(shè)計(jì)的,并且MPEG-4標(biāo)準(zhǔn)以其高壓縮比、高質(zhì)量、低傳輸率已經(jīng)成為目前網(wǎng)絡(luò)多媒體傳輸?shù)闹饕袷胶蜆?biāo)準(zhǔn)。它可利用很窄的帶寬,通過(guò)幀重建技術(shù)壓縮和傳輸數(shù)據(jù),以求使得用最少的數(shù)據(jù)獲得最佳的圖像質(zhì)量并且能夠保存接近于DVD畫質(zhì)的小體積視頻文件。在本系統(tǒng)中選用開(kāi)源的Xvidcore作為視頻壓縮模塊的核心算法。Xvidcore是一個(gè)高效而且便于移植的編碼軟件。它不僅支持Simple Profile和Advanced Profile,還支持I/P Frames B-Frames Interlacing和GMC,以鉆石和方塊模式來(lái)進(jìn)行PMVFast和EPZS運(yùn)行估計(jì),是目前比較流行的MPEG-4編碼軟件。Xvidcore源碼可從網(wǎng)上下載免費(fèi)獲得,目前最新版為xvidcore-1.2.2,它提供了一系列的庫(kù)函數(shù)及接口函數(shù)供應(yīng)用程序使用。但針對(duì)嵌入式系統(tǒng)平臺(tái),要使用該庫(kù)需要將其移植到嵌入式系統(tǒng)中。移植過(guò)程如下:

  解壓源代碼:tar-zxvf xvidcore-1.2.2.tar.gz;在使用前需要對(duì)xvidcore-1.2.2進(jìn)行交叉編譯,步驟如下:

  1)設(shè)置環(huán)境變量:export=“xvidcore當(dāng)前所在目錄”;

  2)進(jìn)入/build/generic目錄;

  3)生成Makefrle:/configure-host=local hostbuild=arm-linux-gcc;//指定交叉編譯工具以便進(jìn)行交叉編譯;

  4)編譯源代碼:make。

  將交叉編譯生成的庫(kù)文件libxvidcore.so.*拷貝到交叉編譯器工作目錄lib子目錄中。完成編碼庫(kù)的移植工作。

  以上對(duì)個(gè)獨(dú)立模塊進(jìn)行了介紹,在軟件實(shí)現(xiàn)上對(duì)系統(tǒng)進(jìn)行了整體設(shè)計(jì),將各個(gè)模塊有機(jī)的組合在一起,并充分考慮了系統(tǒng)的可擴(kuò)展性。

  主要結(jié)構(gòu)體如下:

h.jpg

i.jpg

  以視頻壓縮模塊為例,其軟件流程如圖6所示。

k.jpg

  2.3 網(wǎng)絡(luò)轉(zhuǎn)發(fā)模塊設(shè)計(jì)

  在完成對(duì)采集圖像的壓縮或者接收完視頻服務(wù)器后,需要將數(shù)據(jù)通過(guò)3G網(wǎng)進(jìn)行轉(zhuǎn)發(fā),完成網(wǎng)絡(luò)數(shù)據(jù)轉(zhuǎn)發(fā)通常采取的辦法是利用Linux提供的socket API進(jìn)行,socket給用戶提供了統(tǒng)一的編程接口,網(wǎng)絡(luò)傳輸協(xié)議通常有TCP和UDP兩種,對(duì)于TCP每次要通過(guò)3次握手建立連接,在等待亂序及重傳丟失數(shù)據(jù)時(shí)會(huì)產(chǎn)生較大延時(shí),而UDP又缺乏流量控制,所以都不太適用于實(shí)時(shí)數(shù)據(jù)傳輸,在這種情況下運(yùn)行于UDP之上的RTP則具有很大的優(yōu)勢(shì),目前對(duì)于有實(shí)時(shí)要求的數(shù)據(jù)傳輸RTP是最好的協(xié)議,故在本系統(tǒng)中使用了RTP協(xié)議作為數(shù)據(jù)傳輸協(xié)議,流程如圖7所示。

l.jpg

  2.4 3G模塊驅(qū)動(dòng)設(shè)計(jì)及聯(lián)網(wǎng)

  3G模塊與ARM是通過(guò)USB相連的。無(wú)線終端到3G網(wǎng)絡(luò)的連接是通過(guò)PPP協(xié)議實(shí)現(xiàn)的,PPP協(xié)議是一種點(diǎn)對(duì)點(diǎn)串行通信協(xié)議,為在點(diǎn)對(duì)點(diǎn)連接上傳輸多協(xié)議數(shù)據(jù)包提供了一個(gè)標(biāo)準(zhǔn)方法。由于目前嵌入式市場(chǎng)上的3G模塊基本上都是提供Windows CE操作系統(tǒng)下的驅(qū)動(dòng)程序,但對(duì)于嵌入式Linux下面的目前還沒(méi)有驅(qū)動(dòng)支持,所以為本系統(tǒng)開(kāi)發(fā)了3G模塊的驅(qū)動(dòng)程序。要完成3G模塊的撥號(hào)上網(wǎng)功能,需要3個(gè)層面的支持:1)是內(nèi)核層面;2)驅(qū)動(dòng)層面;3)應(yīng)用程序?qū)用娴闹С帧?nèi)核層面主要是通過(guò)對(duì)內(nèi)核的重新配置來(lái)完成,由于3G模塊與ARM通過(guò)USB線連接,而上層的PPP通信采用的是串行協(xié)議,所以要在內(nèi)核中加入U(xiǎn)SB轉(zhuǎn)串口的支持,通過(guò)makemenuconfig命令進(jìn)入內(nèi)核配置界面,依次選擇Device Drivers->USB support->USB Serial Converter Support選擇USB Generic Serial Driver按兩次空格鍵使項(xiàng)目前加『*』將其編譯入內(nèi)核,其中加*為編譯成內(nèi)核模塊,加M為編譯為模塊。由于采用的是PPP協(xié)議,故要在內(nèi)核中加入PPP的支持。進(jìn)入內(nèi)核配置界面以后,依次選擇DeviceDrivers->Network device support->PPP(point-to-point)protocol support選中,將PPP編譯入內(nèi)核,同時(shí)選擇PPP展開(kāi)項(xiàng),將其全部編譯入內(nèi)核,保存退出。對(duì)于驅(qū)動(dòng)層面,3G模塊的驅(qū)動(dòng)開(kāi)發(fā)主要是通過(guò)修改兩個(gè)文件generic.c以及usb-serial.c,其中g(shù)eneric.c為USB通用程序,usb-serial.c為USB轉(zhuǎn)串口程序。通過(guò)在其中加入一些網(wǎng)絡(luò)層的hook函數(shù)來(lái)達(dá)到對(duì)上層協(xié)議的支持。將修改過(guò)后的文件復(fù)制到/linux2.6.29/drivers/usb/serial,重新編譯內(nèi)核,生成zImage鏡像,然后下載到板子上。完成3G模塊驅(qū)動(dòng)的設(shè)計(jì)以及內(nèi)核對(duì)PPP協(xié)議的支持,對(duì)于撥號(hào)上網(wǎng)應(yīng)用程序的支持,主要是通過(guò)PPP提供的兩個(gè)工具pppd和chat來(lái)實(shí)現(xiàn)的,其中PPP提供了一種點(diǎn)對(duì)串行線路上傳輸數(shù)據(jù)流的方法,chat主要用于撥號(hào)并等待提示??蓮木W(wǎng)上下載PPP源碼,在本系統(tǒng)中采用的版本為PPP-2.4.0,下載后要解壓并且根據(jù)目標(biāo)板的類型來(lái)進(jìn)行交叉編譯得到撥號(hào)程序。

  3 結(jié)束語(yǔ)

  本文在一塊ARM開(kāi)發(fā)板上實(shí)現(xiàn)了多種功能,包括無(wú)線數(shù)據(jù)視頻終端,通過(guò)外接視頻服務(wù)器實(shí)現(xiàn)了現(xiàn)有視頻服務(wù)器的3G功能擴(kuò)展,通過(guò)采用了Netfilter與socket結(jié)合的方法,將數(shù)據(jù)包獲取功能從用戶態(tài)載入Linux內(nèi)核態(tài),避免了數(shù)據(jù)的內(nèi)存拷貝,提高了處理效率,同時(shí)引入內(nèi)核緩沖機(jī)制。解決了3G撥號(hào)延時(shí)而造成的視頻服務(wù)器丟包問(wèn)題,配合Netfilter用戶工具iptables的使用,可以在本系統(tǒng)上實(shí)現(xiàn)NAT,包過(guò)濾防火墻等功能。方便對(duì)流經(jīng)系統(tǒng)數(shù)據(jù)包的管理。

  針對(duì)目前市場(chǎng)上的3G模塊大多只提供Windows CE下驅(qū)動(dòng)這一問(wèn)題,開(kāi)發(fā)了3G模塊驅(qū)動(dòng),使得現(xiàn)有3G模塊可使用與嵌入式Linux系統(tǒng)下,用戶可直接在此基礎(chǔ)上通過(guò)socket進(jìn)行編程,而無(wú)需考慮底層的硬件通信問(wèn)題。在軟件設(shè)計(jì)上充分發(fā)揮開(kāi)源軟件的優(yōu)勢(shì),采用Xvideore進(jìn)行視頻編碼,以及PPP源碼編譯撥號(hào)軟件等,縮短了系統(tǒng)開(kāi)發(fā)周期,系統(tǒng)在軟件的整體設(shè)計(jì)上提出了一套相對(duì)通用的軟件架構(gòu),可方便實(shí)現(xiàn)功能的擴(kuò)展及升級(jí)。



 

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。