#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() отмена регистрации не работает.