如何在 Linux 中使用命令行工具(hciconfig/bluetoothctl)获取/设置蓝牙 MTU 值

问题描述 投票:0回答:2

我正在开发一个嵌入式 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
  1. 有 2 个 MTU 设置:
    ACL MTU: 1021:8
    SCO MTU: 64:1
    ,它们分别代表什么意思?
  2. 我听说不同的芯片组支持不同的 MTU 设置。如何找到这些值?
  3. 如何使用
    hciconfig
    bluetoothctl
    等命令行工具设置MTU?
linux bluetooth-gatt pybluez
2个回答
2
投票

--- 仅针对 GATT 回答 ---



hciconfig
cmd 中的两个选项不适用于 gatt mtu。
//意思不太确定,练习不行

一。 api 或 cli

gatt mtu 可以设置(通过编程 api 或 cli)

  • 服务器:btgatt-服务器,
  • 客户端:btgatt-客户端、gatttool
    //它们都作为演示实例,仅设置当前实例,而不是全局设置。

//cli

btgatt 服务器,btgatt 客户端

//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                                        

gatt工具

//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),
您可以更改代码实现之一。

c API

//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

    // 客户端发送 MTU 请求(使用客户端 MTU),服务器回复(使用服务器 MTU):然后他们使用其中的 MIN。
    // 默认为 23
    // 一些 ble 测试应用程序,可以在运行时根据需要更改 mtu。
  • 从链路层来说,L2CAP协商mtu。

注意: 在 bluez 中,来自链路层 (L2CAP) 的 MTU 可能会覆盖来自 gatt api 的 MTU。 对于 BR/EDR 链路设备,交换 MTU 被禁用。

所以,如果L2CAP的mtu错误,通信可能会异常。


三。典型值

  • 23 //分钟,默认
  • 517 //来自 bluz 的最大
  • 527 //来自某些 Android 设备的最大值

如果mtu为23,gatt可能会将大数据包分割成许多小数据包来传输。
// 应该仍然有效。


1
投票

您可以使用 gatttool 更改 MTU 值。您需要使用 gatttool -I 命令。然后连接您的设备。您可以使用帮助命令。 MTU 1234 可以工作

© www.soinside.com 2019 - 2024. All rights reserved.