我正在使用Bluez通过DBUS在Python中实现自定义蓝牙配对代理。代理需要返回多个固定PIN码中的一个(传统PIN,而不是简单的配对模式请求),具体取决于尝试配对的设备类型。这些设备是支持蓝牙的医疗监护仪(血压,血压等),我无法控制。
最初,我正在查看设备的第一位Mac地址,并根据制造商前缀返回PIN。这很好用。但我现在尝试添加支持的设备使用相同的前缀(我假设它具有相同的BT芯片)但是作为我需要支持的其他设备之一的不同PIN。设备唯一独特的是它们的名称总是不变的(例如“AND 1234”或“IEM 5678”)所以我试图通过代理更改以查看名称的第一位而不是
knownPins = {
"aandd": "12345",
"iem ": "5678",
"default": "98689"
}
@dbus.service.method("org.bluez.Agent", in_signature="o", out_signature="s")
def RequestPinCode(self, device):
pprint("RequestPinCode ({})", device)
dbdevice = dbus.Interface(bus.get_object("org.bluez", device),
"org.bluez.Device")
bits = device.split('/')
mac = bits[-1].replace("dev_","").replace("_",":").lower()
props = dbdevice.GetProperties()
if not props["Name"]:
raise Rejected()
try:
for name, pin in knownPins.items():
if props["Name"].startswith(name):
return pin
return knownPins["default"]
except:
raise Rejected()
但是,在大多数情况下props["Name"]
只是空的 - 我认为这是因为配对请求是由远程方发起的,因为我没有做过发现,所以我不知道它的名字。
所以我的问题是,如何在此过程中强制进行查询,以便获取设备名称?我试过了
adapter.CreateDevice(mac)
给出了org.bluez.Error.AlreadyExists
我试过了
adapter.RemoveDevice(device)
adapter.CreateDevice(mac)
给出了org.bluez.Error.DoesNotExist: Device creation in progress
我认为在这两种情况下都是因为Bluez正在尝试创建设备
由于