1. 程式人生 > >藍芽之資料傳輸問題

藍芽之資料傳輸問題

藍芽資料傳輸問題

對於藍芽來說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儲存器、以及豐富的數

IOSBLE讀取資料與寫入資料

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