天天看點

Android BLE與終端通信(五)——Google API BLE4.0低功耗藍牙文檔解讀之案例初探Android BLE與終端通信(五)——Google API BLE4.0低功耗藍牙文檔解讀之案例初探

算下來很久沒有寫ble的博文了,上家的技術都快忘記了,是以趕緊讀了一遍google的api順便寫下這篇部落格心得
其實大家要學習android的技術,google的api就是最詳細的指導書了,而且通俗易懂,就算看不懂英語,翻譯翻譯再結合代碼也能看個大概的,真的很贊喲,我們直接解讀吧! google的api中前面就是一大片的概念,這其實在我之前的篇幅中都有說過的
我們直接翻譯

generic attribute profile(gatt)—gatt配置檔案是一個通用規範,用于在ble鍊路上發送和接收被稱為“屬性”的資料塊。目前所有的ble應用都基于gatt。 藍牙sig規定了許多低功耗裝置的配置檔案。配置檔案是裝置如何在特定的應用程式中工作的規格說明。注意一個裝置可以實作多個配置檔案。例如,一個裝置可能包括心率監測儀和電量檢測。

attribute protocol(att)—gatt在att協定基礎上建立,也被稱為gatt/att。att對在ble裝置上運作進行了優化,為此,它使用了盡可能少的位元組。每個屬性通過一個唯一的的統一辨別符(uuid)來辨別,每個string類型uuid使用128 bit标準格式。屬性通過att被格式化為characteristics和services。

characteristic 一個characteristic包括一個單一變量和0-n個用來描述characteristic變量的descriptor,characteristic可以被認為是一個類型,類似于類。

descriptor descriptor用來描述characteristic變量的屬性。例如,一個descriptor可以規定一個可讀的描述,或者一個characteristic變量可接受的範圍,或者一個characteristic變量特定的測量機關。

service service是characteristic的集合。例如,你可能有一個叫“heart rate monitor(心率監測儀)”的service,它包括了很多characteristics,如“heart rate measurement(心率測量)”等。你可以在bluetooth.org 找到一個目前支援的基于gatt的配置檔案和服務清單。

這裡有兩個概念

中央 vs 外圍裝置。 适用于ble連接配接本身。中央裝置掃描,尋找廣播;外圍裝置發出廣播。

gatt 服務端 vs gatt 用戶端。決定了兩個裝置在建立連接配接後如何互相交流。

為了友善了解,想象你有一個android手機和一個用于活動跟蹤ble裝置,手機支援中央角色,活動跟蹤器支援外圍(為了建立ble連接配接你需要注意兩件事,隻支援外圍裝置的兩方或者隻支援中央裝置的兩方不能互相通信)。 當手機和運動追蹤器建立連接配接後,他們開始向另一方傳輸gatt資料。哪一方作為伺服器取決于他們傳輸資料的種類。例如,如果運動追蹤器想向手機報告傳感器資料,運動追蹤器是服務端。如果運動追蹤器更新來自手機的資料,手機會作為服務端。 在這份文檔的例子中,android app(運作在android裝置上)作為gatt用戶端。app從gatt服務端獲得資料,gatt服務端即支援heart rate profile(心率配置)的ble心率監測儀。但是你可以自己設計android app去扮演gatt服務端角色。也就是自定義
好的,google文檔中,也舉了一個例子說明,我們要使用ble的時候,必須有要加上兩個權限
這其實你要使用藍牙這個硬體都是要加上這個權限的,但是這裡google又聲明了一點 如果n你想聲明你的軟體隻為具有ble的裝置提供服務的話,你應該要在清單檔案中加入
如果改為false的話,那其他藍牙也是可以使用的,我們建立一個工程——bletest
Android BLE與終端通信(五)——Google API BLE4.0低功耗藍牙文檔解讀之案例初探Android BLE與終端通信(五)——Google API BLE4.0低功耗藍牙文檔解讀之案例初探
和傳統藍牙一樣,我們添加完權限之後就要去判斷這個裝置是否支援ble
這步操作也隻是你設定為false的時候才是必須的,因為你如果你設定為true,那你隻給ble服務,那這個判斷也就是多餘的了,緊接着,我們還需要去判斷藍牙是否開啟,如果沒有開啟,我們就去開啟他,這次雖然也是用bluetoothadapter 去擷取,但是這裡用了一個新的類bluetoothmanager ,先初始化
然後再去開啟
這裡的request_enable_bt也就是一個回調的标志,無須理會
寫了這個之後,當我們藍牙沒有開啟的時候就會去友好的提示使用者開啟了
Android BLE與終端通信(五)——Google API BLE4.0低功耗藍牙文檔解讀之案例初探Android BLE與終端通信(五)——Google API BLE4.0低功耗藍牙文檔解讀之案例初探
我們現在準備工作都有了之後我們就可以直接去搜尋裝置了,ble的api和普通藍牙的api還是有一定的差別的,就是有回調了,使用起來挺友善的,但是搜尋是很費電的,是以切記要小心使用,最好是找到裝置之後就停止掃描或者設定掃描時間,不然你就苦逼了
這樣,當我們接收到搜尋裝置的回調時便可以直接添加在adapter上,要注意,所示範的也是google提供的demo
這僅僅是第一步,我們要讓ble擁有強大的能力,就需要連接配接他的gatt服務端
連接配接到gatt服務端時,由ble裝置做主機,并傳回一個bluetoothgatt執行個體,然後你可以使用這個執行個體來進行gatt用戶端操作。請求方(軟體)是gatt用戶端。bluetoothgattcallback用于傳遞結果給使用者,例如連接配接狀态,以及任何進一步gatt用戶端操作。 在這個例子中,這個ble app提供了一個activity(devicecontrolactivity)來連接配接,顯示資料,顯示該裝置支援的gatt services和characteristics。根據使用者的輸入,這個activity與bluetoothleservice通信,通過android ble api實作與ble裝置互動。
當觸發特定的回調時,它調用适當的broadcastupdate()輔助方法,通過這一個動作。注意,本節中的資料解析執行按照藍牙心率測量概要檔案規範:
傳回devicecontrolactivity, 這些事件由一個broadcastreceiver來處理:
你的android app完成與gatt服務端連接配接和發現services後,就可以讀寫支援的屬性。例如,這段代碼通過服務端的services和 characteristics疊代,并且将它們顯示 在ui上。
當裝置上的特性改變時會通知ble應用程式。這段代碼顯示了如何使用setcharacteristicnotification( )給一個特性設定通知。
如果對一個特性啟用通知,當遠端藍牙裝置特性發送變化,回調函數oncharacteristicchanged( ))被觸發。

當你的app完成ble裝置的使用後,應該調用close( ),系統可以合理釋放占用資源。

代碼可能有點亂,這裡提供一個google的demo功大家測試

繼續閱讀