Android BLE:了解GattServer端的MTU

Android BLE:了解GattServer端的MTU,android,bluetooth,bluetooth-lowenergy,Android,Bluetooth,Bluetooth Lowenergy,我已经在Android上实现了可扩展的通信。我正在与客户方协商MTU使用。这很好,因为客户机可以更改MTU。然而,我仍然没有办法知道服务器端的MTU,只有客户端。我实现了自己的碎片/分段机制,因为有时我会发送合理数量的数据。我想根据MTU大小对数据进行分段,以实现更快的通信。我目前在服务器端一次发送20个字节,虽然可以工作,但速度较慢。有办法在服务器上获取MTU吗?请求MTU调用将导致客户端和服务器之间的Gatt MTU交换。较小的MTU将是最终使用的MTU 如果您想知道服务器端的mtu大小,只

我已经在Android上实现了可扩展的通信。我正在与客户方协商MTU使用。这很好,因为客户机可以更改MTU。然而,我仍然没有办法知道服务器端的MTU,只有客户端。我实现了自己的碎片/分段机制,因为有时我会发送合理数量的数据。我想根据MTU大小对数据进行分段,以实现更快的通信。我目前在服务器端一次发送20个字节,虽然可以工作,但速度较慢。有办法在服务器上获取MTU吗?

请求MTU调用将导致客户端和服务器之间的Gatt MTU交换。较小的MTU将是最终使用的MTU 如果您想知道服务器端的mtu大小,只需给“requestMtu”调用一个足够大的参数,并在“onMtuChanged”中得到结果
或者,在平台上查看您的btsnoop文件&您将获得服务器上mtu的确切大小。

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

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


因此,使用通过GATT客户端API获得的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);
}
这使我能够对结果成功的连接请求MTU()

private final BluetoothGattCallback mGattCallback=new BluetoothGattCallback(){
@凌驾
连接状态更改的公共无效(蓝牙gatt gatt、int状态、int新闻状态){
if(newState==蓝牙状态_已连接){
关贸总协定请求MTU(512);
}
超级连接状态更改(关贸总协定、状态、新状态);
}
};

BluetoothGattServerCallback
已更改了方法
onmtu
,您可以在协商后覆盖并直接获得MTU(在中央请求后):


BluetoothGattServerCallback的正确签名现在已更改(BluetoothDevice,int mtu)

对于C#我使用了以下签名:

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

但是服务器端不存在onMtuChanged方法。如何获取MTU?我没有将该设备同时用作服务器和客户端。还有别的吗?Android实现了客户端和服务器,所以它们都在这里,即使你没有明确使用它们。即使您不使用客户端API中的任何其他机制,这也会给您所需的值。嗯,是的,但我只是在网络上宣传设备,而不是扫描。如果设备同时执行这两项操作,您的建议是有意义的,但我仍然不明白如何在不进行扫描的情况下在服务器上获取MTU。您忽略了一个事实,即属性协议是对称的,即使设备是外围设备,设备上始终有一台服务器。外围设备/中心设备的区别只是谁在协议的较低级别发起连接的问题。你从哪里读到的?我可以在安卓和iOS中启动一台设备作为外设。但无论如何,问题依然存在。如果设备没有扫描(哪些外围设备不应该扫描,因为它需要大量电池),我无法知道Android上的MTU。你的意思是我还是扫描一下好吗?太谢谢你了。但有一个疑问:MTU更改请求是否必须从服务器启动才能正常工作,或者双方是否必须从各自的角度执行MTU更改请求:一种握手,因为这就是我所做并为我工作的..?但是如果BluetoothGattServerCallBack位于服务器端,BluetoothGattCallBack位于客户端端…我如何调用方法device.connectGatt(MainActivity.this,false,mGattCallBack);从BluetoothGattServerCallBack,如果mGattCallBack必须在客户端?我的回调有不同的参数:onMtuChanged(BluetoothGatt gatt,int mtu,int status){super.onMtuChanged(mbluetothGatt,mtu,status);Log.i(“BLEService”,“New mtu是”+mtu);}
        public override void OnMtuChanged(BluetoothDevice gatt, int mtu)
        {
            System.Diagnostics.Debug.WriteLine("OnMtuChanged: mtu is {0}", mtu);
        }