新聞中心
Android藍牙數(shù)據(jù)庫:優(yōu)化數(shù)據(jù)傳輸?shù)年P(guān)鍵

隨著移動設(shè)備和無線技術(shù)的不斷發(fā)展,藍牙技術(shù)作為較為成熟的無線通信技術(shù)之一,其應(yīng)用范圍也愈來愈廣泛,而Android藍牙數(shù)據(jù)庫在優(yōu)化數(shù)據(jù)傳輸方面起到了關(guān)鍵作用。本文將從Android藍牙數(shù)據(jù)庫的基本架構(gòu)入手,并結(jié)合其在優(yōu)化數(shù)據(jù)傳輸方面所發(fā)揮的重要作用進行探討。
一、Android藍牙數(shù)據(jù)庫基礎(chǔ)架構(gòu)
在Android藍牙上層協(xié)議棧中,藍牙數(shù)據(jù)庫是十分重要的一個組件,主要用來保存已連接藍牙設(shè)備的重要信息,如設(shè)備名稱、地址、服務(wù)UUID等。Android藍牙數(shù)據(jù)庫的結(jié)構(gòu)如下圖所示:

Android藍牙數(shù)據(jù)庫架構(gòu)圖
從圖中可以看出,Android藍牙數(shù)據(jù)庫主要包括三個層次,分別是Service、Profile和Device。其功能分別如下:
1. Service層:負責(zé)藍牙協(xié)議交互和管理BluetoothGattService等數(shù)據(jù),是整個Android藍牙通信的核心,是連接Profile和Device的橋梁。
2. Profile層:定義BluetoothProfile的抽象類,管理所有連接的Device,其主要分為兩類,即Server和Client,分別用來實現(xiàn)服務(wù)端或客戶端的程序處理邏輯。
3. Device層:管理BluetoothDevice的實例對象,例如bluetoothDevice.getProfileConnectionState()方法可用于獲取連接狀態(tài)。
對于Android應(yīng)用開發(fā)來說,最常用的是Profile層,通過Profile接口實現(xiàn)與服務(wù)器或客戶端的通信。其中最常用的Profile是BluetoothGatt和BluetoothA2dp,其中BluetoothGatt用于連接和通信廣泛應(yīng)用于智能手表、智能硬件等場景,而BluetoothA2dp則用于音頻傳輸,支持音頻數(shù)據(jù)的高質(zhì)量傳輸和實時控制,廣泛應(yīng)用于耳機、音響等場景。
二、Android藍牙數(shù)據(jù)庫優(yōu)化數(shù)據(jù)傳輸關(guān)鍵
在藍牙通信中,數(shù)據(jù)傳輸速率和效率一直是被廣泛關(guān)注的問題之一。針對這個問題,Android藍牙數(shù)據(jù)庫在優(yōu)化數(shù)據(jù)傳輸方面發(fā)揮了關(guān)鍵作用。
Android藍牙數(shù)據(jù)庫可以優(yōu)化數(shù)據(jù)傳輸存在以下幾個方面:
1. 編碼方式的優(yōu)化:在數(shù)據(jù)傳輸中,可以選擇更高效的編碼方式,例如base64、gzip等。這能夠有效地減小數(shù)據(jù)的傳輸量,提高效率。
2. 發(fā)送數(shù)據(jù)分塊:在發(fā)送數(shù)據(jù)的過程中,可以采用分塊發(fā)送的方式,將原本一次性發(fā)送的數(shù)據(jù)切成若干小塊逐一發(fā)送。這可以避免數(shù)據(jù)包過大,減小數(shù)據(jù)包的丟失風(fēng)險,從而提高數(shù)據(jù)傳輸?shù)某晒β省?/p>
3. 建立數(shù)據(jù)緩存:在數(shù)據(jù)傳輸時,可以建立數(shù)據(jù)緩存,緩存等待發(fā)送的數(shù)據(jù)。這樣,可以防止之前的數(shù)據(jù)完全發(fā)送完畢,下一個數(shù)據(jù)包卻已經(jīng)到達發(fā)送隊列,從而造成數(shù)據(jù)包混亂的情況。通過建立數(shù)據(jù)緩存,保證數(shù)據(jù)包的有序傳輸,提高數(shù)據(jù)傳輸?shù)某晒β省?/p>
4. 使用隊列處理數(shù)據(jù):在數(shù)據(jù)傳輸中,可以使用隊列進行數(shù)據(jù)處理,將需要發(fā)送的數(shù)據(jù)按照一定規(guī)則加入到隊列中,然后再在隊列中依次取出,這樣能夠避免在發(fā)送數(shù)據(jù)過程中數(shù)據(jù)包的丟失和錯位,保證數(shù)據(jù)傳輸?shù)某晒β屎退俾省?/p>
以上幾種優(yōu)化方式都可有效提高藍牙數(shù)據(jù)傳輸?shù)乃俾屎托?,并在Android藍牙數(shù)據(jù)庫中有所實踐。深入研究這些優(yōu)化方式,無疑有助于我們在日后的藍牙通信中更加高效地進行數(shù)據(jù)傳輸。
三、
本文從Android藍牙數(shù)據(jù)庫的基本架構(gòu)入手,結(jié)合Android藍牙數(shù)據(jù)庫優(yōu)化數(shù)據(jù)傳輸?shù)南嚓P(guān)知識進行了分析和探討。Android藍牙數(shù)據(jù)庫通過優(yōu)化編碼方式、分塊發(fā)送、建立數(shù)據(jù)緩存、使用隊列等方式,讓藍牙數(shù)據(jù)傳輸變得更加高效和可靠。在日后的藍牙通信中,結(jié)合這些優(yōu)化方式,我們可以更加高效地進行數(shù)據(jù)傳輸,從而為我們的應(yīng)用程序提供更加流暢和快速的體驗。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗豐富以策略為先導(dǎo)10多年以來專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,響應(yīng)式網(wǎng)站制作,設(shè)計師量身打造品牌風(fēng)格,熱線:028-86922220Android-Ble藍牙開發(fā)Demo示例–掃描,連接,發(fā)送和接收數(shù)據(jù),分包解包(附源碼)
萬物互聯(lián)
的物聯(lián)網(wǎng)時代的已經(jīng)來臨,ble藍牙開發(fā)在其中扮演著舉重若輕的角色。最近剛好閑一點,抽時間梳理下這塊的知識點。
涉及ble藍牙通訊的客戶端(開啟、掃描、連接、發(fā)送和接收數(shù)據(jù)、分包解包)和服務(wù)端(初始化廣播數(shù)據(jù)、開始廣播、配置Services、Server回調(diào)操作)整個環(huán)節(jié)以及一些常見的問題即踩過的一些坑。
比如
1、在Android不同版本或不同手機的適配問題,掃描不到藍拆拍牙設(shè)備
2、如何避免ble藍牙連接出現(xiàn)133錯誤?
3、單次寫的數(shù)據(jù)大小有20字節(jié)限制,如何發(fā)送長數(shù)據(jù)
藍牙有傳統(tǒng)(經(jīng)典)藍牙和低功耗藍牙BLE(Bluetooth Low Energy)之分,兩者的旅巖羨開發(fā)的API不一樣,本文主講Ble藍牙開發(fā),傳統(tǒng)藍牙不展開,有需要的可以自行了解。
相對傳統(tǒng)藍牙,BLE低功耗藍牙,主要特點是快速搜索,快速連接,超低功耗保持連接和數(shù)據(jù)傳輸。
客戶端
服務(wù)端
Android4.3(API Level 18)開始引入BLE的核心功能并提供了相應(yīng)的 API。
應(yīng)用程序
通過這些 API 掃描藍牙設(shè)備、查詢 services、讀寫設(shè)備的 characteristics(屬性特征)等操作。
BLE藍牙協(xié)議是GATT協(xié)議, BLE相關(guān)類不多, 全棗搭都位于android.bluetooth包和android.bluetooth.le包的幾個類:
android.bluetooth.
.BluetoothGattService 包含多個Characteristic(屬性
特征值
), 含有唯一的UUID作為標識
.BluetoothGattCharacteristic 包含單個值和多個Descriptor, 含有唯一的UUID作為標識
.BluetoothGattDescriptor 對Characteristic進行描述, 含有唯一的UUID作為標識
.BluetoothGatt 客戶端相關(guān)
.BluetoothGattCallback 客戶端連接回調(diào)
.BluetoothGattServer 服務(wù)端相關(guān)
.BluetoothGattServerCallback 服務(wù)端連接回調(diào)
android.bluetooth.le.
.AdvertiseCallback 服務(wù)端的廣播回調(diào)
.AdvertiseData 服務(wù)端的廣播數(shù)據(jù)
.AdvertiseSettings 服務(wù)端的廣播設(shè)置
.BluetoothLeAdvertiser 服務(wù)端的廣播
.BluetoothLeScanner 客戶端掃描相關(guān)(Android5.0新增)
.ScanCallback 客戶端掃描回調(diào)
.ScanFilter 客戶端掃描過濾
.ScanRecord 客戶端掃描結(jié)果的廣播數(shù)據(jù)
.ScanResult 客戶端掃描結(jié)果
.ScanSettings 客戶端掃描設(shè)置
BLE設(shè)備分為兩種設(shè)備: 客戶端(也叫主機/中心設(shè)備/Central), 服務(wù)端(也叫從機/外圍設(shè)備/peripheral)
客戶端的核心類是 BluetoothGatt
服務(wù)端的核心類是 BluetoothGattServer 和 BluetoothLeAdvertiser
BLE數(shù)據(jù)的核心類是 BluetoothGattCharacteristic 和 BluetoothGattDescriptor
下面詳細講解下客戶端和服務(wù)端的開發(fā)步驟流程
安卓手機
涉及藍牙權(quán)限問題,藍牙開發(fā)需要在AndroidManifest.xml文件中添加權(quán)限聲明:
在搜索設(shè)備之前需要詢問打開手機藍牙:
注意: BLE設(shè)備地址是動態(tài)變化(每隔一段時間都會變化),而經(jīng)典藍牙設(shè)備是出廠就固定不變了!
通過掃描BLE設(shè)備,根據(jù)設(shè)備名稱區(qū)分出目標設(shè)備targetDevice,下一步實現(xiàn)與目標設(shè)備的連接,在連接設(shè)備之前要停止搜索藍牙;停止搜索一般需要一定的時間來完成,更好調(diào)用停止搜索函數(shù)之后加以100ms的延時,保證系統(tǒng)能夠完全停止搜索藍牙設(shè)備。停止搜索之后啟動連接過程;
BLE藍牙的連接方法相對簡單只需調(diào)用connectGatt方法;
參數(shù)說明
與設(shè)備建立連接之后與設(shè)備通信,整個通信過程都是在BluetoothGattCallback的異步
回調(diào)函數(shù)
中完成;
BluetoothGattCallback中主要回調(diào)函數(shù)如下:
上述幾個回調(diào)函數(shù)是BLE開發(fā)中不可缺少的;
當(dāng)調(diào)用targetdDevice.connectGatt(context, false, gattCallback)后系統(tǒng)會主動發(fā)起與BLE藍牙設(shè)備的連接,若成功連接到設(shè)備將回調(diào)onConnectionStateChange方法,其處理過程如下:
判斷newState == BluetoothGatt.STATE_CONNECTED表明此時已經(jīng)成功連接到設(shè)備;
mBluetoothGatt.discoverServices();
掃描BLE設(shè)備服務(wù)是
安卓系統(tǒng)
中關(guān)于BLE藍牙開發(fā)的重要一步,一般在設(shè)備連接成功后調(diào)用,掃描到設(shè)備服務(wù)后回調(diào)onServicesDiscovered()函數(shù),函數(shù)原型如下:
BLE藍牙開發(fā)主要有負責(zé)通信的BluetoothGattService完成的。當(dāng)且稱為通信服務(wù)。通信服務(wù)通過
硬件工程師
提供的UUID獲取。獲取方式如下:
具體操作方式如下:
開啟監(jiān)聽,即建立與設(shè)備的通信的首發(fā)數(shù)據(jù)通道,BLE開發(fā)中只有當(dāng)客戶端成功開啟監(jiān)聽后才能與服務(wù)端收發(fā)數(shù)據(jù)。開啟監(jiān)聽的方式如下:
BLE單次寫的數(shù)據(jù)量大小是有限制的,
通常是20字節(jié)
,可以嘗試通過requestMTU增大,但不保證能成功。分包寫是一種解決方案,需要定義分包協(xié)議,假設(shè)每個包大小20字節(jié),分兩種包,
數(shù)據(jù)包
和非數(shù)據(jù)包。對于數(shù)據(jù)包,頭兩個字節(jié)表示包的序號,剩下的都填充數(shù)據(jù)。對于非數(shù)據(jù)包,主要是發(fā)送一些控制信息。
監(jiān)聽成功后通過向 writeCharacteristic寫入數(shù)據(jù)實現(xiàn)與服務(wù)端的通信。寫入方式如下:
其中:value一般為Hex格式指令,其內(nèi)容由設(shè)備通信的藍牙
通信協(xié)議
規(guī)定;
若寫入指令成功則回調(diào)BluetoothGattCallback中的onCharacteristicWrite()方法,說明將數(shù)據(jù)已經(jīng)發(fā)送給下位機;
若發(fā)送的數(shù)據(jù)符合通信協(xié)議,則服務(wù)端會向客戶端回復(fù)相應(yīng)的數(shù)據(jù)。發(fā)送的數(shù)據(jù)通過回調(diào)onCharacteristicChanged()方法獲取,其處理方式如下:
通過向服務(wù)端發(fā)送指令獲取服務(wù)端的回復(fù)數(shù)據(jù),即可完成與設(shè)備的通信過程;
當(dāng)與設(shè)備完成通信之后之后一定要斷開與設(shè)備的連接。調(diào)用以下方法斷開與設(shè)備的連接:
源碼上傳在CSDN上了,有需要的可以借鑒。
=====> Android藍牙Ble通訊Demo示例源碼–掃描,連接,發(fā)送和接收數(shù)據(jù),分包解包
BLE單次寫的數(shù)據(jù)量大小是有限制的,通常是20字節(jié),可以嘗試通過requestMTU增大,但不保證能成功。分包寫是一種解決方案,需要定義分包協(xié)議,假設(shè)每個包大小20字節(jié),分兩種包,數(shù)據(jù)包和非數(shù)據(jù)包。對于數(shù)據(jù)包,頭兩個字節(jié)表示包的序號,剩下的都填充數(shù)據(jù)。對于非數(shù)據(jù)包,主要是發(fā)送一些控制信息。
總體流程如下:
1、定義
通訊協(xié)議
,如下(這里只是個舉例,可以根據(jù)項目需求擴展)
2、封裝通用發(fā)送數(shù)據(jù)接口(拆包)
該接口根據(jù)會發(fā)送數(shù)據(jù)內(nèi)容按更大字節(jié)數(shù)拆分(一般20字節(jié))放入隊列,拆分完后,依次從隊列里取出發(fā)送
3、封裝通用接收數(shù)據(jù)接口(組包)
該接口根據(jù)從接收的數(shù)據(jù)按協(xié)議里的定義解析數(shù)據(jù)長度判讀是否完整包,不是的話把每條消息累加起來
4、解析完整的數(shù)據(jù)包,進行業(yè)務(wù)邏輯處理
5、協(xié)議還可以引入加密解密,需要注意的選算法參數(shù)的時候,加密后的長度更好跟原數(shù)據(jù)長度一致,這樣不會影響拆包組包
一般都是Android版本適配以及不同ROM機型(小米/紅米、華為/榮耀等)(EMUI、MIUI、ColorOS等)的權(quán)限問題
藍牙開發(fā)中有很多問題,要靜下心分析問題,肯定可以解決的,一起加油;
關(guān)于android 藍牙 數(shù)據(jù)庫的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都創(chuàng)新互聯(lián)科技公司主營:網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、小程序制作、成都軟件開發(fā)、網(wǎng)頁設(shè)計、微信開發(fā)、成都小程序開發(fā)、網(wǎng)站制作、網(wǎng)站開發(fā)等業(yè)務(wù),是專業(yè)的成都做小程序公司、成都網(wǎng)站建設(shè)公司、成都做網(wǎng)站的公司。創(chuàng)新互聯(lián)公司集小程序制作創(chuàng)意,網(wǎng)站制作策劃,畫冊、網(wǎng)頁、VI設(shè)計,網(wǎng)站、軟件、微信、小程序開發(fā)于一體。
網(wǎng)頁題目:Android藍牙數(shù)據(jù)庫:優(yōu)化數(shù)據(jù)傳輸?shù)年P(guān)鍵。(android藍牙數(shù)據(jù)庫)
網(wǎng)站路徑:http://www.dlmjj.cn/article/dhogjpo.html


咨詢
建站咨詢
