91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

發布時間:2023-04-27 11:20:20 來源:億速云 閱讀:141 作者:iii 欄目:開發技術

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

    1、遇到的問題

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

    1、將當前Android設備所連接 Wifi名稱,WiFi密碼通過BLE發送給外圍設備。 外圍設備拿到當前環境的WiFi名稱和密碼連接熱點, 然后自己去服務器下載OTA文件,進行升級

    2、當前Android設備和外圍設備通過經典藍牙進行傳輸OTA文件, 外圍設備拿到OTA文件進行升級

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

    BLE設計之初就是為了傳輸簡單的指令的, 傳輸一些小數據的, 每次發送的數據大小不能超過20個字節。到底靠不靠譜啊?

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

    讓我們來問問 GPT 吧

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

    GPT 的回答, 是可以通過BLE傳輸文件的, 由于BLE 每次傳輸的內容最大為20個字節, 傳輸大文件時就需要分包傳輸, 同時需要確保分包傳輸的可靠性和穩定性。

    3、 如何傳輸文件

    讓 GPT 給我們一些示例代碼

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

    可以看出, 發送端分包批量發送數據,接收端

    4、如何保證可靠性和穩定性

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

    1、超時重傳

    藍牙在傳輸過程中, 可能會存在丟包的情況。分兩種情況, 1、Android設備發送的數據,外設設備沒有收到。 2、Android設備發送的數據,外設設備收到了,并且發送了回復確認。 回復確認包Android設備卻沒有收到。

    出現了這兩種情況的任意一種, 則認為發生了丟包的情況。 Android 對這個包進行重發。

    2、序列號

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

    3、數據校驗

    BLE在傳輸的過程中, 如果周圍環境有強藍牙干擾,或者其他傳輸通道, 可能會導致數據包變更, 所以需要在數據包添加一個校驗位, 這個校驗位根據特定的算法,由數據包的數據計算得來。 外設設備收到數據后, 重新計算校驗位, 判斷數據傳輸過程是否出現差錯, 如果計算的校驗位和包傳輸的校驗位不一致, 則要求Android設備重新發送這個包。

    5、 傳輸速度提升 RequestMtu

    為了保證傳輸過程中的可靠性和穩定性,我們需要在傳輸包中,添加序列號,數據校驗等信息。 Android默認每個BLE數據包不超過20個字節,當我們加了一些其他信息時, 每次傳輸的有效數據可能只有15個字節左右。 導致在傳輸的過程中分包更多, 傳輸時間更長。

    為了提升傳輸的速度, 我們來提升BLE每個數據包的傳輸大小限制, 使每個分包可以傳輸更多的數據。 系統為我們提供了 RequestMtu這個接口。 需要在gatt連接成功時調用

        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()發現服務

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

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    德州市| 邳州市| 德阳市| 浦城县| 靖安县| 兴化市| 札达县| 宜川县| 毕节市| 浙江省| 伊通| 绥芬河市| 雷山县| 松原市| 龙门县| 大厂| 五大连池市| 竹北市| 鸡西市| 扎囊县| 湖州市| 方城县| 修武县| 西畴县| 茂名市| 乌拉特后旗| 长宁县| 汉川市| 青田县| 铅山县| 四平市| 西盟| 年辖:市辖区| 三明市| 曲麻莱县| 眉山市| 婺源县| 泊头市| 六枝特区| 泸溪县| 永和县|