使用Python dbus库结合DBus与Bluez实现蓝牙设备数据写入
使用Python Dbus库结合BlueZ向蓝牙设备写入数据的实现
一、基础的设备连接、断开代码
已实现的基础连接断开逻辑如下:
import dbus system_bus = dbus.SystemBus() device = system_bus.get_object('org.bluez','/org/bluez/hci0/dev_FF_FF_99_96_64_60') object = dbus.Interface(device, dbus_interface='org.bluez.Device1') object.Connect() object.Disconnect()
二、GATT特征WriteValue方法定义
通过DFeet工具查看到的GATT特征写入方法WriteValue的定义如下:
<method name="WriteValue"> <arg name="value" type="ay" direction="in"/> <arg name="options" type="a{sv}" direction="in"/> </method>
参数说明:
value:类型为ay,即字节数组,需要传入你要写入的二进制数据options:类型为a{sv},即键值对格式的可选参数,无特殊配置时传入空字典即可
三、完整的写入数据实现代码
以下是已验证可运行的、实现十六进制指令转换并写入蓝牙特征的完整代码:
import dbus import binascii system_bus = dbus.SystemBus() device = system_bus.get_object('org.bluez','/org/bluez/hci0/dev_FF_FF_99_96_64_60') object = dbus.Interface(device, dbus_interface='org.bluez.Device1') object.Connect() # 这里的路径需要替换为你自己设备对应GATT特征的DBus路径 device_2 = system_bus.get_object('org.bluez','/org/bluez/hci0/dev_FF_FF_99_96_64_60/service000c/char000d') object_2 = dbus.Interface(device_2, dbus_interface='org.bluez.GattCharacteristic1') # 把十六进制指令转为字节序列,引号内的内容替换为你实际要发送的指令 bytes = binascii.unhexlify("025a06000000") # 旧版本dbus库可能需要显式转为dbus.ByteArray,写法如下: # bytes = dbus.ByteArray(binascii.unhexlify("025a06000000")) object_2.WriteValue(bytes,{}) object.Disconnect()
注意事项
- 示例中的GATT服务和特征路径
service000c/char000d需要替换为你的目标蓝牙设备对应可写特征的实际路径,可通过DFeet或者bluetoothctl工具查询获取 - 运行代码需要root权限,否则无法访问系统DBus的BlueZ接口
- 执行写入前请确保设备已正常配对,不存在连接权限问题
内容的提问来源于stack exchange,提问作者TwentySix
相关产品推荐
相关产品推荐

