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