低功耗藍牙BLE傳統廣播總結

低功耗藍牙BLE傳統廣播總結

低功耗藍牙:Bluetooth Low Energy簡稱BLE,相較於傳統藍牙BT具有低功耗、低成本、小體積等優勢,BLE和BT都是工作在全世界公開通用的2.4GHz無線頻段上,但他們是完全不同的兩種技術,只是藍牙技術聯盟SIG將其歸入藍牙門類下,從而稱之爲BLE技術。

藍牙芯片當今有兩種不同的模式:單模、雙模

  • 單模:藍牙芯片只支持BT或BLE其中一種功能,但市面常見的單模爲BLE芯片居多

  • 雙模:藍牙芯片兩種功能都支持,一般如手機藍牙、PC藍牙等

本篇我們就來重點聊聊BLE的廣播,這是BLE功能開始的基礎。

BLE廣播分類:
在這裏插入圖片描述

  • 定向廣播:不可被掃描,只能被特定地址的藍牙BLE設備連接

  • 高、低佔空比:一個廣播週期內廣播佔用時間多的爲高佔空比,否則爲低佔空比

  • 使用擴展廣播時,廣播不能同時爲可連接可掃描的廣播

  • 使用擴展廣播時,可連接不可掃描的定向廣播只能爲低佔空比
    在這裏插入圖片描述

由於擴展廣播受限於芯片是否支持(藍牙協議5.x支持),所以我們接下來就以傳統廣播講解下BLE的廣播流程。

BLE廣播的流程包含四個步驟:設置廣播參數、設置廣播數據、設置掃描回覆數據、使能廣播,我們分別加以說明。

步驟1:設置廣播參數
在這裏插入圖片描述

從藍牙協議最新版本《Core_v5.2.pdf》可以知曉該HCI命令的參數部分總共15字節。安卓系統對應的是AdvertiseSettings或AdvertisingSetParameters參數,這兩個類都可以表示出廣播參數,只不過AdvertisingSetParameters包含的內容更多,同時也使用與擴展廣播,即如果你想使能一個擴展廣播,則參數只能使用AdvertisingSetParameters來組織。

AdvertiseSettings組織參數,需要關注如下數據:
在這裏插入圖片描述

AdvertisingSetParameters組織參數,需要關注如下參數:
在這裏插入圖片描述

AdvertiseSettings參數經過BluetoothLeAdvertiser.startAdvertising()會重新組織成AdvertisingSetParameters參數,最終在JNI層會被轉化成HCI命令中所需的參數。

步驟2:設置廣播數據

廣播數據就是對外廣播時自帶的相關data,這需要應用層主動設置好想廣播的數據。
在這裏插入圖片描述

從協議規定可以看出設置的廣播數據長度爲31字節,所以應用層在設置廣播data時需要考慮data長度,不然多餘長度的數據是發不出去的。
在這裏插入圖片描述

步驟3:設置掃描回覆數據

當有scanner掃描該廣播時,需要回復給該scanner的數據。數據組成和廣播數據相同,數據長度也是限制在31字節。
在這裏插入圖片描述

步驟4:使能廣播

前面三個步驟相關參數設置成功後,開始廣播。
在這裏插入圖片描述

到這兒,BLE傳統廣播就被使能起來了,下面我們以開啓廣播的時序圖詳細瞭解下相關流程:
在這裏插入圖片描述

從上面的時序圖可以看出上層應用只需要將相關數據構造後調用BluetoothLeAdvertiser. startAdvertising()接口開始廣播,底層使能廣播是否成功通過回調的方式告知應用。

但應用層設置廣播回調的方式有兩種:

  1. BluetoothLeAdvertiser.startAdvertising():回調使用AdvertiseCallback,這樣回調給應用的信息只有當初設置的廣播參數AdvertiseSettings。優點是操作簡單,缺點就是更改廣播參數數據等需要停止廣播,重新調用廣播開始API。

  2. BluetoothLeAdvertiser.startAdvertisingSet():回調使用AdvertisingSetCallback,這樣回調給應用的會有一個重要參數AdvertisingSet,應用可以通過該類操作當前的廣播,方法很多比如開始廣播關閉廣播重置廣播參數重置廣播數據重置廣播掃描回覆數據獲取廣播使用的地址等等單一操作,不需要將所有數據一起下發給底層Controller,如此可以更方便應用層對廣播的控制。

安卓原生的藍牙協議棧在使能廣播時,有些廣播參數是被固定的,如下表:
在這裏插入圖片描述

廣播數據和掃描回覆數據的構造就會複雜些,但也是有相關規定的。數據格式如下圖:
在這裏插入圖片描述

一個廣播數據是由一系列構造AD Structure組成的,每個構造是長度length(一個字節)加上數據Data組成,而Data就是由AD Type + AD Data構成,AD Type的定義已在協議中規定好了,感興趣的可以自行在藍牙官網上查看assigned-numbers中的generic-access-profile協議中定義的內容。安卓源碼中常用的AD Type類型如下:

    private static final int COMPLETE_LIST_16_BIT_SERVICE_UUIDS = 0X03;

    private static final int COMPLETE_LIST_32_BIT_SERVICE_UUIDS = 0X05;

    private static final int COMPLETE_LIST_128_BIT_SERVICE_UUIDS = 0X07;

    private static final int SHORTENED_LOCAL_NAME = 0X08;

    private static final int COMPLETE_LOCAL_NAME = 0X09;

    private static final int TX_POWER_LEVEL = 0x0A;

    private static final int SERVICE_DATA_16_BIT_UUID = 0X16;

    private static final int SERVICE_DATA_32_BIT_UUID = 0X20;

    private static final int SERVICE_DATA_128_BIT_UUID = 0X21;

    private static final int MANUFACTURER_SPECIFIC_DATA = 0XFF;

從協議中可以知道AD Type佔用一個字節,所以實際的AD Data數據長度爲length-1個字節。

BLE的傳統廣播我們就分析到這兒,感興趣的小夥伴歡迎私信留言一起討論。

更多互聯互通技術,歡迎關注微信公衆號:Connectivity
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章