日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Android Kotlin&BLE(低功耗藍(lán)牙) 筆記

 codingSmart 2021-10-22

目錄

  • BLE 與經(jīng)典藍(lán)牙的區(qū)別

  • BLE 的 Kotlin 下實(shí)踐

  • 經(jīng)典藍(lán)牙(Classic Bluetooth)& 低功耗藍(lán)牙(Bluetooth Low Energy)

  • 經(jīng)典藍(lán)牙可以用與數(shù)據(jù)量比較大的傳輸,如語音,音樂,較高數(shù)據(jù)量傳輸?shù)取?/p>

  • BLE 特點(diǎn)就如其名,功耗更低的同時,對數(shù)據(jù)包做出了限制。所以適用于實(shí)時性要求比較高,但是數(shù)據(jù)速率比較低的產(chǎn)品,如鼠標(biāo),鍵盤,傳感設(shè)備的數(shù)據(jù)發(fā)送等。

藍(lán)牙 4.0 支持單模和雙模兩種部署方式,其中單模即是我們說的 BLE,而雙模指的是 Classic Bluetooth + BLE 。
實(shí)際上,BLE 和經(jīng)典藍(lán)牙的使用等各方面都像是沒有關(guān)聯(lián)的兩個東西,甚至因?yàn)?BLE 的通訊機(jī)制不同,所以是不能向下兼容的;經(jīng)典藍(lán)牙則可以兼容到藍(lán)牙 3.0 / 2.1。

經(jīng)典藍(lán)牙

參考官方文檔https://developer./guide/topics/connectivity/bluetooth.html?hl=zh-cn#TheBasics),因?yàn)橛兄形奈臋n,所以只要看這一篇文檔就可以應(yīng)付一般的開發(fā)了。

最重要的是這一次項(xiàng)目里的硬件貌似不能支持經(jīng)典藍(lán)牙,所以并沒有實(shí)踐的機(jī)會。

BLE

同樣,有條件一定要去看官方文檔,然而這一次并沒有中文版,或許可以找一些國內(nèi)大佬們翻譯的版本。
還有就是大佬 JBD 寫的 Android BLE 藍(lán)牙開發(fā)入門  http://www.jianshu.com/p/3a372af38103,而且還用 RxJava 封裝成一個庫可以直接調(diào)用:RxBLE  https://github.com/Belolme/RxBLE,是真的厲害,不妨去學(xué)習(xí)學(xué)習(xí)。

  • 概念與常用 API

UUID:每個服務(wù)和特征都會有唯一的 UUID ,由硬件決定。
服務(wù)(Service):藍(lán)牙設(shè)備中可以定義多個服務(wù),相當(dāng)于功能的集合。
特征(Characteristic):一個服務(wù)可以包含多個特征,可以通過 UUID 獲取到對應(yīng)的特征的實(shí)例,通過這個實(shí)例就可以向藍(lán)牙設(shè)備發(fā)送 / 讀取數(shù)據(jù)。

BluetoothDeivce:調(diào)用 startLeScan()獲取該實(shí)例,用于連接設(shè)備。
BluetoothManager:藍(lán)牙管理器,調(diào)用 getSystemService() 獲取,用于獲取藍(lán)牙適配器和管理所有和藍(lán)牙相關(guān)的東西。
BluetoothAdapter:藍(lán)牙適配器,通過 BluetoothManager 獲取,用于打開藍(lán)牙、開始掃描設(shè)備等操作。
BluetoothGatt:通用屬性協(xié)議, 定義了BLE通訊的基本規(guī)則,就是通過把數(shù)據(jù)包裝成服務(wù)和特征的約定過程。
BluetoothGattCallback:一個回調(diào)類,非常重要而且會頻繁使用,用于回調(diào) GATT 通信的各種狀態(tài)和結(jié)果。
BluetoothGattService:服務(wù),通過 BluetoothGatt 實(shí)例調(diào)用 getService(UUID) 獲取。
BluetoothGattCharacteristic:特征,通過 BluetoothGattService 實(shí)例調(diào)用 getCharacteristic(UUID) 獲取,是 GATT 通信中的最小數(shù)據(jù)單元。
BluetoothGattDescriptor:特征描述符,對特征的額外描述,包括但不僅限于特征的單位,屬性等。

  • 聲明權(quán)限

  • 初始化

  • 掃描設(shè)備與停止掃描

其實(shí) startLeScan() 已經(jīng)被聲明為過時,所以開始掃描還有其他的方法:

  • 連接藍(lán)牙設(shè)備
    此時已經(jīng)獲取到了藍(lán)牙設(shè)備的實(shí)例:mDevice,開始連接

關(guān)于 connectGatt() 的幾個參數(shù):

第二個參數(shù),autoConnect 為 true 時,如果設(shè)備斷開了連接將會不斷的嘗試連接。
第三個 BluetoothGattCallback 是一個接受回調(diào)的對象,也是這一部分的重點(diǎn)。
先看一下完整的 BluetoothGattCallback:

首先是 onConnectionStateChange(gatt,status,newState),
這個方法在成功連接、斷開連接等狀態(tài)改變的時候回調(diào),所以一開始會先進(jìn)入這個方法。
參數(shù)中, newState 代表當(dāng)前設(shè)備的連接的狀態(tài):

所以當(dāng) newState 為 2 的時候就是剛連上設(shè)備的時候,這時候可以調(diào)用
gatt.discoverServices() 開始異步的查找藍(lán)牙服務(wù):

執(zhí)行了discoverServices()后,若找到可用的服務(wù),系統(tǒng)又會回調(diào) mBluetoothGattCallback 里的onServicesDiscovered() 方法,所以添加:

如果成功寫入數(shù)據(jù),系統(tǒng)回調(diào) mBluetoothGattCallbackonCharacteristicWrite() 方法:

上面的代碼可以成功往硬件發(fā)送數(shù)據(jù),但是不能接受硬件返回的數(shù)據(jù)。
如果想要接受硬件返回的數(shù)據(jù),需要在 onServicesDiscovered(),也就是連上服務(wù)后,先不發(fā)送數(shù)據(jù)而是設(shè)置硬件返回數(shù)據(jù)的開關(guān):

實(shí)際上向硬件寫入數(shù)據(jù)這一段代碼有時候是可以省略的,只需要打開 Android 段的開關(guān)即可接收到返回的數(shù)據(jù),可能是和硬件有關(guān)。
這樣一來,就不能繼續(xù)在 onServicesDiscovered() 執(zhí)行寫入數(shù)據(jù)的代碼,改為在 onDescriptorWrite() 中執(zhí)行。

總結(jié)

如果寫過經(jīng)典藍(lán)牙的就知道,如果說兩者的搜索操作還差不多的話,連接操作和寫入操作就是完全不同的東西了。

經(jīng)典藍(lán)牙可以獲取到一個類似 TCP 中 Socket 的對象,然后獲取 InputStream 和OutputStream,二者分別通過套接字以及 getInputStream()和 getOutputStream()來處理數(shù)據(jù)傳輸。

而 BLE 中需要通過不同的 UUID 獲取對應(yīng)的服務(wù)、特征才可以寫入數(shù)據(jù)。

以上就是 BLE 最簡單的實(shí)現(xiàn),進(jìn)一步的封裝等就去看上面介紹的 RxBLE 吧。

還有就是用 Kotlin 寫的 MainActivity 部分(主要代碼):

BLE 相關(guān)的代碼是寫在了 Service 中,通過綁定時返回的 mBinder 來調(diào)用 Service 中的方法。

關(guān)鍵詞:code小生

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多