簡體   English   中英

Android BLE:了解 GattServer 端的 MTU

[英]Android BLE: knowing MTU on the GattServer side

我已經在 Android 上實現了 BLE 通信。 我正在使用requestMtu在客戶端協商 MTU。 這很有效,因為客戶端在onMtuChanged上獲得了 MTU 更改。 但是,我仍然沒有辦法知道服務器端的 MTU,只有客戶端。 我實現了自己的碎片/分段機制,因為有時我會發送合理數量的數據。 我想根據 MTU 大小對數據進行分段以加快通信速度。 我目前在服務器端一次發送 20 個字節,這有效但速度較慢。 有沒有辦法在服務器上獲取 MTU?

我完成這項工作的方式是等待連接,然后創建與通過onConnectionStateChange(...)函數連接的設備的連接。

private final BluetoothGattServerCallback mGattServerCallback = new BluetoothGattServerCallback() {
  @Override
  public void onConnectionStateChange(BluetoothDevice device, int status, int newState) {
      if (newState == Bluetooth.STATE_CONNECTED)
        device.connectGatt(MainActivity.this, false, mGattCallback);
      super.onConnectionStateChange(device, status, newState);
}

這允許我在結果成功連接上 requestMtu() 。

private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
      if (newState == Bluetooth.STATE_CONNECTED) {
        gatt.requestMtu(512);
      }
      super.onConnectionStateChange(gatt, status, newState);

    }
  };

requestMtu 調用會導致客戶端和服務器之間進行 Gatt MTU 交換。較小的 mtu 將是最后使用的。 如果您想知道服務器端的 mtu 大小,只需給“requestMtu”一個足夠大的參數即可”調用,並在“onMtuChanged”中得到結果。或者,在平台上查看您的 btsnoop 文件,您將准確獲得服務器上的 mtu 大小。

BluetoothGattServerCallback具有onMtuChanged方法,您可以覆蓋該方法並在協商后直接獲取 MTU(在來自中央端的請求之后):

@Override
public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
   super.onMtuChanged(gatt, mtu, status);
   this.mtu = mtu;
   Log.i(TAG, "New MTU: " + mtu + " , Status: " + status + " , Succeed: " + (status == BluetoothGatt.GATT_SUCCESS));
}

根據藍牙核心規范文檔,在 3.F 3.2.8 中:

同時充當服務器和客戶端的設備應對客戶端 Rx MTU 和服務器 Rx MTU 使用相同的值。

因此,使用您通過 GATT 客戶端 API 獲得的 MTU,它必須是相同的。

現在 BluetoothGattServerCallback 的正確簽名是 onMtuChanged(BluetoothDevice device, int mtu)

對於 C#,我使用了這個簽名:

        public override void OnMtuChanged(BluetoothDevice gatt, int mtu)
        {
            System.Diagnostics.Debug.WriteLine("OnMtuChanged: mtu is {0}", mtu);
        }

暫無
暫無

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

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