【问题标题】:BlueZ remote device presenceBlueZ 远程设备存在
【发布时间】:2020-05-04 17:20:22
【问题描述】:

使用BlueZ,其中

是官方的 Linux 蓝牙协议栈

我想知道以下两种方法中哪一种更适合检测附近是否存在设备。 更准确地说,我想定期扫描蓝牙设备(不是 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 的大小吗?最低限度是多少?
  • 我的假设是否正确,即hci_read_remote_name 也连接到远程设备并向其发送某种请求以取回其名称?

【问题讨论】:

    标签: bluetooth bluez


    【解决方案1】:

    回答你的问题:-

    哪些方法更适合远程设备(耗电更少)?如果有任何区别。

    l2ping BTMAC 是更合适的命令,纯粹因为这是它的本意。虽然“hcitool name BTMAC”用于获取远程设备的名称,但“l2ping”用于检测它的存在,这是您想要实现的。功耗的差异确实很小,但如果有的话,那么 l2ping 的功耗应该会更低。

    我应该减小 l2ping 的大小吗?最低限度是多少?

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

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

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

    如果本地设备和设备之间不存在连接 对应于 BD_ADDR,一个临时的链路层连接将 建立以获取远程的LMP特性和名称 设备。

    我希望这会有所帮助。

    【讨论】:

    • 很好的总结,谢谢。减小 l2ping 的大小不需要重新编译,有一个命令行选项:-s,但默认为 44。
    猜你喜欢
    • 2020-07-15
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多