如何通过命令行向 BLE 设备发送蓝牙数据包/写入请求?

如何通过命令行向 BLE 设备发送蓝牙数据包/写入请求?

我有一个 BLE 灯,我想以编程方式控制它。通过嗅探我的手机(有一个控制灯的应用程序)和灯之间的蓝牙数据包,我发现了以下信息:

  • 设备MAC地址:XX:XX:XX:XX:XX:XX
  • 控制灯状态的句柄:0x0009
  • 开灯的值:c7e3f68520e8d5ae5acd17760a01459d

在研究这个问题时,我偶然发现了(已弃用的)实用程序gatttool。根据他们的文档,我可以像这样写入 BLE 设备:

sudo gatttool --char-write-req -b XX:XX:XX:XX:XX:XX -a 0x0009 -n c7e3f68520e8d5ae5acd17760a01459d

这在一定程度上是有效的。当我使用手机连接到灯并执行上述命令时,我收到以下响应:

connect error: Connection refused (111)

这是预期的,因为我已经用手机连接到设备。当我断开手机连接时,我收到以下响应:

connect error: Device or resource busy (16)

不幸的是,这不是我希望看到的。我在网上看到这个问题可能是由于gatttool被弃用而发生的。

总而言之,我正在寻找的是:

  • 关于如何gatttool在这种情况下发挥作用的一些信息/想法。
  • 一种不同的方法(即没有gatttool)。我查看了bluetoothctl,但似乎也无法连接该设备。

任何意见将不胜感激。

答案1

connect error: Device or resource busy (16)

意味着您的接口正忙,您的笔记本电脑是否已连接到设备或者是否有其他工具正在使用该设备?例如,您不能同时扫描bluetoothctl和使用。gatttool除非你有两个不同的接口。

使用以下命令确保您的蓝牙正常工作,其中 hci0 是您正在使用的 hci 接口。

$ hciconfig hci0 down && hciconfig hci0 up
$ service bluetooth restart

要检查您的接口,-a 是可选的,但会提供额外的信息。

$ hciconfig -a

读取值时自动将十六进制转换为 ascii:

$ gatttool -b [MAC] --char-read -a [characteristic] | awk -F':' '{print $2}' | tr -d ' ' | xxd -r -p; printf '\n'

根据我的经验,gatttool 非常有用,可以尝试其他工具:bettercapubertooth one

相关内容