您好,登錄后才能下訂單哦!
這篇文章主要介紹了Android通過BLE傳輸文件遇到問題怎么解決的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Android通過BLE傳輸文件遇到問題怎么解決文章都會有所收獲,下面我們一起來看看吧。
公司要通過Android設備給外圍設備的固件進行OTA升級,最開始想到的有兩種方案。
1、將當前Android設備所連接 Wifi名稱,WiFi密碼通過BLE發送給外圍設備。 外圍設備拿到當前環境的WiFi名稱和密碼連接熱點, 然后自己去服務器下載OTA文件,進行升級
2、當前Android設備和外圍設備通過經典藍牙進行傳輸OTA文件, 外圍設備拿到OTA文件進行升級
但是很遺憾,外圍設備既沒有WiFi芯片, 也沒有經典藍牙芯片, 只有一顆BLE(低功耗藍牙)芯片。 這意味著上面的兩種方案都行不通。 那我們能不能通過BLE芯片來做文章, 來傳輸OTA文件?
BLE設計之初就是為了傳輸簡單的指令的, 傳輸一些小數據的, 每次發送的數據大小不能超過20個字節。到底靠不靠譜啊?
讓我們來問問 GPT 吧
GPT 的回答, 是可以通過BLE傳輸文件的, 由于BLE 每次傳輸的內容最大為20個字節, 傳輸大文件時就需要分包傳輸, 同時需要確保分包傳輸的可靠性和穩定性。
讓 GPT 給我們一些示例代碼
可以看出, 發送端分包批量發送數據,接收端
藍牙在傳輸過程中, 可能會存在丟包的情況。分兩種情況, 1、Android設備發送的數據,外設設備沒有收到。 2、Android設備發送的數據,外設設備收到了,并且發送了回復確認。 回復確認包Android設備卻沒有收到。
出現了這兩種情況的任意一種, 則認為發生了丟包的情況。 Android 對這個包進行重發。
針對超時重傳的第二種情況, 外設設備會收到兩個相同的包。 但是外設設備不清楚是不是重裝包。 這時就要給每個數據包添加序列號。 等外設設備收到兩個相同序列號的數據包時, 丟棄這個數據包, 回復Android設備收到此包, 開始發送下一個數據包。
BLE在傳輸的過程中, 如果周圍環境有強藍牙干擾,或者其他傳輸通道, 可能會導致數據包變更, 所以需要在數據包添加一個校驗位, 這個校驗位根據特定的算法,由數據包的數據計算得來。 外設設備收到數據后, 重新計算校驗位, 判斷數據傳輸過程是否出現差錯, 如果計算的校驗位和包傳輸的校驗位不一致, 則要求Android設備重新發送這個包。
為了保證傳輸過程中的可靠性和穩定性,我們需要在傳輸包中,添加序列號,數據校驗等信息。 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傳輸文件遇到問題怎么解決”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。