國(guó)加磊,苗方,柴劍平,宋金寶
(1.中廣電廣播電影電視設(shè)計(jì)研究院,北京100045;2.中國(guó)傳媒大學(xué)信息工程學(xué)院,北京100024)
智能化的家居生活,數(shù)字化、網(wǎng)絡(luò)化的娛樂(lè)是數(shù)字家庭多媒體的發(fā)展方向。目前,手機(jī)、機(jī)頂盒等信息設(shè)備是家庭中常見(jiàn)的多媒體終端,各有優(yōu)勢(shì)和局限性。手機(jī)側(cè)重于即時(shí)通信和便攜易用,但受限于小屏幕;機(jī)頂盒是理想的家庭媒體娛樂(lè)平臺(tái),但目前因網(wǎng)絡(luò)、接口等條件所限,交互功能有所欠缺?,F(xiàn)有條件下,任一種網(wǎng)絡(luò)終端都很難實(shí)際完全取代另一種網(wǎng)絡(luò)終端。因此終端之間的互聯(lián)互通是促成融合的一種有效方式,有助于利用結(jié)合點(diǎn)開(kāi)發(fā)新的業(yè)態(tài)。
本文介紹的基于藍(lán)牙技術(shù)的手機(jī)與機(jī)頂盒互聯(lián),正是解決上述問(wèn)題的一種有效方式。
本設(shè)計(jì)旨在運(yùn)用藍(lán)牙技術(shù)實(shí)現(xiàn)手機(jī)與機(jī)頂盒之間的互聯(lián)互通,而目前二者的發(fā)展日新月異,手機(jī)操作系統(tǒng)和機(jī)頂盒嵌入式系統(tǒng)種類(lèi)繁多,在選擇它們互聯(lián)的實(shí)現(xiàn)方案時(shí),必須考慮其通用性。因此,本設(shè)計(jì)采用通用性強(qiáng)的藍(lán)牙無(wú)線通信技術(shù),在手機(jī)端使用J2ME體系,在機(jī)頂盒端使用Linux嵌入式平臺(tái),進(jìn)行程序設(shè)計(jì)開(kāi)發(fā)。
藍(lán)牙是一種可以在短距離內(nèi)實(shí)現(xiàn)多種數(shù)字設(shè)備之間的無(wú)線數(shù)據(jù)通信的技術(shù),能夠簡(jiǎn)化設(shè)備間通信,可提供較高的數(shù)據(jù)傳輸速率,現(xiàn)已被人們廣泛使用。手機(jī)與機(jī)頂盒各自特點(diǎn)不同,其互聯(lián)互通受到的設(shè)備性能、家庭環(huán)境特點(diǎn)等因素的制約,選擇藍(lán)牙技術(shù)作為它們之間的通信方式能夠有效解決這些問(wèn)題。
藍(lán)牙技術(shù)擁有層次明確、分工嚴(yán)謹(jǐn)?shù)膮f(xié)議棧,其設(shè)計(jì)的主要原則是:盡可能利用現(xiàn)有的各種高層協(xié)議,保證現(xiàn)有協(xié)議與藍(lán)牙技術(shù)的融合,以及各種應(yīng)用之間的互通性,充分利用兼容藍(lán)牙技術(shù)規(guī)范的軟硬件系統(tǒng)[1]。藍(lán)牙協(xié)議棧結(jié)構(gòu)如圖所示:
圖1 藍(lán)牙協(xié)議棧結(jié)構(gòu)圖
藍(lán)牙標(biāo)準(zhǔn)的高層可選協(xié)議中有專(zhuān)門(mén)用于傳輸電話簿等小型文件對(duì)象的OBEX協(xié)議。但是由于經(jīng)過(guò)多層的封裝和開(kāi)銷(xiāo),使用OBEX在傳輸較大的多媒體文件如圖片、音頻文件時(shí)速度較慢。而RFCOMM協(xié)議提供了基于L2CAP協(xié)議的串口仿真,附加了對(duì)9針RS-232(EIATIA-232-E)串口仿真的規(guī)定,是一個(gè)簡(jiǎn)單傳輸協(xié)議[2]。在開(kāi)發(fā)過(guò)程中,本設(shè)計(jì)分別嘗試使用OBEX協(xié)議和直接在RFCOMM協(xié)議層測(cè)試文件傳輸,實(shí)驗(yàn)結(jié)論表明前者速率通常只有幾十kbps,而后者傳輸文件的速率可以達(dá)到800~900kbps左右。因此本設(shè)計(jì)方案將底層的設(shè)備發(fā)現(xiàn)、服務(wù)搜索等,由藍(lán)牙協(xié)議棧提供的標(biāo)準(zhǔn)接口實(shí)現(xiàn);而將上層的應(yīng)用如指令控制、文件傳輸?shù)葯C(jī)頂盒與手機(jī)之間的通信,建立在RFCOMM層的端到端連接上。RFCOMM層之上采用自定義的通信協(xié)議和數(shù)據(jù)封裝格式,以達(dá)到靈活高效和輕量級(jí)的封裝。
在手機(jī)端開(kāi)發(fā)的程序,本設(shè)計(jì)運(yùn)用了Java的J2ME體系。
Java,是Java計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言和Java平臺(tái)的總稱(chēng)。Java平臺(tái)由Java虛擬機(jī)和Java API組成,向Java應(yīng)用程序提供了獨(dú)立于操作系統(tǒng)的標(biāo)準(zhǔn)接口,大大提高了Java的可移植性。
Java中的J2ME體系,專(zhuān)為小型設(shè)備、獨(dú)立設(shè)備、互聯(lián)移動(dòng)設(shè)備、嵌入式設(shè)備程序開(kāi)發(fā)而設(shè)計(jì),應(yīng)用程序根據(jù)該規(guī)范只需編寫(xiě)一次,就可以用于多種設(shè)備,其基本體系結(jié)構(gòu)如圖2所示:
圖2 J2ME的基本體系結(jié)構(gòu)
如圖2所示,在最底層的是主機(jī)操作系統(tǒng),任何程序必須在某個(gè)操作系統(tǒng)平臺(tái)下面才能運(yùn)行。在配置層中,本設(shè)計(jì)選用CLDC(互聯(lián)受限設(shè)備配置)開(kāi)發(fā)程序,它主要為微型設(shè)備或者嵌入式設(shè)備而設(shè)計(jì)[3]。但是,只有CLDC的基礎(chǔ)API是難以開(kāi)發(fā)手機(jī)程序的,而且手機(jī)屬于互聯(lián)受限設(shè)備中的移動(dòng)信息設(shè)備,所以需要在簡(jiǎn)表層選用MIDP(Mobile Information Device Profile,移動(dòng)信息設(shè)備描述)。最后,本設(shè)計(jì)使用手機(jī)的藍(lán)牙功能,需要選用可選包(Optional Packages)JSR 82,使用其中定義的與手機(jī)藍(lán)牙通信相關(guān)的 API[4]。
由于各種機(jī)頂盒平臺(tái)缺乏相對(duì)統(tǒng)一的開(kāi)發(fā)接口并存在開(kāi)放性的限制,本課題選擇更具有代表性的基于嵌入式Linux系統(tǒng)的機(jī)頂盒。Linux的官方藍(lán)牙協(xié)議棧使用了BlueZ,這也是目前應(yīng)用最廣泛的協(xié)議棧,幾乎支持所有已通過(guò)認(rèn)證的藍(lán)牙設(shè)備。
BlueZ由多個(gè)獨(dú)立的模塊組成,內(nèi)核空間主要包括設(shè)備驅(qū)動(dòng)層、藍(lán)牙核心及 HCI層、L2CAP與SCO 音頻層、RFCOMM、BNEP、CMTP與 HIDP層、通用藍(lán)牙SDP庫(kù)和后臺(tái)服務(wù)及面向所有層的標(biāo)準(zhǔn)套接字接口;在用戶空間提供了藍(lán)牙配置、測(cè)試及協(xié)議分析等工具。用戶空間的應(yīng)用程序通過(guò)API調(diào)用BlueZ下層模塊,進(jìn)而通過(guò)USB等接口實(shí)現(xiàn)HCI層訪問(wèn)底層硬件,即藍(lán)牙適配器。利用BlueZ HCI層的API,可以實(shí)現(xiàn)開(kāi)啟、關(guān)閉藍(lán)牙設(shè)備,搜索周邊藍(lán)牙設(shè)備等功能。
本設(shè)計(jì)以實(shí)現(xiàn)手機(jī)與機(jī)頂盒的互聯(lián)互通為目的,其系統(tǒng)組成的關(guān)系如圖3所示:
圖3 系統(tǒng)組成關(guān)系圖
如圖3所示,系統(tǒng)包括手機(jī)模塊和機(jī)頂盒模塊兩部分,它們互聯(lián)互通,為用戶提供更多功能體驗(yàn)。系統(tǒng)功能包含了機(jī)頂盒與手機(jī)之間的設(shè)備發(fā)現(xiàn)、服務(wù)搜索、指令控制、文件共享,并使用以上功能實(shí)現(xiàn)典型應(yīng)用:手機(jī)遙控機(jī)頂盒,手機(jī)和機(jī)頂盒之間文件共享。系統(tǒng)的開(kāi)發(fā)和實(shí)現(xiàn)將分別從手機(jī)端和機(jī)頂盒端的程序設(shè)計(jì)兩方面介紹。
為開(kāi)發(fā)支持藍(lán)牙技術(shù)的手機(jī)程序,JCP(Java Community Process)制定了JSR 82標(biāo)準(zhǔn),即Java藍(lán)牙無(wú)線技術(shù)API。該標(biāo)準(zhǔn)包括javax.bluetooth和javax.obex兩個(gè)包,前者定義了基于串口通信的API。本設(shè)計(jì)在J2ME體系中運(yùn)用javax.bluetooth包,實(shí)現(xiàn)了手機(jī)端相關(guān)程序設(shè)計(jì)。
通過(guò)藍(lán)牙在手機(jī)端實(shí)現(xiàn)服務(wù)器功能的設(shè)計(jì)主要包含六部分內(nèi)容。首先通過(guò)LocalDevice類(lèi)的getLocalDevice方法獲取本地藍(lán)牙設(shè)備管理器,實(shí)現(xiàn)藍(lán)牙設(shè)備通信的基本初始化。其次,生成用于串口通信的連接字符串,該字符串指定了在通信過(guò)程中本地藍(lán)牙設(shè)備使用RFCOMM層協(xié)議,標(biāo)明了其在通信中服務(wù)器的身份、服務(wù)UUID、服務(wù)名稱(chēng)以及相關(guān)安全參數(shù)。第三,利用連接字符串給連接通知者(Notifier)賦值,該連接通知者只在接收到遠(yuǎn)程設(shè)備請(qǐng)求時(shí)才返回與該遠(yuǎn)程設(shè)備的連接,否則一直等待。第四,設(shè)置本地藍(lán)牙設(shè)備的服務(wù)記錄屬性,供客戶端搜索并獲取。接著,通過(guò)連接通知者繼續(xù)等待遠(yuǎn)程設(shè)備的連接。最后,通過(guò)連接對(duì)象創(chuàng)建輸入/輸出流,來(lái)實(shí)現(xiàn)服務(wù)端和客戶端的通信,直到通信結(jié)束[4]。
通過(guò)藍(lán)牙在手機(jī)端實(shí)現(xiàn)客戶端功能的設(shè)計(jì)主要包含四部分內(nèi)容。首先,獲取本地藍(lán)牙設(shè)備管理器,完成相關(guān)初始化工作。其次,設(shè)置該管理器處于搜索模式,實(shí)例化搜索代理,開(kāi)始搜索遠(yuǎn)程設(shè)備和服務(wù),并記錄搜索結(jié)果。第三,獲取連接字符串,建立與遠(yuǎn)程設(shè)備的連接。最后,與服務(wù)器端相同,創(chuàng)建輸入/輸出流以實(shí)現(xiàn)通信,直到通信結(jié)束。
另外,在本設(shè)計(jì)中還需要考慮到通信時(shí)數(shù)據(jù)格式的問(wèn)題,因?yàn)镴2ME體系和C語(yǔ)言兩個(gè)平臺(tái)的數(shù)據(jù)結(jié)構(gòu)等細(xì)節(jié)規(guī)定不盡相同,這給二者通信造成了一定困難,尤其在手機(jī)遙控機(jī)頂盒的功能上,發(fā)送用于控制的字符時(shí),需要在程序設(shè)計(jì)中做相應(yīng)的轉(zhuǎn)碼,機(jī)頂盒才可以正確識(shí)別。
手機(jī)端藍(lán)牙程序通過(guò)以上設(shè)計(jì),調(diào)用相關(guān)API以開(kāi)啟藍(lán)牙,搜索周邊可用設(shè)備,選中其中指定目標(biāo)設(shè)備即發(fā)起RFCOMM層連接,實(shí)現(xiàn)了遙控機(jī)頂盒、與機(jī)頂盒共享文件的功能。
本設(shè)計(jì)中的機(jī)頂盒端程序,是在Linux官方協(xié)議棧BlueZ的支持下完成的。在Ubuntu 8.10系統(tǒng)平臺(tái)上,開(kāi)發(fā)過(guò)程中首先基于ARM9內(nèi)核的嵌入式開(kāi)發(fā)板進(jìn)行開(kāi)發(fā)調(diào)試,然后移植到基于同為ARM926內(nèi)核的海思Hi3110的機(jī)頂盒平臺(tái)進(jìn)行開(kāi)發(fā)調(diào)試。機(jī)頂盒通過(guò)USB接口外接藍(lán)牙適配器以支持藍(lán)牙的硬件功能。
要在機(jī)頂盒平臺(tái)上正確使用藍(lán)牙功能需要重新編譯系統(tǒng)內(nèi)核以及藍(lán)牙適配器的驅(qū)動(dòng)模塊,編譯BlueZ庫(kù)及藍(lán)牙工具集,制作文件系統(tǒng),從而能正確識(shí)別和使用USB藍(lán)牙適配器,并使用BlueZ提供的編程接口進(jìn)行開(kāi)發(fā)。在編譯Linux內(nèi)核時(shí),進(jìn)入“Bluetooth subsystem support”子選項(xiàng),將所列全部編譯項(xiàng)目選中。然后進(jìn)入“Bluetooth device drivers”,除“HCI BCM203x USB driver”和“HCI BPA10x USB driver”之外,選中其它所有編譯項(xiàng)目。完成上述操作后,進(jìn)行內(nèi)核編譯,生成支持藍(lán)牙模塊的內(nèi)核鏡像文件。下一步,交叉編譯bluez-lib-2.25和bluez-lib-3.36,在lib子目錄下生成相關(guān)庫(kù)文件,并將其加入到嵌入式系統(tǒng)的文件系統(tǒng)當(dāng)中,與添加了藍(lán)牙支持的Linux內(nèi)核一起,對(duì)藍(lán)牙設(shè)備提供全面的服務(wù)。
在機(jī)頂盒內(nèi)完成配置藍(lán)牙設(shè)備的基礎(chǔ)上,藍(lán)牙通信程序利用BlueZ提供的編程接口就可以實(shí)現(xiàn)與手機(jī)的互聯(lián)功能。藍(lán)牙協(xié)議棧的底層硬件協(xié)議在適配器的硬件中已經(jīng)實(shí)現(xiàn);軟件層面上的藍(lán)牙開(kāi)發(fā)就要從HCI層之上的各協(xié)議層開(kāi)始。藍(lán)牙功能的開(kāi)和關(guān)、搜索周邊設(shè)備的功能由BlueZ的HCI層API直接提供。BlueZ提供了Socket編程接口,通過(guò)一個(gè)類(lèi)似TCP/IP套接字的接口封裝了對(duì)L2CAP和RFCOMM的操作。本設(shè)計(jì)應(yīng)用層的各功能模塊,如指令控制、文件傳輸?shù)?,均在RFCOMM層實(shí)現(xiàn)。創(chuàng)建一個(gè)Socket,其中第一個(gè)參數(shù)domain必須是:PF_BLUETOOTH,即指明采用藍(lán)牙協(xié)議族的結(jié)構(gòu)定義。Protocol參數(shù)為BTPROTO_RFCOMM,即指定使用的協(xié)議層。
RFCOMM層以端口(Port)區(qū)分不同的連接,可用的Port只有32個(gè),需要在使用時(shí)動(dòng)態(tài)分配。被連接方先向系統(tǒng)注冊(cè)一個(gè)服務(wù),分配到端口號(hào),連接時(shí)將該端口號(hào)通過(guò)SDP協(xié)議通告連接發(fā)起方。使用藍(lán)牙MAC地址和端口號(hào)可以在RFCOMM層標(biāo)識(shí)一個(gè)Socket連接。類(lèi)似套接字在IP網(wǎng)絡(luò)的編程開(kāi)發(fā)方式,服務(wù)器端使用bind,listen等API綁定、監(jiān)聽(tīng)該套接字;客戶端用connectAPI發(fā)起連接。建立連接后雙方使用read,write或send,recv等API發(fā)送接收數(shù)據(jù)。
本設(shè)計(jì)針對(duì)指令控制和文件傳輸制訂了相應(yīng)的通信協(xié)議。當(dāng)機(jī)頂盒收到標(biāo)識(shí)為控制信息的字符串?dāng)?shù)據(jù)時(shí)進(jìn)行字符串解析,判斷進(jìn)行換臺(tái)鍵、方向鍵或其它操作,并將鍵值消息發(fā)送給機(jī)頂盒DVB軟件系統(tǒng),實(shí)現(xiàn)遙控器的功能。傳輸文件時(shí)使用了單獨(dú)的線程,使用不同于指令控制的端口,這樣在傳輸文件的同時(shí)不影響遙控操作。接收文件線程在收到要求傳輸?shù)奈募笮『臀募笤谥付窂絼?chuàng)建該文件并開(kāi)始接收,如創(chuàng)建失敗則向手機(jī)返回出錯(cuò)代碼。
通過(guò)上述功能設(shè)計(jì),機(jī)頂盒端藍(lán)牙應(yīng)用程序?qū)崿F(xiàn)了典型應(yīng)用:開(kāi)啟藍(lán)牙并搜索周邊可被發(fā)現(xiàn)的設(shè)備,開(kāi)啟服務(wù)器端線程等待手機(jī)客戶端的接入。根據(jù)接收的指令內(nèi)容響應(yīng)相應(yīng)的操作,開(kāi)啟文件傳輸線程以接收傳輸?shù)奈募?/p>
經(jīng)實(shí)驗(yàn)和測(cè)試,本設(shè)計(jì)已實(shí)現(xiàn)手機(jī)與機(jī)頂盒之間的跨平臺(tái)無(wú)線互聯(lián):手機(jī)遙控機(jī)頂盒,二者之間彼此發(fā)現(xiàn)、連接、傳輸數(shù)據(jù)。
本設(shè)計(jì)基于不同技術(shù)原理,在實(shí)踐中不斷摸索和改進(jìn)程序,最終基于藍(lán)牙技術(shù)設(shè)計(jì)實(shí)現(xiàn)了手機(jī)與機(jī)頂盒之間的互聯(lián)互通,這為數(shù)字家電向網(wǎng)絡(luò)化、智能化發(fā)展提供了一種新方式。
[1]劉書(shū)生,趙海.藍(lán)牙技術(shù)應(yīng)用[M].沈陽(yáng):東北大學(xué)出版社,2001.6-9.
[2]張祿林,雷春娟,郎曉虹.藍(lán)牙協(xié)議及其實(shí)現(xiàn)[M].北京:人民郵電出版社,2001.138-139.
[3]郭克華.JavaME移動(dòng)開(kāi)發(fā)實(shí)例精講[M].北京:清華大學(xué)出版社,2010.1-4.
[4]汪永松.J2ME手機(jī)高級(jí)編程[M].北京:機(jī)械工業(yè)出版社,2009.66-73.