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