Python Bluez配置文件注册
我正试图在Bluez5上获得一个用Python工作的Bluetooth设备。目前我有以下几点:Python Bluez配置文件注册,python,bluez,Python,Bluez,我正试图在Bluez5上获得一个用Python工作的Bluetooth设备。目前我有以下几点: #set up a bluez profile to advertise device capabilities from a loaded service record def init_bluez_profile(self): print("Configuring Bluez Profile") #setup profile options service_re
#set up a bluez profile to advertise device capabilities from a loaded service record
def init_bluez_profile(self):
print("Configuring Bluez Profile")
#setup profile options
service_record=self.read_sdp_service_record()
opts = {
"ServiceRecord":service_record,
"Role":"server",
"RequireAuthentication":False,
"RequireAuthorization":False,
"Name":BTKbDevice.MY_DEV_NAME,
"AutoConnect":True
}
#retrieve a proxy for the bluez profile interface
bus = dbus.SystemBus()
self.manager = dbus.Interface(bus.get_object("org.bluez","/org/bluez"), "org.bluez.ProfileManager1")
self.profile = BTKbBluezProfile(bus, BTKbDevice.PROFILE_DBUS_PATH)
self.manager.RegisterProfile(BTKbDevice.PROFILE_DBUS_PATH, BTKbDevice.UUID, opts)
print("Profile registered ")
此代码正确执行,配置文件代码是bluez测试用例中的标准代码:
class BTKbBluezProfile(dbus.service.Object):
fd = -1
@dbus.service.method("org.bluez.Profile1",
in_signature="", out_signature="")
def Release(self):
print("Release")
mainloop.quit()
@dbus.service.method("org.bluez.Profile1",
in_signature="", out_signature="")
def Cancel(self):
print("Cancel")
@dbus.service.method("org.bluez.Profile1", in_signature="oha{sv}", out_signature="")
def NewConnection(self, path, fd, properties):
self.fd = fd.take()
print("NewConnection(%s, %d)" % (path, self.fd))
for key in properties.keys():
print ('key ' + key + ' value ' + properties[key])
if key == "Version" or key == "Features":
print(" %s = 0x%04x" % (key, properties[key]))
else:
print(" %s = %s" % (key, properties[key]))
@dbus.service.method("org.bluez.Profile1", in_signature="o", out_signature="")
def RequestDisconnection(self, path):
print("RequestDisconnection(%s)" % (path))
if (self.fd > 0):
os.close(self.fd)
self.fd = -1
def __init__(self, bus, path):
dbus.service.Object.__init__(self, bus, path)
但是,当我得到连接/断开连接时,什么都不起作用。我尝试过各种各样的选择,但我就是找不到任何东西来注册。文档很简单,而且在dbus通信中似乎没有什么调试信息。是否有人成功地注册了配置文件和/或获得了有关bluez交互的更多调试信息
谢谢。这是一个成功的HID键盘实现,记录在:
“”“
蓝牙HID键盘模拟器DBUS服务
原意取自:
http://yetanotherpointlesstechblog.blogspot.com/2016/04/emulating-bluetooth-keyboard-with.html
移动到Python 3并使用BlueZ 5.43进行测试
更新记录在:
https://gist.github.com/ukBaz/a47e71e7b87fbc851b27cde7d1c0fcf0
"""
导入操作系统
导入系统
导入DBU
导入dbus.service
导入套接字
从gi.repository导入GLib
从dbus.mainloop.glib导入DBusGMainLoop
类HumanInterfaceDeviceProfile(dbus.service.Object):
"""
用于HID的BlueZ D总线配置文件
"""
fd=-1
@dbus.service.method('org.bluez.Profile1',
输入/输出签名=“”,输出/输出签名=“”)
def释放(自):
打印(‘发布’)
mainloop.quit()
@dbus.service.method('org.bluez.Profile1',
in_签名='oha{sv}',out_签名='')
def新连接(自身、路径、fd、属性):
self.fd=fd.take()
print('NewConnection({},{}').format(path,self.fd))
对于键入属性。键():
如果键='Version'或键='Features':
打印({}=0x{:04x})。格式(键,
属性[键])
其他:
打印('{}={}'。格式(键,属性[key]))
@dbus.service.method('org.bluez.Profile1',
输入签名为“o”,输出签名为“o”)
def请求断开连接(自身、路径):
打印('RequestDisconnection{}'。格式(路径))
如果self.fd>0:
操作系统关闭(self.fd)
self.fd=-1
BTKB类设备:
"""
创建蓝牙设备以模拟HID键盘
"""
MY_DEV_NAME='BT_HID_键盘'
#服务端口-必须与SDP记录中配置的端口匹配
P_CTRL=17
#服务端口-必须与SDP记录中配置的端口#中断端口匹配
P_INTR=19
#BlueZ dbus
PROFILE_DBUS_PATH='/bluez/yaptb/btkb_PROFILE'
ADAPTER_IFACE='org.bluez.Adapter1'
设备接口='org.bluez.Device1'
DBUS_PROP_IFACE='org.freedesktop.DBUS.Properties'
DBUS_OM_IFACE='org.freedesktop.DBUS.ObjectManager'
#sdp记录到laod的文件路径
install_dir=os.path.dirname(os.path.realpath(_文件__))
SDP_RECORD_PATH=os.PATH.join(install_dir,
'sdp_record.xml')
#HID服务的UUID(1124)
# https://www.bluetooth.com/specifications/assigned-numbers/service-discovery
UUID='00001124-0000-1000-8000-00805f9b34fb'
定义初始化(自,hci=0):
self.scocontrol=None
self.ccontrol=None#控件的套接字对象
self.sinterrupt=无
self.cinterrupt=None#中断的套接字对象
self.dev_path='/org/bluez/hci{}'。格式(hci)
打印('设置BT设备')
self.bus=dbus.SystemBus()
self.adapter_methods=dbus.Interface(
self.bus.get_对象('org.bluez',
self.dev_路径),
自适配接头(如有)
self.adapter_property=dbus.Interface(
self.bus.get_对象('org.bluez',
self.dev_路径),
自我保护(DBUS_PROP_IFACE)
self.bus.add_信号_接收器(添加了self.interfaces_,
dbus_接口=self.dbus_OM_IFACE,
信号_name='InterfacesAdded')
self.bus.add\u信号\u接收器(self.\u属性\u更改,
dbus\u接口=self.dbus\u PROP\u IFACE,
信号\u name='PropertiesChanged',
arg0=self.DEVICE\u接口,
路径(关键字=“路径”)
打印('Configuring for name{}'。格式(BTKbDevice.MY_DEV_name))
self.config\u hid\u profile()
#设置蓝牙设备配置
self.alias=BTKbDevice.MY\u DEV\u NAME
self.discoverabletimeout=0
self.discoverable=True
添加的def接口(自):
通过
定义属性更改(自身、接口、更改、无效、路径):
如果self.on\u disconnect不是无:
如果更改中的“已连接”:
如果未更改[“已连接”]:
self.on_disconnect()
def on_断开(自):
打印('客户端已断开连接')
self.listen()
@财产
def地址(自我):
“”“返回适配器MAC地址。”“”
返回self.adapter\u属性.Get(self.adapter\u IFACE,
"地址")
@财产
def供电(自):
"""
适配器的电源状态。
"""
返回self.adapter\u属性.Get(self.adapter\u IFACE,'Powered')
@电动塞特
def通电(自身、新_状态):
self.adapter\u property.Set(self.adapter\u IFACE,'Powered',new\u state)
@财产
def别名(自身):
返回self.adapter\u属性.Get(self.adapter\u IFACE,
“别名”)
@别名.setter
def别名(自身,新的_别名):
self.adapter\u property.Set(self.adapter\u IFACE,
“别名”,