无法通过信标广告取消注册Advertisement

问题描述

我正在使用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 (将#修改为@)