1. 程式人生 > >Android 藍芽開發(2)——低功耗藍芽

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

  1. 獲得 BluetoothAdapter

    BluetoothAdapter 代表裝置自己的藍芽介面卡,整個系統只有一個藍芽介面卡,我們的應用程式可以使用此物件與其互動。

    這裡的獲取方法是通過 BluetoothManager 來獲取的

    BluetoothManager bluetoothManger = getSystemSerive(Context.BULETOOTH_SERVIcE);
    BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
  2. 啟用藍芽裝置

    其實這些和普通藍芽的啟動都是一樣的。

    isEnable() 檢視當前是否啟用了藍芽

    通過 BluetoothAdapter.ACTION_REQUEST_ENABLE 來啟動

  3. 查詢 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]大鐘