引言
Android 一詞的英文本義是"機(jī)器人",它是Google 公司于2007 年11 月宣布的基于Linux 平臺(tái)的開(kāi)源手機(jī)操作系統(tǒng),它是一套真正意義上的開(kāi)放性的移動(dòng)設(shè)備綜合平臺(tái),該平臺(tái)由操作系統(tǒng)、中間件、用戶(hù)界面和應(yīng)用軟件組成[1].Android 最大的特點(diǎn)在于其開(kāi)放性,它宣布開(kāi)放源代碼,手機(jī)制造商、手機(jī)芯片廠(chǎng)商、移動(dòng)運(yùn)營(yíng)商以及開(kāi)發(fā)者都可以對(duì)源碼進(jìn)行學(xué)習(xí)和修改并進(jìn)行開(kāi)發(fā)。藍(lán)牙是智能手機(jī)的一項(xiàng)重要功能,它也被整合到了Android 平臺(tái)上,作為Android 的一個(gè)移動(dòng)網(wǎng)絡(luò)通信模塊。Android 系統(tǒng)提供了藍(lán)牙開(kāi)發(fā)的API,供開(kāi)發(fā)者調(diào)用。
本文實(shí)現(xiàn)了基于A(yíng)ndroid 平臺(tái)通過(guò)藍(lán)牙進(jìn)行通信的一對(duì)多聊天系統(tǒng)。選擇藍(lán)牙作為通信手段是由于藍(lán)牙連接簡(jiǎn)單,避免了網(wǎng)絡(luò)連接對(duì)于網(wǎng)絡(luò)及信號(hào)強(qiáng)度的依賴(lài)性。Android手機(jī)使用藍(lán)牙模塊分別作為客戶(hù)端和服務(wù)器端,實(shí)現(xiàn)好友或陌生人間即時(shí)的一對(duì)多聊天系統(tǒng)。
1 Android 應(yīng)用程序組成
一般來(lái)說(shuō),Android 應(yīng)用程序主要由下列四部分組成,分別是:
Activity(活動(dòng)對(duì)象)、BroadcaST Receiver(廣播接收器)、Service(服務(wù))、CONtent Provider(內(nèi)容提供者)。然而,并不是所有的程序都需要全部部分,可以由上面的一個(gè)或幾個(gè)來(lái)組建。使用某些組件構(gòu)建Android 應(yīng)用程序時(shí),需要在A(yíng)ndroidManifest.xml 文件里進(jìn)行聲明。
Activity
在A(yíng)ndroid 應(yīng)用程序中,Activity 一般代表手機(jī)的一屏,即用戶(hù)可見(jiàn)的一個(gè)界面。Android應(yīng)用程序的運(yùn)行過(guò)程就是在不同的Activity 之間切換的過(guò)程。每個(gè)Activity 都有自己的視圖和事件對(duì)應(yīng)。大多數(shù)應(yīng)用程序都有多個(gè)Activity.
Broadcast Receiver
Broadcast Receiver 是一個(gè)接受廣播消息并響應(yīng)的組件。廣播消息可以由系統(tǒng)產(chǎn)生,例如時(shí)區(qū)發(fā)生變化,電池電量發(fā)生變化等。同時(shí)也可以由其他應(yīng)用程序產(chǎn)生,對(duì)于這兩種廣播,在Broadcast receiver 里都可以設(shè)置相應(yīng)的過(guò)濾規(guī)則來(lái)進(jìn)行接收。
Service
Service 是具有長(zhǎng)生命周期并且沒(méi)有用戶(hù)界面的代碼。通過(guò)startService(Intent service)可以來(lái)啟動(dòng)一個(gè)Service,通過(guò)Context.bindService()可以綁定一個(gè)Service.當(dāng)已經(jīng)連接上了一個(gè)服務(wù),就可以使用服務(wù)提供的外部接口來(lái)和服務(wù)通訊了。
Content Provider
Content Provider 就是一個(gè)類(lèi),作為應(yīng)用程序之間唯一的共享數(shù)據(jù)的途徑,它實(shí)現(xiàn)了一個(gè)標(biāo)準(zhǔn)的方法集合,其他應(yīng)用程序可以使用這些方法在應(yīng)用程序之間共享數(shù)據(jù)。
本文系統(tǒng)主要用到了Activity 和Service.
2 藍(lán)牙
藍(lán)牙這個(gè)名稱(chēng)來(lái)自于第十世紀(jì)的一位丹麥國(guó)王 Harald Blatand , Blatand在英文里的意思可以被解釋為Bluetooth(藍(lán)牙)?,F(xiàn)取其"統(tǒng)一"的含義,用來(lái)命名意在統(tǒng)一無(wú)線(xiàn)局域網(wǎng)通訊標(biāo)準(zhǔn)的藍(lán)牙技術(shù)。它是一種支持設(shè)備短距離通信(一般10m 內(nèi))的無(wú)線(xiàn)電技術(shù)。能在包括移動(dòng)電話(huà)、PDA、無(wú)線(xiàn)耳機(jī)、筆記本電腦、相關(guān)外設(shè)等眾多設(shè)備之間進(jìn)行無(wú)線(xiàn)信息交換。利用藍(lán)牙技術(shù),能夠有效地簡(jiǎn)化移動(dòng)通信終端設(shè)備之間的通信,也能夠成功地簡(jiǎn)化設(shè)備與Internet之間的通信,從而使數(shù)據(jù)傳輸變得更加迅速高效,為無(wú)線(xiàn)通信拓寬道路。藍(lán)牙采用分散式網(wǎng)絡(luò)結(jié)構(gòu)以及快跳頻和短包技術(shù),支持點(diǎn)對(duì)點(diǎn)及點(diǎn)對(duì)多點(diǎn)通信,工作在全球通用的2.4GHz ISM(即工業(yè)、科學(xué)、醫(yī)學(xué))頻段,其數(shù)據(jù)速率為1Mbps,采用時(shí)分雙工傳輸方案實(shí)現(xiàn)全雙工傳輸。
3 Android 上藍(lán)牙模塊
Android 平臺(tái)支持藍(lán)牙協(xié)議棧,允許一臺(tái)設(shè)備與另外的藍(lán)牙設(shè)備無(wú)線(xiàn)交換數(shù)據(jù)。Android提供了相關(guān)的藍(lán)牙API來(lái)支持藍(lán)牙方面應(yīng)用的開(kāi)發(fā)。
使用藍(lán)牙進(jìn)行通信有主要的四個(gè)步驟:
設(shè)置藍(lán)牙、搜索藍(lán)牙設(shè)備、連接設(shè)備、傳輸數(shù)據(jù)。
本文用到的主要類(lèi)有:
BluetoothAdapter:表示本地的藍(lán)牙適配器。BluetoothAdapter是所有藍(lán)牙操作的入口點(diǎn)。
用它可以搜索其他的藍(lán)牙設(shè)備、查詢(xún)已配對(duì)的設(shè)備、用已知的MAC地址來(lái)實(shí)例化一個(gè)藍(lán)牙設(shè)備(BluetoothDevice),建立一個(gè)BluetoothServerSocket來(lái)監(jiān)聽(tīng)其他設(shè)備的連接請(qǐng)求。
BluetoothDevice:表示一個(gè)藍(lán)牙設(shè)備。用它來(lái)向服務(wù)器端設(shè)備發(fā)起連接請(qǐng)求(通過(guò)Bluetoothsocket),或者查詢(xún)?cè)O(shè)備信息,如名字、地址、配對(duì)狀態(tài)等。
BluetoothServerSocket :表示一個(gè)開(kāi)啟的Server Socket 來(lái)監(jiān)聽(tīng)連接請(qǐng)求(類(lèi)似于TCPServerSocket)。為了連接兩個(gè)藍(lán)牙設(shè)備,其中一臺(tái)設(shè)備必須用這個(gè)類(lèi)創(chuàng)建Server Socket.
當(dāng)遠(yuǎn)端設(shè)備向這個(gè)設(shè)備發(fā)出了連接請(qǐng)求,BluetoothServerSocket接收請(qǐng)求后會(huì)返回一個(gè)已連接的BluetoothSocketBluetoothSocket:表示藍(lán)牙套接字(類(lèi)似于TCP socket),它是應(yīng)用程序與其他藍(lán)牙設(shè)備通過(guò)輸入輸出流交換數(shù)據(jù)的連接點(diǎn)。
要在 Android應(yīng)用程序中使用藍(lán)牙特性,必須聲明兩個(gè)藍(lán)牙權(quán)限:
?
4 聊天系統(tǒng)設(shè)計(jì)
藍(lán)牙通信,類(lèi)似于TCP通信,都需要有服務(wù)器端和客戶(hù)端。在本聊天系統(tǒng)中,一部Android手機(jī)作為藍(lán)牙服務(wù)器端,另外兩臺(tái)Android手機(jī)作為藍(lán)牙客戶(hù)端??蛻?hù)端分別連到服務(wù)器,給服務(wù)器發(fā)送并接收文本消息;服務(wù)器也能夠給客戶(hù)端發(fā)送并接收文本消息。
前面已經(jīng)提到,本系統(tǒng)主要用到的Android 系統(tǒng)組件為Activity 和Service.在A(yíng)ndroid的設(shè)計(jì)中,每個(gè)Activity 都是一個(gè)獨(dú)立的進(jìn)程,每個(gè)Service 也是一個(gè)獨(dú)立的進(jìn)程,而Activity要與Service 進(jìn)行通信,就是跨進(jìn)程的通信,這時(shí)就需要使用Binder 機(jī)制了[4].Android 對(duì)Binder 機(jī)制進(jìn)行了抽象,定義了IBinder 接口。在上層,其具體實(shí)現(xiàn)是由AIDL(AndroidInterface Definition Language,即Android 接口描述語(yǔ)言)來(lái)完成的。
本文在藍(lán)牙通信服務(wù)器端和客戶(hù)端都使用了MVC 模式,采用分層的結(jié)構(gòu),具體分為表示層、控制層、業(yè)務(wù)和數(shù)據(jù)交換層,對(duì)應(yīng)MVC 設(shè)計(jì)模式中的View、Controller 和Model[5].
軟件總體架構(gòu)如下圖所示。
?
圖1 藍(lán)牙聊天系統(tǒng)服務(wù)器架構(gòu)
?
圖2 藍(lán)牙聊天系統(tǒng)客戶(hù)端架構(gòu)
下面對(duì)各層做簡(jiǎn)要介紹:
表示層向用戶(hù)展示模型的狀態(tài),在本軟件中是以每個(gè)Activity 的對(duì)應(yīng)的頁(yè)面、對(duì)話(huà)框和一些顯示控件所展現(xiàn),一般以layout 文件夾下的布局文件承載。主要用來(lái)輸入和顯示文本消息、打開(kāi)藍(lán)牙"可被查找"功能及搜索藍(lán)牙設(shè)備。
控制層負(fù)責(zé)表示層和業(yè)務(wù)層的流程控制,一方面將表示層的調(diào)用發(fā)到業(yè)務(wù)層請(qǐng)求處理;另一方面將業(yè)務(wù)層的處理結(jié)果反應(yīng)到表示層進(jìn)行界面上的顯示。
業(yè)務(wù)和數(shù)據(jù)交互層,封裝了藍(lán)牙數(shù)據(jù)傳輸?shù)暮诵牟僮?,如?chuàng)建socket 創(chuàng)建通道、傳輸數(shù)據(jù)、處理輸入輸出流等。它可以通過(guò)控制層被調(diào)用,也可以在收到連接請(qǐng)求或文本消息時(shí)把結(jié)果返回給控制層,進(jìn)而返回到表示層。
采用 MVC 設(shè)計(jì)模式,對(duì)整個(gè)代碼進(jìn)行了分層,使程序結(jié)構(gòu)更加清晰、代碼更加健壯,提高了模塊化程度,各模塊職責(zé)明確,高效率的處理相應(yīng)事件。
5 聊天系統(tǒng)實(shí)現(xiàn)
5.1 服務(wù)器端
參考圖1 藍(lán)牙聊天系統(tǒng)服務(wù)器架構(gòu):
?、?在 BTServer 里,有兩個(gè)ListView,分別用來(lái)顯示從不同客戶(hù)端接收到的文本消息,兩個(gè)輸入框,用來(lái)輸入文本消息發(fā)給客戶(hù)端。這是程序的界面構(gòu)成。
② 啟動(dòng)程序后,到StartDiscoverableModeActivity 界面,提示用戶(hù)設(shè)置本設(shè)備"可被查找".
"可被查找"的含義是其他藍(lán)牙設(shè)備在搜索的情況下,能獲得服務(wù)器端的存在及其相關(guān)信息。為了隱私保護(hù)及安全,藍(lán)牙設(shè)備默認(rèn)是關(guān)閉狀態(tài),需要在用戶(hù)的同意下才打開(kāi)并設(shè)置為可被查找。
?、?服務(wù)器進(jìn)行初始化操作,包括構(gòu)造OnMessageReceivedListener 用以監(jiān)聽(tīng)消息到來(lái)事件;啟動(dòng)ConnectionService,由它來(lái)處理發(fā)送和接收文本消息。
?、?在 ConnectionService 里,創(chuàng)建ConnectionWaiter 線(xiàn)程,在ConnectionWaiter 線(xiàn)程里創(chuàng)建BluetoothServerSocket 監(jiān)聽(tīng)連接請(qǐng)求。
?、?在有連接請(qǐng)求的時(shí)候,ConnectionService 里的ConnectionWaiter 線(xiàn)程接收請(qǐng)求,創(chuàng)建BluetoothSocket,并把遠(yuǎn)端請(qǐng)求的地址address 和這個(gè)BluetoothSocket 放到HashMap 里,用來(lái)管理socket.接著啟動(dòng)BtStreamWatcher 線(xiàn)程,用來(lái)監(jiān)聽(tīng)這個(gè)socket 里的輸入輸出流,把此線(xiàn)程也放到另外一個(gè)HashMap里。接著創(chuàng)建新的ConnectionWaiter 線(xiàn)程,繼續(xù)監(jiān)聽(tīng)新的連接請(qǐng)求。也就是說(shuō),創(chuàng)建多個(gè)通信線(xiàn)程,并放到HashMap 里進(jìn)行管理,以完成藍(lán)牙的一對(duì)多通信。
⑥ BtStreamWatcher 用來(lái)處理輸入輸出流。在BTServer 界面上進(jìn)行輸入的時(shí)候,根據(jù)目的地址(address)的不同,從HashMap 里取出對(duì)應(yīng)的socket,由它來(lái)向此address 發(fā)送消息。接收到文本消息時(shí),回調(diào)OnMessageReceivedListener 來(lái)通知上層,在界面上顯示。
5.2 客戶(hù)端
參考圖 2 藍(lán)牙聊天系統(tǒng)客戶(hù)端架構(gòu):
?、?在 BtClient 里,有一個(gè)listView 和一個(gè)輸入框,分別用來(lái)顯示接收到的服務(wù)器端發(fā)送的消息和輸入文本消息向服務(wù)器端發(fā)送。這是程序的界面構(gòu)成。
?、?啟動(dòng)程序后,客戶(hù)端進(jìn)行初始化操作,包括構(gòu)造 OnMessageReceivedListener、OnConnectionServiceReadyListener;啟動(dòng)ConnectionService.
?、?準(zhǔn)備工作完畢后,回調(diào)OnConnectionServiceReadyListener,啟動(dòng)ServerListActivity 界面,顯示搜索到的藍(lán)牙設(shè)備, 點(diǎn)擊服務(wù)器端所在設(shè)備地址,通過(guò)Connection 調(diào)用ConnectionService 的connect()函數(shù),來(lái)向服務(wù)器發(fā)起連接請(qǐng)求。
?、?等服務(wù)器接受連接請(qǐng)求后,返回BluetoothSocket,把服務(wù)器端地址address 和這個(gè)BluetoothSocket 放到HashMap 里,用來(lái)管理socket.接著啟動(dòng)BtStreamWatcher 線(xiàn)程,用來(lái)監(jiān)聽(tīng)這個(gè)socket 里的輸入輸出流,把此線(xiàn)程也放到另外一個(gè)HashMap 里。
?、?BtStreamWatcher 用來(lái)處理輸入輸出流。在BTClient 界面上進(jìn)行輸入的時(shí)候,根據(jù)服務(wù)器地址,從HashMap 里取出對(duì)應(yīng)的socket,由它來(lái)向此服務(wù)器發(fā)送消息。接收到文本消息時(shí),回調(diào)OnMessageReceivedListener 來(lái)通知上層,在界面上顯示。
?、?啟動(dòng)第二個(gè)客戶(hù)端,進(jìn)行同樣操作。
這樣,本系統(tǒng)就完成了基于藍(lán)牙的一對(duì)二多人聊天。
6 聊天系統(tǒng)效果圖
軟件完成后的效果圖如下所示:
服務(wù)器手機(jī)型號(hào):HTC G12.
客戶(hù)端手機(jī)型號(hào):右設(shè)備:天語(yǔ)W606;左設(shè)備:HTC G13.
服務(wù)器端:
?
圖3 藍(lán)牙聊天系統(tǒng)服務(wù)器界面
客戶(hù)端:
?
圖4 藍(lán)牙聊天系統(tǒng)客戶(hù)端界面
7 后續(xù)計(jì)劃
藍(lán)牙最多支持一對(duì)七的通信,但由于藍(lán)牙開(kāi)發(fā)必須在真機(jī)上進(jìn)行,受到設(shè)備限制,本系統(tǒng)只實(shí)現(xiàn)了一對(duì)二的聊天,但很容易擴(kuò)展到一對(duì)三、一對(duì)更多。在此基礎(chǔ)上,通過(guò)服務(wù)器把收到的客戶(hù)端信息轉(zhuǎn)發(fā)給所有其他的客戶(hù)端,能夠?qū)崿F(xiàn)群組通信。本系統(tǒng)目前也只是實(shí)現(xiàn)了文本消息的傳輸,后續(xù)計(jì)劃準(zhǔn)備實(shí)現(xiàn)圖片、語(yǔ)音、視頻等多媒體文件的一對(duì)多藍(lán)牙傳輸。
8 結(jié)論
本文以MVC模式架構(gòu)設(shè)計(jì)了藍(lán)牙通信的服務(wù)器端和客戶(hù)端,并對(duì)各層作了簡(jiǎn)要介紹,詳細(xì)實(shí)現(xiàn)了服務(wù)器端和客戶(hù)端的模塊,給出了運(yùn)行效果圖,最后對(duì)本系統(tǒng)的后續(xù)計(jì)劃進(jìn)行了說(shuō)明。
評(píng)論
查看更多