连接间隔等参数可以通过更改conn_min_interval等文件来更改。 该文件中的值然后用于协商中央和外围设备之间的连接间隔。
是否有将首选 LE PHY 更改为 2M PHY 或 Coded PHY 的等效文件?
由此我想象外设会触发一个PHY更新请求.
我找到了大量关于 2M PHY 和 Coded PHY 是什么的文档,但没有关于如何实际启用它们的文档。
(我将 BlueZ 与同时支持 2M PHY 和 Coded PHY 的设备一起使用)
我在将 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)
希望这对您和任何遇到类似问题的人有所帮助。