[英]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.