Android 藍芽開發(2)——低功耗藍芽
低功耗藍芽官方文件
本文章是參考官網,然後加入自己實踐中的理解完成!沒有看上一篇的讀者,可以先閱讀一下前一篇,這是一個系列。
官網地址:https://developer.android.com/guide/topics/connectivity/bluetooth-le
Android 4.3 (API 18 )引入了低功耗藍芽,應用可以查詢周圍裝置、查詢裝置的服務、傳輸資訊。
關鍵術語和概念
通用屬性配置檔案(GATT Generic Attribute Profile)
GATT 配置檔案是一種傳輸資料規範,用於在 BLE 鏈路上傳送和接受被稱為屬性的短資料的通用規範。目前所有低功耗應用配置檔案基本都是基於 GATT
Bluetooth SIG (藍芽技術聯盟)
是為低功耗裝置定義了許多配置檔案。配置檔案是裝置在特定應用程式中的工作方式的規範。裝置可以實現多個配置檔案。例如,裝置可以包含心率監測器和電池水平檢測器。
定義規範的
屬性協議(ATT Attribute Protocol)
GATT 是建立在屬性協議(ATT)之上的。也被稱為 GATT/ATT 。ATT 經過優化,可在 BLE 裝置上使用。為此,它使用了儘可能少的位元組。每個屬性由通用唯一識別符號(UUID)來唯一標識。ATT 傳輸的屬性被格式化為 特徵 和 服務
特徵
特徵包含單個值和描述特徵值的 0 ~ n 個描述符。特徵值可以被稱為型別。類似於類。(是在和 BLE 裝置進行通訊的時候主要的操作內容)
描述符
是用來定義特徵值的已定義屬性。用來描述特徵值的。例如:描述符可以指定人類可讀的描述,特徵值的可接受範圍或者特徵值特定的度量單位
服務
服務中包含一系列的特徵值。例如,我們可以使用名為 “心率監測器”的服務,其中包括"心率測量"等特徵。可以在 bluetooh.org 上找到基於 GATT 的現有配置檔案的服務的列表。
角色和責任
Android 裝置和 BLE 裝置互動時應用的角色和職責
- 中央與外圍裝置。
- GATT 伺服器和 GATT 客戶端。確定了兩個裝置建立連線後如何進行相互通訊
BLE 許可權
應用在使用藍芽裝置的時候必須要宣告藍芽許可權 BLUETOOTH
需要這個許可權才可以進行藍芽通訊,例如:請求連線、接受連線、和傳輸資料。
如果還需要發現或者操作藍芽設定,則需要宣告 BLUETOOTH_ADMIN
許可權。使用這個許可權的前提是要有 BLUETOOTH
許可權。
如果要宣告我們的應用僅適用於支援 BLE 的裝置,需要清單檔案中做如下宣告
<uses-feature android:name = "android.hardware.bluetooth_le" android:required = true />
如果我們希望我們的應用程式在不支援 BLE 的裝置上也可以執行的時候,只需要將 true 修改成 false 就可以了。
還可以在程式碼中作出判斷
if(!getPackageManager().hasSystemFeature(PackgeManger.FEATURE_BLUETOOTH_LE)){
// 不支援 BLE 裝置
}
BLE 通常和位置有關係,因此還需要宣告位置許可權 ACCESS_COARSE_LOCATION
或者 ACCESS_FINE_LOCATION
沒有這些許可權掃描將不會返回任何結果。
設定 BLE
獲得 BluetoothAdapter
BluetoothAdapter 代表裝置自己的藍芽介面卡,整個系統只有一個藍芽介面卡,我們的應用程式可以使用此物件與其互動。
這裡的獲取方法是通過 BluetoothManager 來獲取的
BluetoothManager bluetoothManger = getSystemSerive(Context.BULETOOTH_SERVIcE); BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
啟用藍芽裝置
其實這些和普通藍芽的啟動都是一樣的。
isEnable()
檢視當前是否啟用了藍芽通過 BluetoothAdapter.ACTION_REQUEST_ENABLE 來啟動
查詢 BLE 裝置
這一點和發現普通的藍芽裝置是不一樣的
// 通過 Adapter 的 startLeScan(callBack); 方法來開啟掃描 // 如果我們有指定的藍芽裝置可以使用 sartLeScan(UUID[],BluetoothAdapter.LeScanCallBakc) 通過 UUID 來指定 BLe // 這個方法已經過時了,官方文件最新支援的掃描藍芽的方法是通過一個專門的物件 BluetoothLeScanner 用來開啟掃描低功耗藍芽 BluetoothLeScanner scanner = bluetoothAdapter.getBluetoothLeScanner(); // 這個方法可以有引數,用來過濾要掃描的低功耗藍芽的,具體的後面講 scanner.startScan();
只能單獨掃描普通藍芽裝置或者 BLE 裝置,沒有方法同時執行
連線到 GATT 伺服器
與 BLE 裝置通訊,第一步就是要連線到它,就是連線到該裝置的 GATT 服務。使用方法 connectGatt()
有三個引數:Context 物件 autoConnect (表示是否在可用的時候自己連線到 BLE 裝置) 還有一個回撥,所有的互動都在這個回撥裡面完成。
呼叫這個方法會返回一個 BluetoothGatt
物件,通過這個物件進行和 BLE 裝置的互動。互動的結果會在回撥方法中觸發。
public class BluetoothLeService extends Service{
private final static String TAG = BluetoothLeService.class.getSimpleName();
private BluetoothManger bluetoothManger;
private BluetoothAdapter bluetoothAdapter;
private String bluetoothDeviceAddress;
private BluetoothGatt bluetoothGatt;
private int connectionState = STATE_DISCONNECTED;
private static final int STATE_DISCONNECTED = 0;
private static final int STATE_CONNETING = 1;
private static final int STATE_CONNECTED = 2;
public final static String ACTION_GATT_CONNECTED = "com.example.bluetooth.le.ACTION_GATT_CONNECTED";
public final static String ACTION_GATT_DISCONNECTED = "com.example.bluetooth.le.ACTION_GATT_DISCONNECTED";
public final static String ACTION_GATT_SERVICES_DISCOVERED = "com.example.bluetooth.le.ACTION_GATT_SERVICES_DISCOVERED";
public final satic String ACTION_DATA_AVAILABLE = "com.example.bluetooth.le.ACTION_DATA_AVAILABLE";
public final static String EXTRA_DATA = "com.example.bluetooth.le.EXTRA_DATA";
public final static UUID UUID_HEART_RATE_MEASUREMENT = UUID.formString(SampleGattAttributes.HEART_RATE_MEASURMENT);
private final BluetoothGattCallback gattCallback = new BluetoothGattCallback(){
// 你的中央裝置連線上 ble 裝置後,會回撥這個這方法。
@Override
public viod onConnectionStateChange(BluetoothGatt gatt,int status,int newState){
String intenAction;
if(newState == BluetoothProfile.STATE_CONNECTED){
intentaction = ACTION_GATT_CONNECTED;
connectionState = STATE_CONNECTED;
broadcastUpdate(intentAction);
// 連線上後,緊接著就是要尋找裡面 Service
bluetoothGatt.discoverServices();
}else if(newState = BluetoothProfile.STATE_STATE_DISCONNECTED{
intentAction = ACTION_GATT_DISCONNECTED;
connectionState = STATE_DISCONNECTED;
broadcastUpdate(intentAction);
}
}
@Override
// service 發現後就會觸發這個方法,然後你就需要找到你和 ble 約定好的 service
public void onServicesDiscovered(BluetoothGatt gatt,int status){
if(status == BluetoothGatt.GATT_SUCCESS){
broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
}
}
public void onCharacteristicREad(。。。){
}
.......
}
}
當觸發特定的回撥的時候,會呼叫適當的 broadcastUpdate() 輔助方法並向其傳遞操作。具體的資料解析格式是根據配置檔案規範執行的(是你和你的BLE 裝置共同約定好的規範)
大體的過程中:開啟連線,然後會觸發對應的連接回調,然後發現服務,觸發發現服務回撥,獲取服務內部的特徵值,對其讀寫命令(和 BLE 共同約束的規範)。就是這麼一個過程,很簡單。
讀 BLE 屬性
一旦我們的 Android 裝置連線到了 GATT 伺服器並發現了服務,我們就可以在支援的位置讀取或者寫入屬性了。
完成後要記得關閉裝置 bluetoothGatt.close();
關於藍芽框架的一個庫:https://github.com/Alex-Jerry/Android-BLE
相關推薦
Android 藍芽開發(2)——低功耗藍芽
低功耗藍芽官方文件 本文章是參考官網,然後加入自己實踐中的理解完成!沒有看上一篇的讀者,可以先閱讀一下前一篇,這是一個系列。 官網地址:https://developer.android.com/guide/topics/connectivity/bluetooth-le Android 4.3 (API
藍芽學習(五)-- 低功耗藍芽(BLE)主機:屬性、服務
在BLE中服務、屬性、特性、行為很難理解。講得極其抽象,讓我疑惑的是它是一種邏輯上面的概念還是資料結構上的概念? 服務是一種或多種特性的組合,特性則由一種或多種屬性組成 BLE的對於服務上的概念上居然是來源於“面向物件程式設計(OOP)”: 類 物件 屬
藍芽學習(四)-- 低功耗藍芽(BLE)鏈路層資料包
octet : 八位位元組 鏈路層定義了兩個裝置如何利用無線電傳輸資訊。它包含了報文、廣播資料通道的詳細定義,也規定了發現其他裝置的流程、廣播的資料、連線的建立、連線的管理以及連線中的資料傳輸。 下圖是報文的基本結構,適用於所有的報文,無論其用途是什麼。報文一開始是一小段訓練
藍芽學習(三)-- 低功耗藍芽(BLE)協議棧
BLE協議棧為什麼要分層?怎麼理解BLE“連線”?如果BLE協議只有ATT層沒有GATT層會發生什麼? 協議棧框架 一般而言,我們把某個協議的實現程式碼稱為協議棧(protocol stack),BLE協議棧就是實現低功耗藍芽協議的程式碼,理解和掌握BLE協議是實現BLE協議棧的前
Android藍芽開發(一)之開啟藍芽和裝置搜尋
Android藍芽開發系列目錄: 一、判斷是否系統是否支援藍芽 在使用藍芽之前,我們首先要判斷手機裝置是否支援藍芽,雖然現在基本都支援藍芽了,但是為了程式碼的嚴謹性我們還是需要在程式碼中判斷: private BluetoothManager bluetoothma
iOS藍芽開發(二):iOS 藍芽4.0中心模式 程式碼實現
上一篇簡單介紹了藍芽的部分基礎知識,詳細的東西大家可以去github上搜babyBluetooth,裡面有一些學習資料 iOS連線外設的流程 建立中心管理者 掃描外設 discoverPeripheral 連線外設 connectPeripheral
MTK 驅動開發(36)---低功耗基礎知識
1、sleep /suspend suspend確切的說是MCU(ARM )的suspend,也就是cpu進入Wait for interrupt狀態(WFI);因為對整個系統來說,CPU進WFI是整個
android藍芽聊天開發(2)圖文混排+Notification訊息通知
使用listView,繼承BaseAdapter,實現聊天介面:,執行圖: layout_list_item.xml單個item條目的佈局,即圖片,聊天內容,時間的佈局: <?xml version="1.0" encoding="utf-8"?> <Relat
Android BLE低功耗藍芽開發(上)關於GATT伺服器的理論與搭建
前言 本來寫完Android開發之BlueTooth--最簡單的Andorid傳統藍芽通訊Demo之後,我打算寫一篇Android開發之BlueTooth--最簡單的Andorid低功耗(BLE)藍芽通訊Demo的。後來看了看官方的文件,我的天,谷歌給給出的sample裡
Android藍芽開發(二) BLE4.0低功耗藍芽
一、BLE4.0低功耗藍芽 Bluetooth Low Energy,藍芽低功耗,是從藍芽4.0開始支援的技術。相較傳統藍芽,傳輸速度更快、覆蓋範圍廣、安全性高、延時短、耗電低等特點。 二、關鍵術語 1.GATT(通用屬性配置):通用屬性配置檔案,用於ble鏈路上傳送和接
Android 藍芽開發(八)hfp接聽、結束通話電話
本文已授權微信公眾號 fanfan程式媛 獨家釋出 掃一掃文章底部的二維碼或在微信搜尋 fanfan程式媛 即可關注 繼續研究hfp相關功能。藍芽耳機可以控制手機接聽、拒接、結束通話電話,撥打電話等功能。本文主要分析下起這些操作的大致流程。 在
Android 藍芽開發(七)hfp音訊連線
本文已授權微信公眾號 fanfan程式媛 獨家釋出 掃一掃文章底部的二維碼或在微信搜尋 fanfan程式媛 即可關注 接著上一篇hfp連線繼續,檢視藍芽通話時如何進行處理的。hfp連線有兩個連線,一個是hfp連線(在設定介面顯示的是手機音訊),另
Android 藍芽開發(九)A2DP基本功能
本文主要是Android做為Audio Source端,A2DP的基本操作:包括連線、斷開連線、設定優先順序、獲取優先順序、獲取A2DP連線狀態、獲取A2DP連線的裝置列表等功能。 1 簡介 A2DP全名是Advanced Audio Distrib
Android 藍芽開發(十)A2DP原始碼分析
上一篇說了下A2DP的一些基本操作,這篇分析下系統應用、系統原始碼是如何操作A2DP的。尤其是其連線過程,基於Android4.3原始碼。Andorid手機一般都是做為A2DP Audio Source端。 1 連線過程 媒體音訊也就是A2DP,首先連線的藍芽裝置需要
Android studio 百度地圖開發(2)地圖定位
gcj02 settings tick all adding ext tope wid erro Android studio 百度地圖開發(2)地圖定位 email:[email protected]/* */ 開發環境:win7 64位
Android開發(2):資料儲存之一:SharedPrefrences和檔案讀寫
一、資料儲存 本文主要講前兩種儲存方式,其中檔案讀寫只記錄Internal Storage方式 1. SharedPrefrences方式 輕量級NVP方式儲存,以XML的檔案方式儲存,適合少量資料的儲存。 NVP:Name/Value pair, 名稱/值 對。 2.
藍芽開發(二)掃描裝置
一、申請位置許可權 在Android6.0以後要掃描藍芽裝置,還需要請求位置許可權: <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <
iOS藍芽開發(二)在裝置端實現Central角色
若想在裝置上實現Central角色的功能,主要有以下步驟: 2.搜尋周圍廣播的裝置 3.與一個外設進行連線,並探索外設提供的服務 4.向外設傳送讀寫characteristic的請求,如果有需要訂閱characteristic值得更新,來跟蹤資料的變化。 myCe
Android studio3.0對於百度地圖api開發(2)——百度地圖定位指定地點以及地圖型別的變換
承接上一篇文章寫的,https://blog.csdn.net/qq_41562408/article/details/82794772已經實現了百度地圖的工具準備以及基本的地圖顯示,不過就一個地圖應用來說,只是單純的顯示一種地圖型別以及只是能夠定位到天安門其他地
Android多媒體開發(2)————使用Android NKD編譯原版FFmpeg
/******************************************************************************************** * author:[email protected]大鐘