簡體   English   中英

使用多個 BLE 外設連接處理 Android 上的通知

[英]Handling Notifications on Android with Multiple BLE Peripheral Connections

因此,我是 Android 開發的新手,我正在嘗試將我的設備連接到多個 BLE 設備( T-Wristband )以接收頻繁的通知(IMU 傳感器數據在50Hz時少於 20 個字節)。

連接到多個設備時,我丟失了一個或多個設備的數據 我懷疑原因是我的BluetoothGattCallback方法onCharacteristicChanged正在為所有設備在同一個線程上工作(注意:我已經通過記錄Thread.currentThread.getName()進行了檢查)。

我試過的:

1. Android 4.3:如何連接多個低功耗藍牙設備

我懷疑每個人添加延遲只是為了讓 BLE 系統在您提交另一個之前完成您要求的操作。

問題:我無法在接收通知時添加延遲,因為這會干擾我的采樣率,而且我不確定何時可以從另一台設備甚至是同一台設備接收到新通知。

2. Android BLE多連接

要實現多個 BLE 連接,您必須存儲多個BluetoothGatt對象並將這些對象用於不同的device

在這方面:我嘗試為我的設備 TTGODevice 編寫自定義TTGODevice ,它在連接時保存相應BluetoothGatt的實例:

public class TTGODevice {
  /* Bunch of psf constants */
  private BluetoothDevice device;
  private Context context;
  private Accelerometer acc;
  private BluetoothGatt server;
  private int deviceStatus;

  private final BluetoothGattCallback bluetoothGattCallback = new BluetoothGattCallback() { ...
  };

  public TTGODevice(Context context, BluetoothDevice device) {
    this.device = device;
    this.context = context;
    this.acc = new Accelerometer(); // My custom class for accelerometer on the T-Wristband device(s)
  }

  public void connect(boolean autoConnect) {
    server = device.connectGatt(context, false, bluetoothGattCallback);
  }

  /*Getters for device, server, and deviceStatus*/
}

BluetoothGattCallback中,我重寫我的onCharacteristicChanged如下:

@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {

  byte[] bytes = characteristic.getValue();

  // updating the Accelerometer
  acc.update(bytes);
  Log.d(TAG, "onCharacteristicChanged: " + Thread.currentThread().getName());
}

我也嘗試在上面的回調中使用我的server的確切實例,但我運氣不好。

byte[] bytes = server.getService(SERVICE_UUID).getCharacteristic(CHARACTERISTIC_UUID).getValue();

長話短說,我一直沒有成功。 我將不勝感激任何其他相關線程。

[注意:有人建議我使用Fragments和/或ViewModels 我不確定它們是如何相關的。]

Android 上的 BLE 似乎無法處理50Hz及更高的采樣率。 我不確定這是 BLE 相關的問題,還是與onCharacteristicCHanged方法調用過於頻繁有關。 我通過每50 毫秒發送更大的數據包來解決這個問題,這與我原來每 20毫秒發送一次的情況相反。 藍牙 4.2開始,可以使用更大的 BLE 數據包,它使用MTU最大吞吐量單位)進行控制。 這個博客幫助我理解了底層機制。

當通過 BLE 以高采樣率接收大數據包時,最好在 Android 上相應的BluetoothGattCallback中使用MY_DESIRED_MTU > 20Bytesgatt.requestMtu(MY_DESIRED_MTU) 。應該注意的是,較大的 MTU 意味着數據需要更長的時間寫在服務器設備的 BLE 特征上。

總之,我是用更大的數據包和更大的延遲來彌補采樣率的限制。 對於 T 腕帶中 IMU 上100Hz的采樣率,我使用95 字節的 MTU,由 Android 設備請求,並且 T 腕帶上的計時器有50 毫秒的延遲。 這允許我每50 毫秒接收五個連續的數據樣本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM