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