萬燕 李麗麗
摘 要:高科技電子行業(yè)的發(fā)展,引領(lǐng)了可穿戴設(shè)備的風(fēng)潮,人們越發(fā)追求于其低功耗和穩(wěn)定性。文章實現(xiàn)了一個基于Android和BLE的藍(lán)牙通信系統(tǒng),除了能通過藍(lán)牙連接Android手機(jī)進(jìn)行通信以及強(qiáng)大的低耗能優(yōu)勢以外,還對BLE連接流程進(jìn)行了優(yōu)化,提高了硬件和軟件之間的藍(lán)牙通信性能。
關(guān)鍵詞:BLE;Android;藍(lán)牙通信
中圖分類號:TN925 文獻(xiàn)標(biāo)志碼:A 文章編號:2095-2945(2018)16-0015-03
Abstract: The development of high-tech electronic industry leads the trend of wearable devices, and people increasingly pursue its low power consumption and stability. In this paper, a Bluetooth communication system based on Android and BLE is implemented. In addition to being able to communicate with Android mobile phone through Bluetooth and powerful low energy consumption advantage, the flow of BLE connection is optimized, improving Bluetooth communication performance between hardware and software.
Keywords: BLE; Android; Bluetooth communication
引言
自從“可穿戴設(shè)備”這個名詞進(jìn)入人們的視線,越來越多的消費(fèi)者愿意去嘗試這項新技術(shù),在巨大利益的推動下,對可穿戴設(shè)備的研究也如火如荼地展開。目前可穿戴設(shè)備的技術(shù)還不夠成熟,功能強(qiáng)大的設(shè)備無法獨(dú)立使用,很多功能需要配合手機(jī)軟件才能夠完成,因此設(shè)備與App之間的通信成為人們重點(diǎn)關(guān)注的對象。目前,大多數(shù)的可穿戴設(shè)備和App的通信都是使用藍(lán)牙作為數(shù)據(jù)傳輸方式,而Android系統(tǒng)亦是目前手機(jī)最流行的操作系統(tǒng),故本文開發(fā)了一個基于Android的藍(lán)牙通信系統(tǒng)。
藍(lán)牙分為低功耗藍(lán)牙和經(jīng)典藍(lán)牙,低功耗藍(lán)牙,即BLE,對應(yīng)的是藍(lán)牙4.0及以上版本。經(jīng)典藍(lán)牙又分為傳統(tǒng)藍(lán)牙和高速藍(lán)牙,高速藍(lán)牙指的是3.0版本,藍(lán)牙3.0以下版本屬于傳統(tǒng)藍(lán)牙[1]。低功耗藍(lán)牙與經(jīng)典藍(lán)牙相比,它的通信距離從10米擴(kuò)展到100米,發(fā)送數(shù)據(jù)所需的時間也從100ms降至3ms,相應(yīng)延時也從100ms降至6ms。雖然數(shù)據(jù)傳輸速率還無法與高速藍(lán)牙相比,但在耗能方面,極大體現(xiàn)了低功耗藍(lán)牙的價值,能夠以極低的運(yùn)行和待機(jī)功耗使一粒紐扣電池連續(xù)工作數(shù)年之久,此外,它還有低成本和跨廠商的互操作性[2],所以低功耗藍(lán)牙將是可穿戴設(shè)備更好的選擇。數(shù)據(jù)同步成功率是設(shè)備與App之間藍(lán)牙通信性能的一大體現(xiàn),很多網(wǎng)絡(luò)上的Android App與各種設(shè)備的數(shù)據(jù)同步成功率不到80%,如何提高設(shè)備和App之間的藍(lán)牙通信性能,也是BLE應(yīng)用開發(fā)者關(guān)注的重點(diǎn)。
BLE在待機(jī)功耗和運(yùn)行功耗上的特點(diǎn)符合當(dāng)今可穿戴設(shè)備的發(fā)展需求,在未來一段時間,它將占據(jù)可穿戴設(shè)備通信的主流市場。本系統(tǒng)基于Android 4.3以上版本,利用Android SDK提供的BLE相關(guān)API進(jìn)行藍(lán)牙通信系統(tǒng)的開發(fā),此系統(tǒng)能夠適配任意基于BLE的可穿戴設(shè)備,為可穿戴設(shè)備提供一種更經(jīng)濟(jì)的藍(lán)牙通信方案。在低耗能的基礎(chǔ)上,對目前BLE相關(guān)應(yīng)用數(shù)據(jù)同步成功率低的因素進(jìn)行分析,優(yōu)化BLE的連接流程,將App與設(shè)備的數(shù)據(jù)同步成功率提升至90%以上,提高藍(lán)牙通信性能。
1 系統(tǒng)設(shè)計
1.1 設(shè)計方案
本文所實現(xiàn)的是基于Android和BLE的藍(lán)牙通信系統(tǒng),開發(fā)工具采用Android studio。BLE的通信功能主要利用了Android SDK中關(guān)于BLE的API,這些接口只存在于API 18及以上版本,限制了裝載本系統(tǒng)的手機(jī)設(shè)備操作系統(tǒng)至少為Android 4.3版本[3]。由于Android操作系統(tǒng)的內(nèi)核是基于Linux系統(tǒng)的,且主要使用Java作為開發(fā)語言[4],所以本系統(tǒng)采用Java語言進(jìn)行各項功能的開發(fā),用以控制系統(tǒng)的邏輯部分,界面部分使用XML文件進(jìn)行布局,界面與邏輯分開的開發(fā)方式有助于各個部分的維護(hù)。
1.2 系統(tǒng)設(shè)計
藍(lán)牙通信系統(tǒng)主要有四大功能,分別是設(shè)備搜索、設(shè)備連接、收發(fā)數(shù)據(jù)、保存數(shù)據(jù)。設(shè)備的搜索、連接以及收發(fā)數(shù)據(jù)功能主要依賴于系統(tǒng)藍(lán)牙部分的開發(fā),保存數(shù)據(jù)功能主要依靠存儲設(shè)備的文件讀寫,后者的開發(fā)目的是用于測試藍(lán)牙通信系統(tǒng)數(shù)據(jù)傳輸?shù)恼_性。
系統(tǒng)主要功能如圖1所示。
2 系統(tǒng)實現(xiàn)與優(yōu)化
2.1 系統(tǒng)實現(xiàn)
藍(lán)牙傳輸系統(tǒng)最關(guān)鍵的部分,就是實現(xiàn)BLE通信功能。BLE通信和傳統(tǒng)藍(lán)牙通信的實現(xiàn)原理相同,即一個藍(lán)牙主設(shè)備通過使用藍(lán)牙芯片使設(shè)備能夠在近距離內(nèi)發(fā)送接收無線電信號,來找到另一個藍(lán)牙從設(shè)備[5]。但在開發(fā)方式上,兩者卻存在很大不同。在傳統(tǒng)藍(lán)牙中,手機(jī)和BLE設(shè)備分別對應(yīng)兩種角色,一個是客戶端,一個是服務(wù)器端。當(dāng)客戶端搜索并匹配到服務(wù)器端以后通過UUID建立Socket,之后才能進(jìn)行網(wǎng)絡(luò)通信。而UUID這個值,在傳統(tǒng)藍(lán)牙中是唯一的,且服務(wù)器端和客戶端必須保持一致。在BLE中,手機(jī)和BLE設(shè)備分別對應(yīng)為中心設(shè)備和外圍設(shè)備[6]。開發(fā)BLE應(yīng)用主要使用了GATT,GATT指的是藍(lán)牙4.0最上層的應(yīng)用框架,它提供了藍(lán)牙設(shè)備間交互的各種接口,所有BLE應(yīng)用都是基于GATT實現(xiàn)的。每個BLE設(shè)備都有多個Service,每個Service含有多個Characteris,每個Characteris擁有一個value和多個descriptor,而中心設(shè)備和外圍設(shè)備的通信就是依靠Characteris進(jìn)行的。不管是Service、Characteris還是descriptor,都擁有各自唯一的UUID。
開發(fā)時,若想要系統(tǒng)能夠使用藍(lán)牙的功能,首先需要在配置文件中聲明藍(lán)牙的權(quán)限,允許程序發(fā)現(xiàn)和配對藍(lán)牙設(shè)備以及允許程序連接到已配對的藍(lán)牙設(shè)備。藍(lán)牙的開啟方式有兩種:一是發(fā)送藍(lán)牙開啟的請求,由用戶自己選擇是否打開;二是代碼后臺自動打開藍(lán)牙。本系統(tǒng)采用的是前者,先獲取本地藍(lán)牙適配器,判斷手機(jī)藍(lán)牙是否已開啟,若未開啟則進(jìn)行詢問,當(dāng)用戶選擇確定時,再從后臺去啟動藍(lán)牙。
藍(lán)牙成功開啟后就可以搜索設(shè)備了,外圍設(shè)備啟動后會不斷發(fā)送廣播消息,中心設(shè)備使用注冊的廣播接收器捕捉外圍設(shè)備發(fā)送的這些廣播消息,然后廣播接收器會將設(shè)備地址回調(diào)給中心設(shè)備。值得注意的是,需要給搜索設(shè)備這個行為設(shè)定一個終止條件,比如限定搜索時間或者搜索到設(shè)備的數(shù)量,否則搜索將不會停止,占用系統(tǒng)大量的資源,增加系統(tǒng)耗能。之后可以定義一個設(shè)備適配器的類,用于存儲搜索到的藍(lán)牙設(shè)備,并將之展現(xiàn)在界面上,供用戶進(jìn)行選擇。當(dāng)用戶選定一個設(shè)備后,進(jìn)行設(shè)備的配對和連接。BLE API中提供了連接設(shè)備的方法,可以直接進(jìn)行調(diào)用。
當(dāng)連接到BLE設(shè)備后,調(diào)用發(fā)現(xiàn)Service的函數(shù),通過SERVICE_UUID獲取目標(biāo)Service。如果Service不為空,再通過CHARACTERISTIC_UUID獲取Characteris,使用Characteris與BLE設(shè)備進(jìn)行通信。如果BLE設(shè)備的Service和Characteris的UUID值未知,可以先獲取設(shè)備所有的Service,然后再一個個嘗試,獲取最終需要的Service,同理,可獲得最終需要的Characteris。在BLE通信中,接收數(shù)據(jù)的模式分為兩種,一種是主動讀取數(shù)據(jù),一種是使用通知的方式。主動讀取數(shù)據(jù)由中心設(shè)備控制讀取數(shù)據(jù)的時機(jī);而使用通知的方式,讀取數(shù)據(jù)的時機(jī)則是由外圍設(shè)備掌控,即只有當(dāng)Characteris中數(shù)據(jù)有所變化,中心設(shè)備才會去讀取新數(shù)據(jù)。若中心設(shè)備需要發(fā)送數(shù)據(jù),則應(yīng)先把數(shù)據(jù)寫入Characteris,然后再將其傳輸給外圍設(shè)備。
數(shù)據(jù)保存功能使用了File類和FileWriter類,這些是Java本身提供的類,用于文件和數(shù)據(jù)的讀寫。因為Characteris中數(shù)據(jù)格式是byte數(shù)組,當(dāng)系統(tǒng)接收到新數(shù)據(jù)之后,需要先對數(shù)據(jù)進(jìn)行轉(zhuǎn)換,然后在系統(tǒng)的根目錄下獲取指定文本文件。若文件不存在,則創(chuàng)建文件并寫入數(shù)據(jù);若文件存在,則將新數(shù)據(jù)添加到文件末尾,以便查看數(shù)據(jù)接收記錄。
藍(lán)牙通信系統(tǒng)的工作流程圖如下圖2所示。
圖2 系統(tǒng)工作流程圖
2.2 BLE連接流程優(yōu)化
相比于IOS手機(jī)App和其他設(shè)備的同步成功率,Android App與其他設(shè)備的同步成功率偏低,經(jīng)過對數(shù)據(jù)同步失敗情況的代碼跟蹤,發(fā)現(xiàn)大部分同步失敗的原因是藍(lán)牙連接失敗。也就是說,很多情況下的數(shù)據(jù)同步失敗,是因為藍(lán)牙連接斷開而重連失敗導(dǎo)致的。在分析了Android BLE的API實現(xiàn)代碼以后,發(fā)現(xiàn)開發(fā)BLE應(yīng)用的時候,針對不同設(shè)備類型,開發(fā)者應(yīng)該對重連函數(shù)的邏輯考慮得更全面才能提升數(shù)據(jù)同步成功率。
按照Android BLE的接口文檔說明來看,在獲取設(shè)備以后調(diào)用連接方法會返回一個BluetoothGatt,之后這個連接上的所有操作都在這個BluetoothGatt上執(zhí)行,包括連接狀態(tài)的變化、關(guān)閉連接、讀寫數(shù)據(jù)等等。官方給的重連函數(shù)例子是在連接失敗以后直接繼續(xù)調(diào)用連接函數(shù)去重新連接,但是實際上,這樣的重連函數(shù)很少會起到應(yīng)有的效果。BluetoothGatt在有異常發(fā)生以后,有很大可能性會關(guān)閉一端的連接,如果此時啟用舊的BluetoothGatt就會導(dǎo)致連接失敗,最優(yōu)的方式是使用一個全新的BluetoothGatt。但是,什么時候重啟一個新的BluetoothGatt,連接失敗以后重啟多少次合適,這就需要根據(jù)不同設(shè)備的不同需求來分析了。
在代碼上,連接失敗分兩種,一種是返回超時,一種是返回錯誤結(jié)果??紤]到連接延時的情況,關(guān)閉舊連接和建立新連接之間也需要增加一個合適的時間間隔。所以,可以為重連函數(shù)設(shè)置四個參數(shù),分別是總的運(yùn)行時間、重試次數(shù)、單次超時時限以及重建連接間隔。代碼流程如圖3所示,在總的運(yùn)行時間中返回錯誤結(jié)果或者等待結(jié)果超時,則等待連接延時之后重啟一個BluetoothGatt進(jìn)行連接。
3 系統(tǒng)測試
為了驗證藍(lán)牙通信系統(tǒng)是否達(dá)到預(yù)期目標(biāo),需進(jìn)行系統(tǒng)測試。測試分為兩部分,一是功能測試,二是性能測試。
3.1 功能測試
啟動多個BLE設(shè)備,將APK文件傳送至Android手機(jī),安裝完成之后打開軟件。開啟藍(lán)牙以后搜索可用設(shè)備,所有BLE設(shè)備均被搜索到,故設(shè)備搜索功能可用;選定不同BLE設(shè)備進(jìn)行配對連接,均連接成功, 故設(shè)備連接功能可用;由多個BLE設(shè)備連續(xù)發(fā)送二十組不同大小的數(shù)據(jù)塊,范圍從1字節(jié)到100字節(jié),發(fā)送完畢后打開手機(jī)根據(jù)目錄下的指定文本文件進(jìn)行驗證,得出以下結(jié)論:數(shù)據(jù)塊大小在20字節(jié)以內(nèi)的數(shù)據(jù)傳輸丟包率為零,數(shù)據(jù)準(zhǔn)確無誤;數(shù)據(jù)塊大小在20字節(jié)以上的數(shù)據(jù),數(shù)據(jù)塊中大于20字節(jié)以后的數(shù)據(jù)全部丟失,20字節(jié)以內(nèi)的數(shù)據(jù)準(zhǔn)確無誤。通過翻閱API文檔,可知這是由于GATT做出的限制,故收發(fā)數(shù)據(jù)功能和數(shù)據(jù)保存功能可用。
3.2 性能測試
控制BLE設(shè)備不間斷發(fā)送數(shù)據(jù),攜帶裝載藍(lán)牙通信系統(tǒng)的手機(jī)遠(yuǎn)離BLE設(shè)備走動。經(jīng)測試,在距離數(shù)據(jù)源10米半徑范圍內(nèi)行走不影響數(shù)據(jù)的接收,藍(lán)牙信號可穿透墻壁木門等障礙物而不丟包,可知此藍(lán)牙通信系統(tǒng)有效通信距離長、連接穩(wěn)定性強(qiáng)。在等量數(shù)據(jù)傳輸下,此藍(lán)牙通信系統(tǒng)相較于基于經(jīng)典藍(lán)牙的通信系統(tǒng)耗能大大降低,前者只消耗了后者不到一半的電量,可知此藍(lán)牙通信系統(tǒng)低耗能優(yōu)勢顯著。在進(jìn)行BLE連接流程優(yōu)化之前,官方的重連函數(shù)成功率不到10%,使用優(yōu)化后的重連函數(shù),成功率提升至90%以上,從而間接提升了數(shù)據(jù)同步成功率,提高了系統(tǒng)的藍(lán)牙通信性能。
4 結(jié)束語
本文實現(xiàn)了一個基于Android平臺與BLE的藍(lán)牙通信系統(tǒng),能夠連接手機(jī)和BLE設(shè)備進(jìn)行通信,對BLE的連接流程進(jìn)行了優(yōu)化,提高了藍(lán)牙通信性能。經(jīng)測試,該系統(tǒng)可用于連接任意BLE設(shè)備,在10米范圍內(nèi)通過藍(lán)牙收發(fā)數(shù)據(jù)無丟包情況,比傳統(tǒng)藍(lán)牙通信更省電,數(shù)據(jù)同步成功率更高,為可穿戴設(shè)備提供一種更可靠、更穩(wěn)定、更經(jīng)濟(jì)的藍(lán)牙通信方案。
參考文獻(xiàn):
[1]Shaikh Shahriar Hassan,Soumik Das Bibon,Md Shohrab Hossain,Mohammed Atiquzzaman. Security threats in Bluetooth technology[J]. Computers & Security,2017.
[2]陳冬云.淺談藍(lán)牙4.0“助力”物聯(lián)網(wǎng)的發(fā)展[J].教師,2014(17):126.
[3]歐陽駿,陳子龍,黃寧淋.藍(lán)牙4.0BLE 開發(fā)完全手冊:物聯(lián)網(wǎng)開發(fā)技術(shù)實戰(zhàn)[M].北京:化學(xué)工業(yè)出版社,2013.
[4] 歐陽零.Android 核心技術(shù)與實例詳解(第2版)[M].北京:電子工業(yè)出版社,2013.
[5]羅富財. 基于Android平臺的藍(lán)牙通信系統(tǒng)的研究與實現(xiàn)[D].華北電力大學(xué),2013.
[6]熊小軍,萬輝勇,陳泓屹.基于Android的低功耗藍(lán)牙通訊研究與實現(xiàn)[J].科技廣場,2015(07):122-127.
[7]熊獅,吳效明.基于Android系統(tǒng)的生理數(shù)據(jù)藍(lán)牙傳輸技術(shù)[J].中國醫(yī)學(xué)物理學(xué)雜志,2012,29(06):3801-3803.