一種基于嵌入式Linux的智能家居監(jiān)控系統(tǒng)設計
1 系統(tǒng)流程架構
本文引用地址:http://2s4d.com/article/234279.htm本系統(tǒng)的操作系統(tǒng)平臺為Linux, 內核版本為2.6,目標板上包括視頻采集、GPRS 模塊和控制器S3C2440.控制器主要是負責向客戶顯示及后端服務提供圖像數(shù)據(jù)。視頻服務器的啟動方式是由后臺或觸發(fā)啟動。當用戶觸發(fā)事件時自動啟動采集程序或者由用戶遠程啟動,再進行圖像數(shù)據(jù)的抓取。
2 系統(tǒng)設計
2.1 Linux 下設備驅動
Linux 是免費的操作系統(tǒng),其源代碼是公開的,我們能夠根據(jù)實驗的需求進行必要的研究和修改。在Linux 操作系統(tǒng)中,設備都是以文件形式的存在,對設備的操作就是對文件的操作,使用戶可以調用通用的文件操作函數(shù)來進行訪問和操作設備。設備驅動程序是Linux 內核與外部設備關聯(lián)的接口,它們都根據(jù)用戶操作一系列的標準函數(shù)調用來執(zhí)行,通過調用獨立的驅動程序來調用實際硬件的設備進行特定操作。編程接口能夠使驅動程序獨立運行于內核的其他部分,就如“嵌入”到內核中一樣。這種模塊化設計特點使得Linux 驅動程序的編寫方法簡單并且高效。操作簡單的同時也有風險,因為設備驅動程序是運行在內核中,如果驅動程序編寫出現(xiàn)問題,很有可能會使整個Linux 系統(tǒng)運行出現(xiàn)問題。驅動程序運行與一般應用程序也有不同地方,驅動程序運行只能調用自己相應函數(shù)和內核中的標準函數(shù),而一般應用程序只能調用外部數(shù)據(jù)庫等應用函數(shù)。內核模塊源文件中也不能包括一般的庫文件,只能使用內核中規(guī)定的內核函數(shù),否則就會出現(xiàn)問題。這也是驅動程序的寫法與應用程序的寫法不同之處。當然另一個不同之處是內核與一般應用程序處理錯誤的方式不同:
應用程序中的錯誤是不會對系統(tǒng)產(chǎn)生故障,并可使用調試器來進行源代碼的跟蹤,從而發(fā)現(xiàn)問題所在,但內核錯誤有可能會影響整個系統(tǒng),即使不影響系統(tǒng)也會出現(xiàn)殺死當前進程的問題,而且也不能使用調試來發(fā)現(xiàn)問題根源。
2.2 紅外中斷觸發(fā)設計
本監(jiān)控系統(tǒng)實現(xiàn)了紅外熱釋電傳感器驅動,使用字符設備驅動。由于S3C2440 有117 路的I/O 線。其I/O 線分成8 組端口,分別是GPA,GPB,GPC,GPD,GPE,GPF,GPG,GPH.當有人進入時或離開被感應區(qū)域時,都會使熱釋電紅外傳感器的電平發(fā)生變化,從而引起中斷。熱釋電紅外傳感器感應到有人進入時就會自動啟動正在睡眠的視頻采集設備,對目標進行數(shù)據(jù)采集。同時熱釋電紅外傳感器的驅動程序需要調用中斷方式來通知內核,讓內核通知視頻采集器已進入工作狀態(tài),從而便于設備管理。
S3C2440 通過GPIO 引腳的函數(shù)和宏來進行配置和控制;函數(shù)S3C2440 _ GPIO _ CFGPIN 對復用GPIO 引腳配置;函數(shù)SET_ IRQ _ TYPE 對外部中斷觸發(fā)器進行設置。本監(jiān)控系統(tǒng)使用了宏IRQT _ BOTHEDGE 對中斷進行配置。在內核頭文件中定義中斷號,每個外部中斷都分配不同的中斷號來進行控制。當內核接收到中斷響應,就會使用異步通知辦法。為了解決文件的異步通信,用戶程序必須做到兩點:第一必須給進程指定“屬主”;第二為了運行異步通知,用戶程序必須在設備中設置FASYNC 標志。根據(jù)內核驅動程序寫法,驅動程序必須要定義自己的fasync 方法。當程序執(zhí)行到F_SETFL 時就啟動FASYNC,內核就會調用驅動程序fasync.內核空間使用異步信號來向用戶發(fā)送信號,相應信號函數(shù)是:
Void kill_fasync(struct fasync_struct **fa,intsig,init band)
信號函數(shù)的功能是當紅外傳感器輸出電平由高到低或由低到高的變化時觸發(fā)中斷響應,同時外部設備得到一個通過處理函數(shù)產(chǎn)生的電平變化,從而驅動程序中定義read 方法。
2.3 視頻采集驅動
在初始化的流程中初始化了攝像頭的一些默認的值,根據(jù)紅外傳感器傳過來的拍照命令,啟動拍照程序,開始拍照,圖片數(shù)據(jù)保存為JPEG 格式存儲,同時發(fā)送到手機終端While(1)
{
If(paizhao)
{
_pal=0 ;
sendPaiZhao() ;
readJPEG() ;
keepData() ;
sendData() ;
}
}
2.4 圖像數(shù)據(jù)的JPEG 壓縮編碼
通常情況下,沒有壓縮的JPEG 圖像數(shù)據(jù)占用存儲空間比較大,非常耗費存儲空間,也不利于網(wǎng)絡數(shù)據(jù)傳輸,因此對圖像數(shù)據(jù)進行壓縮很有必要。對于圖像的壓縮方法,Linux 系統(tǒng)下的Libjpeg 庫中已經(jīng)有實現(xiàn)。Libjpeg 是Linux 下的一個標準的庫,能夠直接調用它來實現(xiàn)圖片壓縮。這個庫的主要功能是將圖片以一定的壓縮比率壓縮成JPEG 文件格式的圖片。由于Linux 是開源的,這個庫也是開放的。不僅可以在一般的Linux 操作系統(tǒng)下工作,也可以在嵌入式Linux 下進行工作。這樣就減少了很多底層的工作,也有利于避免重復性的開發(fā)工作。
在使用這個庫之前,首先需要安裝和編譯這個庫。對于嵌入式Linux,libjpeg 庫已經(jīng)包括在嵌入式Linux 源代碼包中,在配置相關庫文件選項時把這個庫加入,再編譯一下內核就可以使用libjpeg 庫。
圖像壓縮封裝調用image 類的compress 函數(shù),如下所示:
Int image compress(image *newone,int quality)這個函數(shù)的功能是按照指定的quality 比率將圖片壓縮成JPEG 格式。函數(shù)中的兩個參數(shù)分別是指向新的image 類數(shù)據(jù)的指針( 即壓縮后的圖像數(shù)據(jù)),另一個參數(shù)是指定壓縮比率,一般范圍為0~100.當數(shù)字越大,壓縮得到的圖片質量就越高,也就越清晰,但同時壓縮后的數(shù)據(jù)文件容量越大。所以壓縮比不是越大越好,需要根據(jù)實驗的現(xiàn)實需求來確定,以滿足實驗功能要求且存儲成本和傳輸成本最低為標準。
2.5 短消息的收發(fā)
嵌入式監(jiān)控系統(tǒng)通過使用串口與GPRS 連接,通過使用GPRS模塊來進行短消息的收發(fā)。SMS 短信的收發(fā)有兩種模式,即文本模式和PDU 模式。文本模式只能發(fā)送變通的ASCII 字符,短信內容簡單,其最大不足之處是不能收發(fā)其他字符。PDU 模式將發(fā)送的信息按照一定的格式進行新的編碼,一般是十六進制數(shù)的PDU序列為主,把所有中文或者圖像進行編碼后再予以發(fā)送(如圖2 - 1)。
編程過程如下:
1) 打開串口
打開串口設備文件需要使用標準的I/O 操作函數(shù)。
Fd=open(“/dev/ttyS0”,O_RDWR|O_NDELAY|O_NOCTTY) ;
2) 設置串口屬性
串口有一些規(guī)定的屬性必須進行設置,否則就不能正常運行,一般要設置波特率、控制模式標志、本地模式標志、輸入/ 輸出模式標志、控制字符等相關串口屬性。
3) 清空發(fā)送/ 接收緩沖區(qū)
為了避免以前的數(shù)據(jù)的干擾,必須對緩沖區(qū)的數(shù)據(jù)進行清空之后才能把數(shù)據(jù)讀入緩沖區(qū),這樣做的目的是為了避免不必要的數(shù)據(jù)干擾。
4) 從串口讀寫數(shù)據(jù)
串口的數(shù)據(jù)讀/ 寫使用的是標準的讀/ 寫函數(shù)(read() 和write())。
5) 關閉串口
關閉串口為下次再使用串口提供方便。關閉串口的函數(shù)是close() 函數(shù)。
2.6 彩信的發(fā)送
Linux 系統(tǒng)中的視頻子系統(tǒng)為Video4Linux, 他為應用程序提供了一個完整、統(tǒng)一的API 函數(shù),視頻應用程序只要調用這些API 就能完成對視頻捕捉設備的操作。設備的節(jié)點文件在#mknod/dev/video c810
1) 打開設備
用open() 函數(shù)來打開設備。
fVideo=open(“dev/video”,O_RDWR) ;
2) 獲得設備參數(shù)
Ioctl(fVideo,VIDIOCGCAP,&vcap) ;
3) 設置圖像采集參數(shù)
Ioctl(fVideo,VIDIOCGPICT,&vcap) ;
4) 圖像采集
Ioctl(fVideo,VIDIOCMCAPTURE,&mem) ;
5) 等待采集結束,由于采集需要一段時間,所以應用程序需要有一個相應的等待期
Ioctl(fVideo,VIDIOCSYNC,&mem,frame) ;
6) 將采集的圖像數(shù)據(jù)寫入文件
Write_jpeg(buf++mb.offsets[0],mem) ;
7) 清空內存映射
Munmap(but,mb.size) ;
8) 關閉設備
Close(fVideo) ;
得到圖像數(shù)據(jù)后,再把數(shù)據(jù)進行MMS 的封裝,首先是加上MMS 頭部分的數(shù)據(jù)封裝,再對SMIL 部分封裝,這里主要是指定顯示MMS 的相關信息,最后對每個輸入的多媒體信息進行編碼。最后通過GPRS 模塊把信息發(fā)送出去。
3 系統(tǒng)功能的測試結果
本文測試基于jpeg 格式標準的視頻數(shù)據(jù)的采集、傳輸以及顯示。由攝像頭完成視頻數(shù)據(jù)的采集,通過由GPRS 封裝后把圖像數(shù)據(jù)傳輸?shù)绞謾C。紅外感應到有人進入時,攝像頭取下的圖像照片,并再通過GPRS 模塊把圖像發(fā)到用戶的手機上,從而完成了有效的監(jiān)控動作。
一種基于嵌入式Linux的智能家居監(jiān)控系統(tǒng)設計
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)linux相關文章:linux教程
評論