BlueZ 远程设备存在

BlueZ remote device presence

使用BlueZ,其中

is the official Linux Bluetooth stack

我想知道以下两种方法中哪一种更适合检测附近是否存在设备。 更准确地说,我想定期扫描蓝牙设备(不是 BLE => 没有发送广告包)。

我找到了两种检测方法:

1.) 使用 l2ping

# l2ping BTMAC

2.) 使用 hcitool

# hcitool name BTMAC

两种方法都有效。

我想知道,哪种方法会消耗更多被扫描设备的电量?

查看解决方案 #1 (l2ping's source):

它使用标准套接字connect调用连接到远程设备,然后使用send命令向它发送数据:

send(sk, send_buf, L2CAP_CMD_HDR_SIZE + size, 0)

现在,L2CAP_CMD_HDR_SIZE 是 4,默认 size 是 44,所以一共发送了 48 个字节,并用 L2CAP_ECHO_REQ 接收回来。

对于 hcitool,我刚刚找到入口点:

int hci_read_remote_name(int dd, const bdaddr_t *bdaddr, int len, char *name, int to);

我的问题:

回答您的问题:-

对于远程设备,这些方法中哪种更好(耗电更少)?如果有任何区别。

l2ping BTMAC 是更合适的命令,纯粹是因为这是它的目的。 "hcitool name BTMAC" 用于获取远程设备的名称,而 "l2ping" 用于检测它的存在,这正是您想要实现的。功耗差异真的很小,但如果有的话l2ping应该更耗电。

我要减小 l2ping 的大小吗?最小值是多少?

如果更改 l2ping 大小需要修改源代码,那么我建议保持不变。保持不变,您将使用已被无数次使用的相同命令以及用于限定 BlueZ 堆栈的相同命令。这样出错的机会就会减少,并且任何更改都不会导致明显的性能或功率改进。

我的假设是否正确 hci_read_remote_name 也连接到远程设备并向它发送某种请求以取回其名称?

是的,你的假设是正确的。根据蓝牙规范 v5.2,第 4 卷,E 部分,第 7.1.19 节远程名称请求命令:

If no connection exists between the local device and the device corresponding to the BD_ADDR, a temporary Link Layer connection will be established to obtain the LMP features and name of the remote device.

希望对您有所帮助。