Bluetoothctl или gatttool для уведомлений BLE с нескольких устройств

Я прочитал много вопросов по этой теме, но не нашел информации о том, как лучше (или, если возможно, даже) получать уведомления от более чем одного устройства на одном, используя любую библиотеку или API (предпочтительно командную строку или библиотеку Python).

После подключения к разным устройствам, например, к монитору сердечного ритма и телефону, или к двум мониторам ЧСС, можно ли одновременно получать данные от 1 услуги с каждого устройства?

РЕДАКТИРОВАТЬ:

Мне удалось подключить разные устройства с одинаковыми характеристиками и получить от них уведомления с помощью Bluetoothctl (часть Bluez), если я не запрашиваю один и тот же сервис, который частично отвечает на мой вопрос; Тем не менее, кто-нибудь знает лучший способ сделать это?

0 ответов

1) Прежде всего, есть проект на github python, который делает это в Linux на Raspberry Pi: https://github.com/IanHarvey/bluepy

2) Во-вторых, этот фрагмент кода от Энтони Чиу использует этот API для связи с несколькими устройствами с помощью уведомлений:

  from bluepy.btle import Scanner, DefaultDelegate, Peripheral
    import threading

    class NotificationDelegate(DefaultDelegate):

    def __init__(self, number):
        DefaultDelegate.__init__(self)
        self.number = number

    def handleNotification(self, cHandle, data):
        print 'Notification:\nConnection:'+str(self.number)+ \nHandler:'+str(cHandle)+'\nMsg:'+data

    bt_addrs = ['00:15:83:00:45:98', '00:15:83:00:86:72']
    connections = []
    connection_threads = []
    scanner = Scanner(0)

    class ConnectionHandlerThread (threading.Thread):
        def __init__(self, connection_index):
            threading.Thread.__init__(self)
            self.connection_index = connection_index

        def run(self):
            connection = connections[self.connection_index]
            connection.setDelegate(NotificationDelegate(self.connection_index))
            while True:
                if connection.waitForNotifications(1):
                    connection.writeCharacteristic(37, 'Thank you for the notification!')

    while True:
        print'Connected: '+str(len(connection_threads))
        print 'Scanning...'
        devices = scanner.scan(2)
        for d in devices:
            print(d.addr)
            if d.addr in bt_addrs:
                p = Peripheral(d)
                connections.append(p)
                t = ConnectionHandlerThread(len(connections)-1)
                t.start()
                connection_threads.append(t)

3) Я просто напишу вариант ручного соединения с bluetoothctl, который вы, вероятно, пробовали. Поскольку он не был указан здесь, я добавлю это тоже:

** Ручное соединение с bluetoothctl: ** Для получения списка характеристик вы можете использовать команду "list-attribute", которая должна напечатать тот же список, что и выше:

list-attributes 00:61:61:15:8D:60

Чтобы прочитать атрибут, вы сначала выбираете его с помощью команды -you guessed - "select-attribute":

select-attribute /org/bluez/hci0/dev_00_61_61_15_8D_60/service000a/char000b

После этого вы можете выполнить команду "чтение" без каких-либо параметров.

Чтобы прочитать признак непрерывно (если признак поддерживает это), используйте команду "уведомить":

notify on

PS: Это мой первый ответ на stackru:) Я также новичок в BLE, так что терпите меня. Интересует ваш проект, любые ссылки / контакты приветствуются:) Вы можете найти меня на alexandrudancu.com

Другие вопросы по тегам