问题描述
我正在使用BlueZ和Python来实现蓝牙服务。我们要求能够启用和禁用服务和信标。这个想法是,我们听一些MQTT消息。如果消息是启用或禁用服务/信标,我们将调用该函数以启用或禁用它。 这是广告的代码:
class BluetoothAdvert(Advertisement):
def __init__(self,bus,index,name,MacAddress):
Advertisement.__init__(self,'peripheral')
if 0 == index:
self.add_service_uuid('1234')
self.add_manufacturer_data(0x1234,'123456789012')
elif 1 == index:
frame_type = [0x00]
power = [0x00]
id = [0x25,0x33,0x96,0x2B,0x17,0xCD,0xA2,0x53,0x77,0x98,0x22,0x2A,0x89,0x12,0x36,0xF5]
beacon_data = frame_type + power + id
self.add_service_uuid('FEAA')
self.add_service_data('FEAA',beacon_data)
以下是启用/禁用蓝牙服务和信标广告的代码:
def enableBluetoothService():
service_manager.Registerapplication(
bluetooth_service.get_path(),{},reply_handler=reg_callback,error_handler=reg_error_callback)
advert_manager.Registeradvertisement(
bluetooth_advert.get_path(),error_handler=reg_error_callback)
def disableBluetoothService():
service_manager.Unregisterapplication(
bluetooth_service.get_path(),reply_handler=unreg_callback_func,error_handler=unreg_error_callback)
advert_manager.Unregisteradvertisement(bluetooth_advert)
def enableBeacon():
advert_manager.Registeradvertisement(
beacon_advert.get_path(),reply_handler=reg_advert_callback,error_handler=reg_advert_error_callback)
def disableBeacon():
advert_manager.Unregisteradvertisement(beacon_advert)
这是主要功能:
def main():
'''
Other code ...
'''
service_manager.Registerapplication(
bluetooth_service.get_path(),error_handler=reg_error_callback)
bluetooth_advert = BluetoothAdvert(bus,0)
beacon_advert = BluetoothAdvert(bus,1)
advert_manager.Registeradvertisement(
bluetooth_advert.get_path(),error_handler=reg_advert_error_callback)
advert_manager.Registeradvertisement(
beacon_advert.get_path(),error_handler=reg_advert_error_callback)
'''
Other code ...
'''
对于测试,似乎我们可以多次调用enableBluetoothService()和disableBluetoothService()。蓝牙服务将被启用或禁用。通过多次调用enableBluetoothService()和disableBluetoothService()是否有任何问题?
通过调用一些数据的Unregisteradvertisement()似乎可以。但是我们不能先调用disableBeacon()然后再调用enableBeacon()。否则,我们将收到“无法注册广告:org.bluez.Error.AlreadyExists:已经存在”。为什么我们不能将Beacon广告称为Unregisteradvertisement()?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)