Не удается отменить регистрацию рекламы () с помощью Beacon advertisement

#python #bluetooth #bluez #beacon

#python #bluetooth #синий цвет #beacon

Вопрос:

Я использую BlueZ и Python для реализации сервиса Bluetooth. У нас есть требование иметь возможность включать и отключать службу и Маяк. Идея в том, что мы прослушиваем некоторые сообщения MQTT. Если сообщение предназначено для включения или отключения службы / Маяка, мы вызовем функцию, чтобы включить или отключить его. Вот код рекламы:

 class BluetoothAdvert(Advertisement):
def __init__(self, bus, index, name, MacAddress):
    Advertisement.__init__(self, bus, index, '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)
  

Вот код включения / выключения службы Bluetooth и рекламы маяка:

 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(), 
        {},
        reply_handler=reg_callback, 
        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(), 
        {},
        reply_handler=reg_callback, 
        error_handler=reg_error_callback)

    bluetooth_advert = BluetoothAdvert(bus, 0)
    beacon_advert = BluetoothAdvert(bus, 1)
    advert_manager.RegisterAdvertisement(
        bluetooth_advert.get_path(), 
        {},
        reply_handler=reg_advert_callback, 
        error_handler=reg_advert_error_callback)
    advert_manager.RegisterAdvertisement(
        beacon_advert.get_path(), 
        {},
        reply_handler=reg_advert_callback, 
        error_handler=reg_advert_error_callback)

    '''
    Other code ...
    '''
  

Для тестирования, кажется, мы можем вызывать enableBluetoothService() и disableBluetoothService() много раз. Служба Bluetooth будет включена или отключена. Есть ли какие-либо проблемы при многократном вызове enableBluetoothService() и disableBluetoothService()?

Вызывая UnregisterAdvertisement() с некоторыми данными, кажется, все в порядке. Но мы не можем вызвать disableBeacon(), тогда вызовите enableBeacon(). В противном случае мы получим сообщение «Не удалось зарегистрировать рекламу: org.bluez.Ошибка.Уже существует: Уже существует». Почему мы не можем вызвать UnregisterAdvertisement() с рекламой Beacon?

Комментарии:

1.В примере рекламы BlueZ они также делают dbus.service.Object.remove_from_connection git.kernel.org/pub/scm/bluetooth/bluez.git/tree/test/… Вы пробовали это в своем коде?

2. Спасибо, укБаз! Оказалось, что это была моя ошибка. Я исправил это в нашем коде. Теперь функция UnregisterAdvertisement() работает. Я могу отменить регистрацию рекламы и зарегистрировать ее снова. При вызове remove_from_connection() отмена регистрации не работает.