溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android通過BLE傳輸文件遇到問題怎么解決

發(fā)布時間:2023-04-27 11:20:20 來源:億速云 閱讀:130 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了Android通過BLE傳輸文件遇到問題怎么解決的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Android通過BLE傳輸文件遇到問題怎么解決文章都會有所收獲,下面我們一起來看看吧。

    1、遇到的問題

    公司要通過Android設(shè)備給外圍設(shè)備的固件進(jìn)行OTA升級,最開始想到的有兩種方案。

    1、將當(dāng)前Android設(shè)備所連接 Wifi名稱,WiFi密碼通過BLE發(fā)送給外圍設(shè)備。 外圍設(shè)備拿到當(dāng)前環(huán)境的WiFi名稱和密碼連接熱點(diǎn), 然后自己去服務(wù)器下載OTA文件,進(jìn)行升級

    2、當(dāng)前Android設(shè)備和外圍設(shè)備通過經(jīng)典藍(lán)牙進(jìn)行傳輸OTA文件, 外圍設(shè)備拿到OTA文件進(jìn)行升級

    但是很遺憾,外圍設(shè)備既沒有WiFi芯片, 也沒有經(jīng)典藍(lán)牙芯片, 只有一顆BLE(低功耗藍(lán)牙)芯片。 這意味著上面的兩種方案都行不通。 那我們能不能通過BLE芯片來做文章, 來傳輸OTA文件?

    BLE設(shè)計(jì)之初就是為了傳輸簡單的指令的, 傳輸一些小數(shù)據(jù)的, 每次發(fā)送的數(shù)據(jù)大小不能超過20個字節(jié)。到底靠不靠譜???

    2、 能不能通過BLE傳輸文件

    讓我們來問問 GPT 吧

    Android通過BLE傳輸文件遇到問題怎么解決

    GPT 的回答, 是可以通過BLE傳輸文件的, 由于BLE 每次傳輸?shù)膬?nèi)容最大為20個字節(jié), 傳輸大文件時就需要分包傳輸, 同時需要確保分包傳輸?shù)目煽啃院头€(wěn)定性。

    3、 如何傳輸文件

    讓 GPT 給我們一些示例代碼

    Android通過BLE傳輸文件遇到問題怎么解決

    可以看出, 發(fā)送端分包批量發(fā)送數(shù)據(jù),接收端

    4、如何保證可靠性和穩(wěn)定性

    Android通過BLE傳輸文件遇到問題怎么解決

    1、超時重傳

    藍(lán)牙在傳輸過程中, 可能會存在丟包的情況。分兩種情況, 1、Android設(shè)備發(fā)送的數(shù)據(jù),外設(shè)設(shè)備沒有收到。 2、Android設(shè)備發(fā)送的數(shù)據(jù),外設(shè)設(shè)備收到了,并且發(fā)送了回復(fù)確認(rèn)。 回復(fù)確認(rèn)包Android設(shè)備卻沒有收到。

    出現(xiàn)了這兩種情況的任意一種, 則認(rèn)為發(fā)生了丟包的情況。 Android 對這個包進(jìn)行重發(fā)。

    2、序列號

    針對超時重傳的第二種情況, 外設(shè)設(shè)備會收到兩個相同的包。 但是外設(shè)設(shè)備不清楚是不是重裝包。 這時就要給每個數(shù)據(jù)包添加序列號。 等外設(shè)設(shè)備收到兩個相同序列號的數(shù)據(jù)包時, 丟棄這個數(shù)據(jù)包, 回復(fù)Android設(shè)備收到此包, 開始發(fā)送下一個數(shù)據(jù)包。

    3、數(shù)據(jù)校驗(yàn)

    BLE在傳輸?shù)倪^程中, 如果周圍環(huán)境有強(qiáng)藍(lán)牙干擾,或者其他傳輸通道, 可能會導(dǎo)致數(shù)據(jù)包變更, 所以需要在數(shù)據(jù)包添加一個校驗(yàn)位, 這個校驗(yàn)位根據(jù)特定的算法,由數(shù)據(jù)包的數(shù)據(jù)計(jì)算得來。 外設(shè)設(shè)備收到數(shù)據(jù)后, 重新計(jì)算校驗(yàn)位, 判斷數(shù)據(jù)傳輸過程是否出現(xiàn)差錯, 如果計(jì)算的校驗(yàn)位和包傳輸?shù)男r?yàn)位不一致, 則要求Android設(shè)備重新發(fā)送這個包。

    5、 傳輸速度提升 RequestMtu

    為了保證傳輸過程中的可靠性和穩(wěn)定性,我們需要在傳輸包中,添加序列號,數(shù)據(jù)校驗(yàn)等信息。 Android默認(rèn)每個BLE數(shù)據(jù)包不超過20個字節(jié),當(dāng)我們加了一些其他信息時, 每次傳輸?shù)挠行?shù)據(jù)可能只有15個字節(jié)左右。 導(dǎo)致在傳輸?shù)倪^程中分包更多, 傳輸時間更長。

    為了提升傳輸?shù)乃俣龋?我們來提升BLE每個數(shù)據(jù)包的傳輸大小限制, 使每個分包可以傳輸更多的數(shù)據(jù)。 系統(tǒng)為我們提供了 RequestMtu這個接口。 需要在gatt連接成功時調(diào)用

        private val bluetoothGattCallback = object : BluetoothGattCallback() {
            override fun onConnectionStateChange(gatt: BluetoothGatt?, status: Int, newState: Int) {
                super.onConnectionStateChange(gatt, status, newState)
                if (newState == BluetoothGatt.STATE_CONNECTED) {
                    Log.d(TAG, "gatt  連接成功")
                    gatt?.requestMtu(40)
                } else {
                    Log.d(TAG, "gatt  連接失敗 status $status  newstate $newState")
                }
            }
            override fun onMtuChanged(gatt: BluetoothGatt?, mtu: Int, status: Int) {
                super.onMtuChanged(gatt, mtu, status)
                if (BluetoothGatt.GATT_SUCCESS == status) {
                    Log.d(TAG, "onMtuChanged suc : $mtu")
                    gatt?.discoverServices()
                } else {
                    Log.d(TAG, "onMtuChanged fail : $status")
                }
            }
        }

    MTU改變成功后, 再去gatt.discoverServices()發(fā)現(xiàn)服務(wù)

    關(guān)于“Android通過BLE傳輸文件遇到問題怎么解決”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Android通過BLE傳輸文件遇到問題怎么解決”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI