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

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

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

ИЗМЕНИТЬ:

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


person Luis Saavedra    schedule 10.08.2018    source источник
comment
Не могли бы вы показать свой код, который не работает? Все библиотеки, которые я видел, основаны на устройстве/соединении (один объект на устройство/соединение), поэтому не имеет значения, есть ли у вас 1 или 10 устройств.   -  person Emil    schedule 10.08.2018
comment
Сначала я пытаюсь сделать это с помощью команд bluetoothctl, поэтому использую сканирование и подключение «MAC-адрес», затем выбираю службу и прослушиваю уведомления. Это не позволяет двум устройствам отправлять данные с использованием одной и той же службы, поэтому я подумал, что, возможно, есть какой-то API, который позволяет это сделать, при условии, что аппаратное обеспечение может с этим справиться.   -  person Luis Saavedra    schedule 10.08.2018
comment
bluetoothctl — это интерактивный инструмент отладки, а не API и не библиотека. Пока вы пишете программу с реальным API, вы получаете желаемую функциональность.   -  person Emil    schedule 10.08.2018
comment
Спасибо, я пробовал разные, чтобы увидеть, что работает лучше.   -  person Luis Saavedra    schedule 10.08.2018


Ответы (1)


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-attributes» после установления соединения и входа в Подменю общих атрибутов через menu gatt в bluetoothctl, что должно вывести то же самое список как указано выше:

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

Чтобы прочитать атрибут, вы сначала выбираете его с помощью команды «выбрать-атрибут», как вы уже догадались:

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

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

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

notify on

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

person Alex    schedule 12.02.2019
comment
Это был мой первый вопрос о stackoverflow. После публикации этого вопроса я нашел эту библиотеку и другие подобные, но с тех пор я оставил этот проект в стороне. Спасибо за ответ (хоть и с опозданием). - person Luis Saavedra; 21.02.2019
comment
спасибо за голос! вернись в мир Bluetooth! :) - person Alex; 28.02.2019