使用 DBus 和 Bluez 将数据写入蓝牙设备

Posted

技术标签:

【中文标题】使用 DBus 和 Bluez 将数据写入蓝牙设备【英文标题】:Write data to Bluetooth device with DBus and Bluez 【发布时间】:2021-12-10 06:27:34 【问题描述】:

我需要使用 Python dbus 库通过 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()

这是来自 DFeet 应用程序的方法描述:

<method name="WriteValue">
    <arg name="value" type="ay" direction="in"/>
    <arg name="options" type="asv" direction="in"/>
</method>

更新:添加了写入转换字节的代码

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()

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 = dbus.ByteArray(binascii.unhexlify("025a06000000"))
bytes = binascii.unhexlify("025a06000000")

object_2.WriteValue(bytes,)

object.Disconnect()

【问题讨论】:

这是蓝牙 LE 设备还是蓝牙经典设备?假设它是 BLE,您需要找到要写入的 GattCharacteristic1 接口的 DBus 路径。更多信息可能对您有帮助:***.com/a/63751113/7721752 @ukBaz 是的,它是 BLE。我已经找到了路径和接口,我的核心问题是如何准备字节或字节数组(例如“025a06000000”)并发送它。 您可能想要更新您的问题,显示您如何进行写入以及如何转换为字节。对于您在此处给出的示例:binascii.unhexlify("025a06000000") = b'\x02\x5a\x06\x00\x00\x00' @ukBaz 感谢您的回答。添加了写入命令,但不确定是“bytearray”还是“unhexlify”的结果。我会尽快使用 BtleJuice 框架进行检查。 【参考方案1】:

经过 BtleJuice 框架的一些测试可以确认这足以发送字节:

bytes = binascii.unhexlify("025a06000000")
object_2.WriteValue(bytes,)

在这样描述的方法中:

<method name="WriteValue">
    <arg name="value" type="ay" direction="in"/>
    <arg name="options" type="asv" direction="in"/>
</method>

至少它在我的情况下有效。

【讨论】:

以上是关于使用 DBus 和 Bluez 将数据写入蓝牙设备的主要内容,如果未能解决你的问题,请参考以下文章

BlueZ 显示 DBUS 上的旧缓存数据

在 Bluez 中创建 dbus 接口

使用 QT/C++ 中的 DBUS 连接到新的 Bluez HDP 插件

(Bluez) 如何获取蓝牙耳机按键输入?

Android 到 Linux 蓝牙未找到所有 UUID

你如何通过 dbus 执行蓝牙发现?