基于ARM9和GSM/GPRS的無線可移動紅外監測報警系統
3.2 設備驅動程序
設備驅動程序可以被看作操作系統的一部分,對于某個特定的硬件設備來說,其對應的設備驅動程序是不同的。操作系統本身是沒有各種設備驅動的,但是它留下了擴展設備驅動的接口。本終端系統中的設備驅動程序主要包括GPIO驅動、USB接口驅動、視頻設備驅動和GSM/GPRS串口驅動。
GPIO驅動是針對GPIO輸入/輸出端口進行的驅動程序開發,主要的部分是GPIO端口的初始化和配置,經過測試終端采用GPIO總線中的GPG6口以輸入模式來接收紅外監測模塊傳入的高電平信號。USB接口驅動由三部分組成:主機控制器驅動程序(HCD)、USB驅動(USBD)、設備端驅動程序(Slave Device Driver),它主要是為支持USB接口的圖像采集設備的使用。GSM/GPRS串口驅動是字符設備驅動,系統中選用的串口2對應的設備文件為/dev/tts/1,初始化串口2的波特率為115200 B/s,8位數據位,無奇偶校驗,1位停止位,實現了GSM/GPRS模塊的連接。
本系統中使用的視頻設備驅動為SPCA5XX,它是面向該ZC301p芯片的,其實現是按照標準的USB VIDEO設備的驅動框架編寫的,整個源程序由三個主體部分組成:設備的初始化模塊和卸載模塊、上層軟件接口模塊、數據傳輸模塊。此視頻設備驅動程序的設計,能夠取到應用程序所需要的jpeg流。在此不能不提到ioct1的作用。為了補充設備讀寫操作的功能,例如控制硬件等,最常用的通過設備驅動程序完成控制動作的方法就是實現ioct1方法。ioct1系統調用為驅動程序執行命令提供了一個設備相關的入口點。與read和其他方法不同,ioct1是設備相關的,它允許應用程序訪問被驅動硬件的特殊功能一配置設備以及進入或退出操作模式。在本設計中用到的,是通過ioct1截取jpeg流和配置圖像采集設備的參數。
3.3 PPP撥號腳本
本設計中,對于處理器而言,GPRS模塊就相當于一個調制解調器,處理器通過串口發送AT命令控制GPRS模塊工作情況和得到GPRS模塊相關信息。中國移動在GPRS網中建立了相當于ISP的GGSN,以連接GPRS網與外部的Internet網絡。要使用GPRS功能首先要登錄GPRS網絡中的GGSN,這個工作可以通過相關AT命令完成。同時,為了能夠進行IP數據包的傳輸,就必須首先實現數據鏈路層PPP協議。
PPP是簡單鏈路設計的鏈路層協議。設計目的主要是用來建立點對點連接,進行數據收發。PPP協議中主要任務有鏈路建立、維護、拆除、上層協議協商和認證等。在GPRS網絡中一般用到的有LCP(鏈路控制協議)、PAP(密碼驗證協議)、CHAP(挑戰握手驗證協議)和IPCP協議(PPP IP控制協議)。為了建立點到點連接,PPP連接時的兩端開始都必須發送LCP數據包來配置和測試數據連接;在連接建立后,對等實體還有可能需要認證;然后,PPP必須發送NCP數據包來選擇一種或多種網絡層協議來配置。一旦網絡層協議被配置好后,該網絡層的數據包就可以被封裝在ppp 幀中在鏈路上傳送了。PPP鏈路將保持可配置的狀態,直到有LCP數據包和NCP數據包終止連接。在GPRS模塊撥號成功后,就要進行LCP協商配置。交互過程完成后,終端將主動進行PAP認證,發出PAP數據包,進入認證鑒權階段。
PAP認證主要進行用戶名和密碼認證,其數據包仍然封裝在PPP6幀內,格式和LCP一致。進入PAF認證階段,終端主動發出Authenticate-Request數據包,由于中國移動使用的GPRS可以設置任意的用戶名和密碼,因此本設計中使用的用戶名和密碼都為lab。接下來進入IPCP設置階段。
在IPCP配置過程中,可以設置網絡連接中的網絡環境,主要包括協商分配IP地址、IP壓縮協議和DNS服務器地址等。由于不需要進行域名的解析和IP壓縮,因而只進行IP地址的配置。
經過上述PPP協議數據交換過程,數據鏈路已經建立,但是要進行數據的傳輸,還要進行IP協議和TCP/UDP協議的實現。由于Linux內核已經支持TCP/IP協議,并且在內核配置時選中支持PPP協議,就可以完成上述的協議支持。為了完成上述的PPP協議實現過程,需要在文件系統的/et c文件夾下添加撥號腳本文件,并且在/usr/bin文件夾下添加應用程序pppd和chat。chat程序定義了計算機和modem之間的對話交互,完成撥號動作。pppd后臺程序則同內核ppp驅動一起建立并維護與另一端的ppp連接,并確定連接兩端的IP地址。
3.4 應用層程序
應用層程序中包括紅外監測模塊、圖像采集模塊、GPRS無線傳輸模塊及GSM短信息發送模塊。下面主要介紹圖像采集模塊與GPRS無線傳輸模塊的實現。
3.4.1 圖像采集模塊
在Linux環境下,編寫獲取視頻音頻的應用程序,都使用V4L標準,V4L(Video for Linux標準是Linux中通行的音頻視頻流采集標準。它為內核、驅動和應用程序的交流提供了統一的接口。在應用程序中利用V4LAPI獲取視頻圖像按以下幾個步驟進行:打開視頻設備、設置設備的屬性(圖像的亮度、對比度、設定傳輸格式和傳輸方式)、開始傳輸數據,最后關閉設備。
首先,定義與設備相關的結構體如下:本文引用地址:http://www.104case.com/article/152312.htm
struct vldeo_capabil i ty capabi li ty; //視頻設備的屬性
struct video_window captureWindow; //包含獲取到的圖像的長和寬
struct video_picture imageProperties; //包含獲取到的圖像屬性
結構體struct video_capabi lity包含視頻設備的屬性有:視頻設備的規范名稱、接口類、所能獲取的最大圖像的寬和長、所能獲取的最小圖像的寬和長。其次,要使用ioctl系統調用,ioctl系統調用的功能是通過打開的文件描述符對各種文件,尤其是字符設備文件進行控制,完成特定的I/O操作。V4L支持的ioctl命令大約有二十多個,在應用中主要用的是下面幾個命令:
ioctl(fd,V IDIOCGCAP,&capability); //獲取視頻設備的基本功能信息
ioctl(fd,VIDIOCGPICT,&picture); //設置和獲取采集圖像的各種屬性
ioct l(fd,VIDIOCGMBUF,*mbuf); //獲取緩沖區信息
ioctl(fd,VIDIOCMCAPTURE,mmap); //捕捉圖像,獲取圖像信息
ioctl(fd,VIDIOCSYNC,&frame); //等待捕獲完成的圖像
本設計中主要設置的參數有:捕獲的圖像大小為320×240像素,圖像幀的調色板palette值為21,圖像色彩深度為8位。
最后,使用read方法實現圖像的獲取,read方法則可以直接讀取設備文件來獲取一幀數據保存到緩沖區中。通過convertframe()函數將pFramebuffer中的數據轉成完整的jpeg格式的數據保存到ptframe緩存中去,再調用fwrite()函數將pt-frame緩存中的jpeg式數據寫入到指定的文件中去,即得到一幅jpeg格式的圖像。另外要提到的是本設計中為了方便服務器端讀取上傳的圖片,將圖像文件重名為系統時間格式。這時需要調用Linux系統函數time和1ocaltime。綜上,圖像采集模塊已經實現。
3.4.2 GPRS無線傳輸模塊
本設計中使用socket(套接字)編程技術來實現GPRS網絡中FTP文件的傳輸,它是網絡通信中應用進程和網絡協議之間的接口。在Linux操作系統中,socket屬于文件系統的一部分,網絡通信就像文件讀取一樣方便。并且socket用IP地址加上端口號來唯一地標志一個進程。利用socket實現通信就像網絡上大部分通信一樣,是在客戶機/服務器(client/server)模式下進行的。這種模式下,將請求服務的一方稱為客戶端,將提供服務的一方稱為服務器端。和大多數的應用程序一樣,客戶端和服務器端使用傳輸協議進行通信。應用程序通過傳輸協議進行交互時所用的接口稱為應用程序接口(Application Program Interface,API)。一個API定義了應用程序與協議軟件進行交互時可以使用的一組操作。本設計中使用了FTP協議來傳輸圖像數據文件。一次完整的FTP文件傳輸需要建立兩種類型的連接,一種為文件傳輸下命令,稱為控制連接,另一種實現真正的文件傳輸,稱為數據連接。
本系統中使用socket編程技術實現GRPS網絡中無線FTP傳輸圖像的具體步驟是這樣的;首先,建立socket客戶端的部分,用來發送FTP命令等參數。調用socket()創建了套接字,返回了該socket的描述符。接著,將服務端的IP地址、端口號和網絡地址類型(本設計中是PF INET,表明該socket在Internet域中進行通信)填充到該socket結構體中。然后建立剛創建的套接字的連接,通過此套接字發送登錄該FTP服務器的相關命令:發送登錄名和密碼;使用TYPE命令設置文件的傳輸類型為I。接著,建立作為socket服務器端的部分,用來發送數據文件。與socket客戶端不同的是需要先創建socket,然后綁定本地地址(也就是由GPRS系統DHCP分配的IP地址)到該socket上。接著是監聽這個socket,當監聽到與socket客戶端(也是FTP服務器端)連接上時,開始請求發送圖像數據文件的命令。這部分實際也充當了FTP的客戶端工作。在監聽到連接后,使用PORT命令監聽等待連接的端口,接著使用STOR命令發送上傳文件的請求。
評論