四川大學軟件學院 侯新琦 李 佳
基于Android藍牙通訊的研究
四川大學軟件學院 侯新琦 李 佳
本文主要就基于Linux系統(tǒng)開發(fā)的Android手機操作系統(tǒng)中的藍牙驅動部分做深入淺出的分析,詳細闡述了從Linux內核到Android設備驅動的藍牙相關知識,為愛好Android系統(tǒng)開發(fā)者提供較為詳細的參考資料。
Linux內核;Android系統(tǒng);藍牙驅動;通訊;設備;網(wǎng)絡驅動
在Android手機越來越普及的今天,對于很多用戶來說,不僅僅是手機應用的使用,越來越多的手機愛好者走進了應用開發(fā)的領域。作為當今網(wǎng)絡時代文件傳輸運用最普遍的藍牙技術,我們有必要將一些列的藍牙基于android的藍牙開發(fā)知識做一個詳細的概述,筆者將從Linux內核概述入手,再分析藍牙協(xié)議最后通過實例來更為深入地對Android藍牙開發(fā)進行說明。
Android系統(tǒng)是Google歷經(jīng)數(shù)年花費眾多時間以及金錢開發(fā)出來的應用于智能手機上的操作系統(tǒng),其最大的特點就是系統(tǒng)開放性。任何公司、個人開發(fā)者、愛好者都可以參與到系統(tǒng)中。同時,Android不僅是一個智能手機的系統(tǒng),也可以作為學習嵌入式Linux系統(tǒng)較為完整的軟件平臺。
要研究Android系統(tǒng)就不能忽略其Linux內核與驅動程序。Android使用標準的Linux2.6內核作為其操作系統(tǒng),隨著Android系統(tǒng)的普及,不同SDK版本中使用的Linux內核版本也不同,不過整體的變化并不大。
藍牙(Bluetooth)提供了移動設備之間快速,方便的無線通信連接。近幾年來已經(jīng)廣發(fā)運用于手機、立體聲耳機、以及無線打印機等設備中。其開發(fā)技術的核心,是根據(jù)藍牙標準所實現(xiàn)的藍牙協(xié)議棧,據(jù)悉,從第一個版本開發(fā)至今已經(jīng)有1.1/1.2/2.0/2.1/3.0等版本。Android藍牙協(xié)議與全球藍牙協(xié)議通用,協(xié)議棧使用BlueZ,并支持GAP,SDP以及RFCOMM規(guī)范,是一個SIG認證的藍牙協(xié)議棧。它的底層協(xié)議層包括了眾多協(xié)議,如邏輯鏈路控制和適配協(xié)議(L2CAP)、服務發(fā)現(xiàn)協(xié)議(SDP)、串口模擬協(xié)議(RFCOMM)等。
在藍牙棧底層包含了L2CAP,RFCOMM,GAP,SDP等協(xié)議,下面就來簡單的介紹一下這些協(xié)議:
L2CAP:Logical Link Control and Adaptation Protocol
邏輯鏈路控制與適配協(xié)議,L2CAP協(xié)議是藍牙系統(tǒng)中的核心協(xié)議,它是基帶的高層協(xié)議,可以認為它與LMP并行工作。
RFCOMM:Radio Frequency Communication(s)
串行線性仿真協(xié)議,是為了兼容傳統(tǒng)的串口應用,同時取代有線的通信方式,藍牙協(xié)議棧需要提供與有線串口一致的通信接口而開發(fā)出的協(xié)議。RFCOMM協(xié)議提供對基于L2CAP協(xié)議的串口仿真,基于ETSI07.10??芍С衷趦蓚€BT設備之間同時保持高達60路的通信連接。
RFCOMM模仿RS-232串口,這種仿真協(xié)議包含無數(shù)據(jù)連接狀態(tài)的傳輸。它可以支持兩個設備之間的多串口仿真?zhèn)鬏敗?/p>
SDP:Service Discovery Protocol
服務發(fā)現(xiàn)協(xié)議,是一個基于C/S結構的協(xié)議,作為藍牙協(xié)議體系中的核心協(xié)議,它是藍牙系統(tǒng)的重要組成部分,是所有用戶模式得以實現(xiàn)的基礎。在藍牙系統(tǒng)中,用戶需要依靠SDP來獲取設備信息,服務信息及服務特征,并在此基礎上建立藍牙連接。
藍牙協(xié)議棧作為基于Android的藍牙通訊的核心,是整個藍牙通訊實現(xiàn)的關鍵,底層使用L2CAP,RFCOMM,SDP等協(xié)議支持整個基于Android的藍牙通訊是目前大多數(shù)Android藍牙通訊采用的方法。
圖1
即使藍牙技術在通訊領域已經(jīng)有了廣泛的運用,但在Android上的運用還并非完美,很多的特性還在開發(fā)階段。
在進行藍牙開發(fā)前,我們必須了解A-ndroid支持的藍牙系統(tǒng)包括的具體內容:
Linux內核的藍牙驅動程序:Linux內核的藍牙協(xié)議層;
bluez(藍牙在用戶空間的庫);bluez適配層;
Android.bluetooth包中的各個類(藍牙在框架層的內容);
藍牙相關的應用程序。
Android的藍牙部分的結構如下圖1。
Android SDK從2.0版本開始支持藍牙功能,眾所周知,Android藍牙仍舊受10米短距離限制,并且會被周圍信號所干擾,但就數(shù)據(jù)傳輸已經(jīng)為用戶帶來了很多方便。不利的是,開發(fā)模擬器并不支持藍牙,開發(fā)調試只能在真機上進行測試,并且至少有兩部手機,也制約了很多技術人員的開發(fā)。
下面筆者將就在Eclipse3.5,SDK版本2.2上的Android開發(fā)進行說明。
首先,要進行藍牙的開發(fā),必須在AndroidManifest.xml文件中加入如下權限:
首先用getDefaultAdapter方法取得默認的藍牙適配器,并且創(chuàng)建一個用來存儲搜索到的藍牙設備BluetllthDevice的List。然后在程序開始時注冊了搜索已完成(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)和發(fā)現(xiàn)設備(BluetoothDevice.ACTION_FOUND)兩個接收器BroadcastReceiver。然后通過一個線程來控制藍牙設備的搜索(starDiscovery),當搜索中有觸發(fā)上面接收器的事件,就直接傳遞給接收器進行保存。最后將保存在List中的BluetoothDevice顯示在一個ListView中。
接下來就是藍牙的最主要功能“傳送文件”的實現(xiàn)方法,我們將通過實現(xiàn)Socket連接來完成服務器和客戶端的建立以及數(shù)據(jù)的傳送。在Android的藍牙API中可以找到BluetoothServerSocket和BluetoothSocket類,在建立Socket連接時需要用到。首先介紹如何來實現(xiàn)一個藍牙Socket服務器。
藍牙的服務器端通過線程來注冊一個具有名稱和唯一識別的UUID號的BluetoothServerSocket,然后一直監(jiān)聽客戶端(BluetoothSocket)的請求,并對這些請求作出相應的處理,代碼實現(xiàn)如下:
在實際開發(fā)中,需要首先判斷本地藍牙是否處于啟動狀態(tài),因為在連接時首先要確保本地藍牙已經(jīng)啟動,然后取得要連接的藍牙服務器,進而通過Bluetoothdevice的createRfcommSocketT oServiceRecord方法傳入唯一的標識UUID創(chuàng)建了一個BluetoothSocket對象,最后通過connet方法與服務器進行了連接。
目前Android系統(tǒng)正以前所未有的速度發(fā)展,但藍牙的開發(fā)目前并沒有得到太多的關注,本文通過對Android藍牙開發(fā)的介紹為開發(fā)愛好者提供參考。本文以Linux2.6的內核介紹開始,說明藍牙協(xié)議棧,以及內核空間庫,最后再以詳細的開發(fā)代碼完整了對Android藍牙開發(fā)的全過程。藍牙技術在很多領域已經(jīng)成熟,在國內也正在如火如荼地發(fā)展,相信在短時間內,藍牙開發(fā)一定會在Android應用開發(fā)方面占領一席之地。
[1]楊豐盛.Android應用開發(fā)揭秘[M].北京:機械工業(yè)出版社,2010.
[2]韓超,梁泉.Android系統(tǒng)原理及開發(fā)要點詳解[M].北京:電子工業(yè)出版社,2010.
[3]靳巖,姚尚郎.Google Android開發(fā)入門與實戰(zhàn)[M].北京:人民郵電出版社,2009.
侯新琦(1992—),女,四川達州人,現(xiàn)就讀于四川大學軟件學院,研究方向:軟件工程。
李佳(1991—),女,遼寧海城人,現(xiàn)就讀于四川大學軟件學院,研究方向:軟件工程。