仅使用 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 连接设备
使用Rest连接MindSphere IoT Extention