我正在开发一个嵌入式 Linux 设备作为 BLE 外设来与 Android 应用程序通信。
我从github项目python-gatt-server开始。
现在出现了一些吞吐量瓶颈,我怀疑这与 MTU 设置有关。
hciconfig
的输出如下:
root@linux:~# hciconfig
hci0: Type: Primary Bus: UART
BD Address: C0:EE:40:3B:31:A0 ACL MTU: 1021:8 SCO MTU: 64:1
UP RUNNING PSCAN ISCAN
RX bytes:1392 acl:0 sco:0 events:78 errors:0
TX bytes:1752 acl:0 sco:0 commands:78 errors:0
ACL MTU: 1021:8
和 SCO MTU: 64:1
,它们分别代表什么意思?hciconfig
或bluetoothctl
等命令行工具设置MTU?--- 仅针对 GATT 回答 ---
hciconfig
cmd 中的两个选项不适用于 gatt mtu。gatt mtu 可以设置(通过编程 api 或 cli)
//cli
//only set in cmdline args
tools/btgatt-server --mtu 123 ..
tools/btgatt-client --mtu 123
//btgatt-server 可以被动地看到 mtu 变化
[GATT server]# att: > 02 7b 00
[GATT server]# att: ATT PDU received: 0x02
server: MTU exchange complete, with MTU: 123
[GATT server]# att: ATT op 0x03
[GATT server]# att: < 03 05 02
//gatttool(只设置结果,没有接口,只做查询)
//in cmdline arg
tools/gatttool --mtu 123 ..
//in runtime
tools/gatttool --interactive
[XX:XX:XX:XX:XX:XX][LE]> mtu 123
MTU was exchanged successfully: 123
[XX:XX:XX:XX:XX:XX][LE]> mtu 122
Command Failed: MTU exchange can only occur once per connection.
//in other app, it can be set many times.
//mtu <value> Exchange MTU for GATT/ATT
他们都还没有提供仅查询接口(bluez-5.53),
您可以更改代码实现之一。
//API
int mtu = 123;
server->gatt = bt_gatt_server_new(server->db, server->att, mtu, 0);
mtu = bt_att_get_mtu(server->att);
printf("--- get mtu: %d\n", mtu); // got 672 // wrong from L2CAP (on my test device
bt_att_set_mtu(server->att, 23); // conservative size
或通过沟通
exchange mtu
注意: 在 bluez 中,来自链路层 (L2CAP) 的 MTU 可能会覆盖来自 gatt api 的 MTU。 对于 BR/EDR 链路设备,交换 MTU 被禁用。
所以,如果L2CAP的mtu错误,通信可能会异常。
如果mtu为23,gatt可能会将大数据包分割成许多小数据包来传输。
// 应该仍然有效。
您可以使用 gatttool 更改 MTU 值。您需要使用 gatttool -I 命令。然后连接您的设备。您可以使用帮助命令。 MTU 1234 可以工作