藍芽之資料傳輸問題
藍芽資料傳輸問題
對於藍芽來說google已經封裝好了很多api所以使用起來並不會很難,但是實際開發中藍芽開發最頭疼的問題不是如何去呼叫api,而是資料的互動方面,如長連線,資料續傳,硬體接受速率等問題.
開啟藍芽有幾種方式?
首先我們先了解下幾種常用的開啟方式.
- 第一種方法相對簡單,直接呼叫系統對話方塊啟動藍芽:
在AndroidManifest檔案中新增需要的許可權,高版本也不需要動態授權:
<uses-permission android:name="android.permission.BLUETOOTH" />
//處理回撥對話方塊
startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), 1);
- 第二種方法,靜默開啟,不會有方法一的對話方塊:
在AndroidManifest檔案中新增需要的許可權:
- 在AndroidManifest中配置需要的許可權.
- 對於6.0的執行時許可權進行適配,在java中動態授權.
- 最後直接調api開啟
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
mBluetoothAdapter.enable(); //開啟
//mBluetoothAdapter.disable(); //關閉
如何搜尋藍芽裝置?
搜尋分為:主動搜尋和被動搜尋。
- 主動搜尋
- 建立BluetoothAdapter物件
- 配對的藍芽裝置列表
- 定義傳送接收廣播
藍芽的UUID是什麼?有什麼用?
UUID(Universally Unique Identifier) 統一表示定義.
藍芽是通過串列埠傳送AT命令,藍芽預設是在資料模式的,要配置為AT命令模式,對其進行設定,不過UUID在出廠前是設定過的.
對於藍芽裝置,每個服務都有一個與它對應的UUID(唯一的).
如:
資訊同步服務:00001104-0000-1000-8000-00805F9B34FB
檔案傳輸服務:00001106-0000-1000-8000-00805F9B34FB
如何使用藍芽進行資料傳輸?
藍芽模組通訊最重要的地方就是資料的傳送和接收,其傳輸資料與Socket類似。
- 在網路中使用Socket和ServerSocket控制客戶端和服務端的資料讀寫。
- 而藍芽通訊也由客戶端和服務端Socket來完成。藍芽客戶端Socket是BluetoothSocket,藍芽服務端Socket是BluetoothServerSocket。這兩個類都在android.bluetooth包中。
- 無論是BluetoothSocket,還是BluetoothServerSocket,都需要一個UUID(全域性唯一識別符號,Universally Unique Identifier),UUID相當於Socket的埠,而藍芽地址相當於Socket的IP。
實際開發中需要注意的地方.
需要注意的
1. 因為涉及涉及到I/O程式設計,所以需要注意兩端的編碼’utf-8’要一致.
2. 客戶端與服務端的UUID也要相同.
3. 藍芽屬於底層資料傳輸,所以實際開發更多傳送的是16進位制資料.
4. 因為涉及到了I/O程式設計,所以對執行緒控制這塊(同步,鎖機制)需要注意使用.
5. 對於一些大容量位元組陣列的傳送需要注意的地方.
6. 為了使用者更好的體檢避免流量的過度浪費,使用阻塞式的InputStream讀取.
1. 因為涉及涉及到I/O程式設計,所以需要注意兩端的編碼’utf-8’要一致.
os.write("datas....".getBytes("utf-8"));
2. 客戶端與服務端的UUID也要相同.
//客戶端Socket
device.createRfcommSocketToServiceRecord(MY_UUID);
//服務端Socket
mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
3. 藍芽屬於底層資料傳輸,所以實際開發更多傳送的是16進位制資料.
public static String bytesToHexString(byte[] bytes) {
String result = "";
for (int i = 0; i < bytes.length; i++) {
String hexString = Integer.toHexString(bytes[i] & 0xFF);
if (hexString.length() == 1) {
hexString = '0' + hexString;
}
result += hexString.toUpperCase();
}
return result;
}
5. 對於一些大容量位元組陣列的傳送需要注意的地方.
我們需要傳送64個位元組的陣列,如果一次性發送過去,微控制器那裡可能無法及時處理以致沒有任何迴應,因為微控制器那裡是設定了資料接收的延時時間。要想暢通的與藍芽模組通訊,考慮這個時間差非常重要。調整位元組的傳送速率,就成為非常關鍵的一步。值得注意的是,資料的傳送是非常快的,就是因為這樣才會導致微控制器那裡無法及時處理,所以,每次傳送後的延時是非常重要的。我們微控制器那裡的延時是10毫秒,所以我們選擇傳送完每個位元組後就延時10毫秒再發下個位元組。
for (byte b : bytes) {
out.write(b);
Thread.sleep(10);
}
6.為了使用者更好的體檢避免流量的過度浪費,使用阻塞式的InputStream讀取.
在使用InputStream的時候,必須注意,InputStream的讀取是阻塞的。這點在一般的情況下是不會影響到我們的程式,但是記住這個情況對於程式碼的設計是非常重要的,尤其是在考慮使用者體驗的時候。
無引數的read()是每次只從流中讀取一個位元組,這種做法效率非常低,但是簡單,像是讀取整數值這種情況,使用read()就非常好,但如果是16進位制字串呢?使用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,這樣一次就能讀取多個位元組。
如果是讀取多個位元組,我們常常使用InputStream.available()方法來獲取資料流中可讀位元組的個數。讀取本地資料的時候,該方法發揮得非常好,但如果是讀取非本地資料,就可能出現位元組遺漏的問題,像是要讀取100個位元組,可能就是90個,甚至是0個。
出現0個的情況就是微控制器那邊沒有響應或者位元組還沒傳送過來,這時我們就需要一個迴圈來保證我們能夠拿到資料:
int count = 0;
while (count == 0) {
count = in.available();
}
byte[] bytes = new byte[count];
in.read(bytes);
但像是上面的90個位元組的情況就是位元組遺漏。對於這種情況,解決方法也很簡單:
byte[] bytes = new byte[count];
int readCount = 0; // 已經成功讀取的位元組的個數
while (readCount < count) {
readCount += in.read(bytes, readCount, count - readCount);
}
相關推薦
藍芽之資料傳輸問題
藍芽資料傳輸問題 對於藍芽來說google已經封裝好了很多api所以使用起來並不會很難,但是實際開發中藍芽開發最頭疼的問題不是如何去呼叫api,而是資料的互動方面,如長連線,資料續傳,硬體接受速率等問題. 開啟藍芽有幾種方式? 首先我們先了解下幾種常用的開啟方式. 第一種方法相對簡單,直接呼叫系統對
android 藍芽之資料傳輸
因為專案需要,需要將本地資料庫的資料,通過藍芽傳輸到另一臺裝置上。然後百度了蠻久,看了蠻多的,覺得有必要自己整理一下,藍芽的傳輸功能。 首先,我們都知道的,藍芽連線數需要先配對的,兩臺手機配對後才可進行藍芽處理。對於藍芽配對的方法網上一大堆,我也就不具體說了,大概記錄一
BLE4.0藍芽中資料包傳輸的大小的定義 BLE PACKET FORMAT
轉自:https://blog.csdn.net/chengdong1314/article/details/62038429 SYD8801是一款低功耗高效能藍芽低功耗SOC,集成了高效能2.4GHz射頻收發機、32位ARM Cortex-M0處理器、128kB Flash儲存器、以及豐富的數
IOS之BLE藍芽讀取資料與寫入資料
1.本篇文章歸納了詳細的藍芽讀取,與藍芽寫入的通訊。 2.藉助公司最近一直研發藍芽裝置專案,博主一路走過來,也遇到不少的坑,希望在此能夠給予更多看官的幫助。 藍芽的讀取 UUID的主要類檔案,歸納放置在一個檔案:Constants.h #define APP
ionic專案中JavaScript與ble(低功耗藍芽)裝置傳輸資料
需要實現的目標:app向ble傳輸一個時間。根據協議,所傳輸的時間格式為(全部為hex,中間無空格):c0 00 10 01 07 15 15 15 08前兩位為協議頭(byte0,、byte1),接下來分別是為(byte2~byte8):年 月 日 時 分 秒 時區————
藍芽學習之旅——低功耗藍芽之報文(廣播報文&資料報文)
1.低功耗藍芽規範中,有兩類報文:廣播報文和資料報文。 (1)裝置利用廣播報文發現、連線其它裝置。一旦連線建立之後,則開始使用資料報文。 (2)低功耗藍芽規定了3個廣播通道和37個數據信道。 2.無論是廣播報文還是資料報文,鏈路層只使用一種資料包格式: 注:報文是一位元
微信小程式 藍芽 長資料包 分包拆包
https://www.jianshu.com/p/de7bd0093c43 關於 微信小程式藍芽 分包傳送 及 多包傳送 不返回問題 關於分包傳送 20位元組分包,微信小程式支援多於20位元組傳送。但是低功耗藍芽傳輸可能會有問題,建議分包傳送 for
一分鐘讀懂低功耗藍芽連線資料包
一分鐘讀懂低功耗藍芽(BLE)連線資料包1.概述 BLE 連線過程中有三個重要的資料包:SCAN_REQ, SCAN_RSP 和 CONNECT_REQ。 SCAN_REQ: 掃描請求,由主裝置(MASTER DEVICE)向從裝置(SLAVE DEV
利用藍芽廣播資料
一個Activity搞定. 在自定義一個myAppliction繼承系統的Appliction,我在onCreate()裡進行自動開啟藍芽. public class MyApplication extends Application { @Override public
[BLE]低功耗藍芽之GAP、GATT
轉載自: https://blog.csdn.net/qq_21842557/article/details/50771077 一、開篇 本篇主要介紹一下關於BLE開發過程中必須瞭解的兩個協議:GAP(通用訪問協議)、GATT(通用屬性協議
AC690X藍芽音訊資料模組支援BLE和SPP透傳雙模藍芽支援TF卡播放
概述 1.1 簡介 BT201藍芽模組是一款支援藍芽以及U盤、TF卡播放的4合一的單晶片,晶片的亮點在支援無損音樂的播放,以及簡單明瞭的串列埠控制功能,支援BLE透傳,以及SPP透傳功能。大大降低了嵌入藍芽在其它產品的開發難度。 備註: 1、由於此模組只是測試板,後
藍芽收發資料長度的問題
最近公司韌體工程師在除錯時發現一個問題,藍芽裝置和安卓APP可以正常通訊,但是和iOS APP總是傳輸資料超時,之後斷開連線,應該是程式問題,之前遇到過一次,但是隻有那一次,想偷下懶所以就沒改,這次又出現了就不得不改了。用xcode執行專案,開啟log,在 - (void)peripheral:(CB
[藍芽]低功耗藍芽之 GAP、GATT
低功耗藍芽之 GAP、GATT 低功耗藍芽之 GAP、GATT 基礎介紹 BLE GAP GAP 協議 GAP 裝置角色 GAP 廣播資料 GAP 廣播流程
Android 解析藍芽廣播資料
依據Android ScanRecord類的原始碼編寫了ScanRecordUtil 類,掃描BLE裝置,會獲取byte[] scanRecord位元組陣列,可直接呼叫ScanRecordUtil.parseFromBytes(scanRecord).toString();獲取廣播中
[藍芽]藍芽之 SPP、HFP
藍芽之 SPP、HFP 藍芽之 SPP、HFP SPP HFP 藍芽之 SPP、HFP SPP 藍芽串列埠是基於 SPP 協議(Serial Port Profile),能在藍芽裝置之間建立串列埠進行資料傳輸
[藍芽]藍芽之 A2DP、AVRCP
藍芽之 A2DP、AVRCP 藍芽之 A2DP、AVRCP A2DP AVRCP 藍芽之 A2DP、AVRCP A2DP A2DP全名是Advenced Audio Distribution Profile
藍芽之十九-HFPclient
在高通平臺和三星平臺上調過這個功能,基於安卓6.0,該功能是將手機上的藍芽功能用成和藍芽耳機一樣的功能。藍芽電話和藍芽音樂它們之間的差異較大,藍芽電話要求實時性比較高,其和A2DP使用的物理通路並不一致,藍芽電話走pcm物理通路,而藍芽音樂走uart通路。 關鍵詞 Hfpc
安卓藍芽4.0以上連線多臺裝置並接收藍芽裝置資料
前沿: 在我之前寫的程式碼中都沒有實現藍芽連線多個裝置,由於時間的原因沒有進行更改。 iOS端實現 藍芽多個連線確實比安卓的方便,本身利用官方的Demo就可以實現多臺連線,只不過自己利用view加以區分就可以。 到此藍芽4.0之前是通過scoket連線多臺
藍芽之十一 AVRCP協議
Profile簡介 AVRCP子協議的作用是支援CT控制TG,具體來說如果手機和一個藍芽音箱裝置連線上了,那麼音箱可以控制手機播放/暫停/切歌以及獲得手機上播放歌曲的資訊,如專輯,歌名,歌手,時長等資訊。iphone對資訊獲取支援較為完善,安卓手機差異性比較大,且支援的沒有
如何提高藍芽BLE的傳輸速率和穩定性
藍芽BLE的最大特點就是低功耗,而低速率和簡單的互動協議是降低功耗的重要組成部分。因此BLE一般應用於低速率的近場控制和資料互動,如智慧家電、運動手環等等,小數量的控制和互動對傳輸速度沒有要求,每秒1K位元組就可以了,有時為了功耗可能會更低。但在某些場景下,可能要求BLE