??? 摘 要: 介紹了基于藍牙的智能家居視頻防盜監控系統的軟件設計。在ARM9(S3C2410)" title="ARM9(S3C2410)">ARM9(S3C2410)和Linux2.6.14上實現了USB藍牙驅動、USB攝像頭驅動" title="攝像頭驅動">攝像頭驅動,介紹了Linux2.6下藍牙通信的實現過程,最后實現了在PC監控機和ARM9(S3C2410)間圖像的采集和傳輸。
??? 關鍵詞: ARM9? Linux2.6.14? 藍牙 智能家居
?
??? 隨著多媒體技術和網絡技術的迅猛發展,大型的智能家居系統成為一種發展趨勢。理想的智能家居系統應具有以下功能:
??? (1) 住宅視頻監控防盜、報警;
??? (2) 火警、煙警、有毒氣體泄露報警;
??? (3) 各類家用電器控制;
??? (4) GSM短信息遠程報警。
??? 在這些功能中,家庭內的安全防盜顯得尤為重要。如果智能家居內采用有線方式布線,會大大影響房間的美觀,并且使用也不夠便利。
??? 藍牙技術傳輸可靠并能穿越障礙物,功耗低、成本低廉、組網方便靈活,是一種有效的無線通信手段。本文采用藍牙技術設計并實現了一種智能家居中的視頻防盜監控系統,取得了滿意的效果。
1 系統總體設計和工作流程
??? 系統主要包括ARM9處理器(S3C2410)、家庭內PC機、遠程PC監控機、藍牙模塊" title="藍牙模塊">藍牙模塊、USB攝像頭幾部分,其結構框圖如圖1所示。ARM9處理器負責對整個家居設備的管理,由于智能家居內許多家電都是通過藍牙無線傳感網絡來工作的,因此家庭內的PC機必須負責保存數據并對藍牙無線傳感網絡進行數據融合處理。
?
??? 系統工作流程如下:如果遠程PC監控機發送啟動監控命令,則激活攝像頭。在對攝像頭完成初始化之后,就將進行圖像的采集。采集的圖像以文件的形式被送入藍牙模塊,此時的藍牙模塊已經進入了以太網仿真模式,因此可以通過SOCKET通信將圖像發送到家庭內的PC機。最后通過互聯網發送到遠程的PC監控機。
2 USB藍牙模塊驅動和USB攝像頭驅動
2.1 USB藍牙模塊驅動
??? 在Linux系統內核配置過程中,進入Networking Support選項的Bluetooth subsystem support子選項,選擇L2CAP protocol support、BNEP protocol support(Malticast filter support和Protocol filter support)這幾項,其作用就是使內核支持藍牙協議中的L2CAP和BNEP協議。然后進入Bluetooth device drivers,選擇HCI USB driver。至此,就完成了內核對于USB藍牙的支持。
??? 完成內核對藍牙的支持后,下一步是移植Linux藍牙協議棧的庫(bluez-libs-2.17.tar.gz)和工具包" title="工具包">工具包(bluez-utils-2.17.tar.gz)。在指定了交叉編譯器和安裝路徑并運行安裝命令后,bluez-libs庫生成libbluetooth.so.1.17等3個庫文件,bluez-utils工具包生成hcid(HCI后臺進程)、sdpd(服務發現協議后臺進程)、hciconfig(檢查HCI接口并開啟藍牙設備)和hcitool(掃描藍牙設備的地址)等幾個進程文件。
2.2 USB攝像頭驅動
??? USB攝像頭使用的是市場上廣泛應用的采用中芯微公司的ZC301芯片的攝像頭,這種攝像頭采用硬件壓縮方式,截取到的圖片是JPEG格式,這樣可以大大減少由于軟件壓縮所耗費的時間,便于網絡多媒體的應用。Linux內核并未包括這種攝像頭,因此必須針對嵌入式 Linux環境,打入攝像頭驅動補丁文件usb-2.6.12LE06.patch.tar.gz。將該文件解壓縮,然后放入/kernel2.6.14/drivers/usb目錄,用命令path-pl
??? 整個通信過程如下:
??? (1)USB藍牙的傳輸驅動程序(drivers/bluetooth/hci_usb.c)將信息注冊到Linux USB核心。當USB藍牙插入時,主機控制器設備驅動程序會枚舉它并給它分配地址,同時讀取設備描述符中所包含的設備信息。如果枚舉期間讀取的設備描述符與hci_usb驅動程序注冊到Linux USB核心的信息相匹配,這個驅動程序就能添加進USB設備[1]。
??? (2)在S3C2410上運行hcid、sdpd、hciconfig、hcitool四個藍牙工具文件。在S3C2410一側的藍牙設備能夠被發現并被成功分配唯一地址的基礎之上運行pand--listen--role NAP,這樣將允許藍牙監聽服務器。
??? (3)PC機上插入USB藍牙,運行命令hciconfig hci0 up、hcid-f/etc/bluetooth/hcid.conf、hciconfig-a、hcitool scan
后,啟動藍牙設備,并能夠檢查到S3C2410一側的藍牙設備,可以根據藍牙設備對應的物理地址用pand connect-c XXXX(物理地址)來連接2個藍牙設備[2]。
??? (4)在個人局域網建立的基礎之上,BNEP就可以將自己作為以太網(TCP/IP)設備注冊到Linux網絡層。可以通過命令ifconfig bnep0來改變藍牙接口IP地址。BNEP模塊和用戶模式pand后臺進程實現了Bluetooth個人區域網(PAN)。
4 智能家居中的視頻監控軟件流程
4.1 USB攝像頭圖像采集軟件流程
??? 該系統正常工作時,整個設計有兩個關鍵的部分:一是攝像頭如何采集圖像;二是如何進行圖像的傳輸。
??? 為了實現監控,獲得視頻數據是一個重要環節。系統是在嵌入式Linux系統平臺上采用Video4Linux編程來獲取圖像的[3]。攝像頭圖像采集流程如圖2所示。Video4Linux是Linux中關于視頻設備的內核驅動,它為針對視頻設備的應用編程提供一系列接口函數,用戶通過open、write、read、ioctl等函數來實現對設備文件的操作。采集程序實現過程:調用函數fd=open(“/dev/v4l/video0”,0_RDWR)打開視頻設備對應的設備文件/dev/v4l/video0,接著利用ioctl函數分別調用VIDIOCGCAP、VIDIOCGPICT、VIDIOCSPICT來獲得設備相關信息、讀取圖像信息、修改圖片中的depth=8信息(對應的格式是JPEG)并設置圖片格式為320×240,在完成了設備的初始化后,就可以截取視頻圖像了。調用realloc(vd->pFramebuffer, (size_t)vd->framesizeIn)函數,得到的返回值就是圖像所需要的內存空間首地址vd->pFramebuffer,然后用read()函數直接讀取設備就能得到圖像,采集一幀的時間約為38ms,圖像效果很清晰。最后計算圖像大小(JPEG圖像的有效段從1 024B開始,以0xFF、0xD9結束)并送入傳輸部分。
?
?
4.2 圖像的無線和有線傳輸軟件流程
??? 由于TCP/IP可以直接運行于Bluetooth上,因此家庭內PC機和S3C2410以及家庭內PC機和遠程監控機的通信程序均可由SOCKET編程來完成。服務器的工作流程:首先調用s = socket(AF_INET, SOCK_STREAM, 0)來創建socket號,調用bind(s, (struct sockaddr*)&sin, sizeof(sin))函數將其與本機地址以及一個本地端口號" title="端口號">端口號綁定。然后調用listen(s,5)函數在相應的socket上監聽,調用accept函數,最后睡眠并等待客戶的連接請求,當accept函數接收到一個連接服務請求時,將生成一個新的socket,并通過新的socket將圖像內容發送出去。客戶接收端程序流程:首先調用gethostbyname(host_name)函數完成域名與IP地址的轉換得到服務器的IP地址,然后調用sockfd=socket(AF_INET, SOCK_STREAM, 0)函數創建一個socket號,并設定端口號為1 500,最后調用connect(sockfd, (struct sockaddr*)&sin, sizeof(sin))函數與服務器建立連接,連接成功后接收從服務器發送過來的數據。實驗測得用藍牙傳輸采集到的每幀圖像時的速度約為78kB/s。
參考文獻
[1] CORBET J, RUBINI A, KROAH-HARTMA G. 魏永明,耿岳,鐘書毅等譯.LINUX設?備驅動程序(第3版)[M].北京:中國電力出版社,2006,1.
[2] ?ROGER W. Linux Unwired[M]. O’Reilly,2004,4.
[3] ?陳賾,秦貴和,徐華中,等.ARM9嵌入式技術及Linux高級實踐教程[M].北京:北京航空航天出版社,2005.