Android BLE:了解GattServer端的MTU

时间:2016-08-10 18:02:16

标签: android bluetooth bluetooth-lowenergy

我在Android上实现了BLE通信。我正在使用requestMtu在客户端协商MTU。这很有效,因为客户端在onMtuChanged上获得了MTU更改。但是,我仍然无法知道服务器端的MTU,只知道客户端。我实现了自己的碎片/分段机制,因为有时我会发送合理数量的数据。我想根据MTU大小对数据进行分段,以加快通信速度。我目前在服务器端一次发送20个字节,但有效但速度较慢。有没有办法在服务器上获取MTU?

5 个答案:

答案 0 :(得分:4)

我做这项工作的方法是等待连接,然后与通过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);
}

这允许我在结果成功的连接上请求.Mtu()。

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);

    }
  };

答案 1 :(得分:3)

requestMtu呼叫将导致客户端与客户端之间的Gatt MTU交换。较小的mtu将是最后使用的。 如果你想知道服务器端的mtu大小,只需给出一个足以支持“requestMtu”调用的参数,并将结果输入“onMtuChanged”。 或者,在平台上查看您的btsnoop文件&你将得到服务器上的mtu大小。

答案 2 :(得分:2)

根据蓝牙核心规范文档,在3.F 3.2.8中:

  

同时充当服务器和客户端的设备应使用   客户端Rx MTU和服务器Rx MTU的值相同。

因此,使用通过GATT客户端API获得的MTU,它必须是相同的。

答案 3 :(得分:1)

BluetoothGattServerCallback具有方法onMtuChanged,您可以重写此方法,并在协商后直接获得MTY(在中央要求下):

@Override
public void onMtuChanged(BluetoothDevice device, int mtu) {
   super.onMtuChanged(device, mtu);
   this.mtu = mtu;
   Log.i(TAG, "New MTU is " + mtu);
}

答案 4 :(得分:0)

BluetoothGattServerCallback 现在正确的签名是 onMtuChanged(BluetoothDevice device, int mtu)

对于 C#,我使用了这个签名:

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