仅使用 hcitool 连接 LE 设备的步骤

Posted

技术标签:

【中文标题】仅使用 hcitool 连接 LE 设备的步骤【英文标题】:Steps to connect LE device using hcitool only 【发布时间】:2020-07-15 05:17:12 【问题描述】:

我对 hcitool 感到困惑,因为“lescan”工作正常,但“lecc”让我“超时”。 如果有人对“如何使用 hcitool 连接设备”有正确的步骤,请帮助我。

我不想使用 gatttool 或 bluetoothctl 工具。

我的目标是连接参考hcitool代码并编写我自己的代码来连接ble传感器。

如果有人使用“hci_le_create_conn”连接到 ble 设备的代码可以正常工作。请在这里解释一下。

是否需要任何身份验证?如果是请给我hci相关的api。

日志:

command :
hcitool lecc --random 52:B8:47:55:C5:9A  
 output:
Could not create connection: Connection timed out

sudo btmon output :
@ RAW Open: hcitool (privileged) version 2.22                                                                              0x0003 [hci0] 183.156045
< HCI Command: LE Create Connection (0x08|0x000d) plen 25                                                                      #202 [hci0] 183.156918
        Scan interval: 2.500 msec (0x0004)
        Scan window: 2.500 msec (0x0004)
        Filter policy: White list is not used (0x00)
        Peer address type: Random (0x01)
        Peer address: 52:B8:47:55:C5:9A (Resolvable)
        Own address type: Public (0x00)
        Min connection interval: 18.75 msec (0x000f)
        Max connection interval: 18.75 msec (0x000f)
        Connection latency: 0 (0x0000)
        Supervision timeout: 32000 msec (0x0c80)
        Min connection length: 0.625 msec (0x0001)
        Max connection length: 0.625 msec (0x0001)
> HCI Event: Command Status (0x0f) plen 4                                                                                      #203 [hci0] 183.158026
      LE Create Connection (0x08|0x000d) ncmd 1
        Status: Success (0x00)
@ RAW Open: hciconfig (privileged) version 2.22     

【问题讨论】:

你能在另一个终端中运行“sudo btmon”并在此处发布该终端的输出吗?这只是为了弄清楚为什么“hcitool lecc”会失败。 我更新了日志请查收。 这是完整的日志吗?它似乎缺少一些数据,因为您上面提到的“超时”没有日志。如果这确实是完整的日志,您可以再次尝试该命令吗?也可以在此之前尝试“hciconfig hci0 reset”,以防硬件出现问题。 【参考方案1】:

hcitool 是 BlueZ 维护人员 marked as deprecated 的八个工具之一。最接近的替换可能是btmgmt

一般指导是,当 HCI 绕过系统上运行的蓝牙守护程序时,可以使用更好的 API 与 BlueZ 交互。

当您正在编写此代码时,推荐的 API 是管理接口:

https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/mgmt-api.txt

或 D-Bus API:

https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/adapter-api.txt

https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/device-api.txt

您没有说要使用哪种语言编写代码,但大多数语言都有可以提供帮助的 DBus 库。这是一个用 Python 做的例子:

import pydbus

# Setup of device specific values
dev_id = 'DE:82:35:E7:CE:BE'

# DBus object paths
bluez_service = 'org.bluez'
adapter_path = '/org/bluez/hci0'
device_path = f"adapter_path/dev_dev_id.replace(':', '_')"
bus = pydbus.SystemBus()
adapter = bus.get(bluez_service, adapter_path) 
device = bus.get(bluez_service, device_path)

# Assume device has been paired already so can use connect
device.Connect()

【讨论】:

我想要 hci le connect api 的 c 代码。并替换 hci_le_create_conn API。这是使用 hci 总线。 也可以在扫描btmgmt后编写连接步骤。 在看:git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/… 会不会像add-device -a 2 -t 2 DE:82:35:E7:CE:BE 好的,谢谢。

以上是关于仅使用 hcitool 连接 LE 设备的步骤的主要内容,如果未能解决你的问题,请参考以下文章

无法在嵌入式 linux 中使用 bluetoothctl 连接设备

蓝牙蓝牙,调试 hcitool与gatttool实例

使用 hcitool 扫描蓝牙低功耗?

使用Rest连接MindSphere IoT Extention

使用 CoreBluetooth 通过 iOS 设备连接到 Windows 10

可以在没有 USB(使用 wifi)的情况下连接多个 android 设备吗?