如何让 BLE 连接的外设请求 PHY 更新到 2M PHY?

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

连接间隔等参数可以通过更改conn_min_interval等文件来更改。 该文件中的值然后用于协商中央和外围设备之间的连接间隔。

是否有将首选 LE PHY 更改为 2M PHYCoded PHY 的等效文件?

由此我想象外设会触发一个PHY更新请求.

我找到了大量关于 2M PHY 和 Coded PHY 是什么的文档,但没有关于如何实际启用它们的文档。

(我将 BlueZ 与同时支持 2M PHY 和 Coded PHY 的设备一起使用)

bluetooth-lowenergy bluez
1个回答
0
投票

我在将 Linux BLUEZ 与 nrf5340 SoC 连接时遇到了类似的问题。 经过一些研究,我找到了一种使用 hcitool 设置 PHY 的方法。

使用 BLUEZ 作为中心,在建立连接后,可以动态更改 PHY。

您可以使用“hcitool”通过发出原始 HCI 命令来修改连接参数和 PHY。可以通过分析 zephyr 操作系统的 “include/zephyr/bluetooth/hci.h” 文件等源文件来推断命令语法。 HCI 命令 0x08 0x0032 是一个 BLE 命令,用于更改活动连接中的首选 PHY。

这是文件“hci.h”中定义的命令声明及其结构:

#define BT_HCI_OP_LE_SET_PHY                    BT_OP(BT_OGF_LE, 0x0032)
struct bt_hci_cp_le_set_phy {
    uint16_t  handle;
    uint8_t   all_phys;
    uint8_t   tx_phys;
    uint8_t   rx_phys;
    uint16_t  phy_opts;
} __packed;

例如,您可以使用 bluetoothctl 连接 LE 外围设备:

$ bluetoothctl
# connect 00:11:22:33:44:55

连接建立后,可以通过命令获取连接句柄:

$ hcitool con

这是一个例子:

$ hcitool con
Connections:
    < LE F7:61:E5:21:DA:69 handle 16 state 1 lm MASTER 

在本例中,句柄的值为 16。 考虑到上述结构,我们可以通过使用 Little Endian 顺序发送表示结构中每个元素中的值的字节序列来准备原始命令:

$ sudo hcitool cmd 0x08 0x0032  0x10 0x00  0x00  0x02 0x02  0x00 0x00

前两个数字是命令BT_HCI_OP_LE_SET_PHY。 在命令之后,应该提供一个字节序列,代表结构的字段bt_hci_cp_le_set_phy

0x10 0x00 是 16 位句柄,其值为 16,由“hcitool con”命令报告。

0x00 是字段“all_phys”,位 0 和 1 可以屏蔽 TX 和 RX PHY。我们要同时设置两者,因此 0 表示指示两个值。

0x02 0x02 是 TX 和 RX 首选 PHY,在这种情况下 2 表示 LE-2M。

这是hci.h里面的声明:

#define BT_HCI_LE_PHY_PREFER_1M                 BIT(0)
#define BT_HCI_LE_PHY_PREFER_2M                 BIT(1)
#define BT_HCI_LE_PHY_PREFER_CODED              BIT(2)

最后两个字节0x00 0x00是phy_opts字段,只有当PHY设置为CODED时才会考虑它的值。

这是发出命令后 btmon 程序的输出(发出命令前 btmon 已在另一个控制台中打开):

$ sudo btmon -T
@ RAW Open: hcitool (privileged) version 2.22                                                             {0x0002} [hci0] 2023-03-04 12:42:40.943654
< HCI Command: LE Set PHY (0x08|0x0032) plen 7                                                               #4273 [hci0] 2023-03-04 12:42:40.943727
        Handle: 16
        All PHYs preference: 0x00
        TX PHYs preference: 0x02
          LE 2M
        RX PHYs preference: 0x02
          LE 2M
        PHY options preference: Reserved (0x0000)
> HCI Event: Command Status (0x0f) plen 4                                                                    #4274 [hci0] 2023-03-04 12:42:40.945362
      LE Set PHY (0x08|0x0032) ncmd 2
        Status: Success (0x00)

希望这对您和任何遇到类似问题的人有所帮助。

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