MicroPython:Библиотеки/ubluetooth/Класс BLE/BLE.irq()

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


BLE.irq()[1]

  • BLE.irq(handler) – регистрирует функцию обратного вызова для событий из BLE-стека. Функция обратного вызова handler принимает два аргумента: event (здесь может быть один из кодов ниже) и data (это специфичный для события кортеж данных).
Примечание

Элементы addr, adv_data, char_data, notify_data и uuid в кортеже – это указатели на данные, управляемые модулем ubluetooth (т.е. один и тот же экземпляр будет повторно использоваться при всех вызовах обработчика событий). Если ваша программа хочет воспользоваться этими данными вне обработчика, то должна сначала скопировать их – например, при помощи bytes(addr) или bluetooth.UUID(uuid).

В обработчике событий хранятся варианты действий для всех возможных событий.

def bt_irq(event, data):
    if event == _IRQ_CENTRAL_CONNECT:
        # Центральный узел подключился
        # к этому периферийному устройству.
        conn_handle, addr_type, addr = data
    elif event == _IRQ_CENTRAL_DISCONNECT:
        # Центральный узел отключился
        # от этого периферийного устройства.
        conn_handle, addr_type, addr = data
    elif event == _IRQ_GATTS_WRITE:
        # Клиент выполнил запись
        # в эту характеристику или дескриптор.
        conn_handle, attr_handle = data
    elif event == _IRQ_GATTS_READ_REQUEST:
        # Клиент выполнил операцию чтения.
        # Примечание: это аппаратное прерывание. 
        # Верните «None», чтобы отклонить операцию чтения.
        # Примечание: это событие не поддерживается на ESP32.
        conn_handle, attr_handle = data
    elif event == _IRQ_SCAN_RESULT:
        # Один результат сканирования.
        addr_type, addr, adv_type, rssi, adv_data = data
    elif event == _IRQ_SCAN_DONE:
        # Сканирование закончилось
        # или было установлено вручную.
        pass
    elif event == _IRQ_PERIPHERAL_CONNECT:
        # Успешный вызов gap_connect().
        conn_handle, addr_type, addr = data
    elif event == _IRQ_PERIPHERAL_DISCONNECT:
        # Подключенное периферийное устройство было отключено.
        conn_handle, addr_type, addr = data
    elif event == _IRQ_GATTC_SERVICE_RESULT:
        # Вызывается каждый раз, 
        # когда gattc_discover_services() находит новый сервис. 
        conn_handle, start_handle, end_handle, uuid = data
    elif event == _IRQ_GATTC_SERVICE_DONE:
        # Вызывается каждый раз при обнаружении сервиса.
        # Примечание: при успешном вызове статус будет «0»,
        # в противном случае будет значение,
        # зависящее от используемой реализации.
        conn_handle, status = data
    elif event == _IRQ_GATTC_CHARACTERISTIC_RESULT:
        # Вызывается каждый раз, когда gattc_discover_services()   
        # находит новую характеристику.
        conn_handle, def_handle, value_handle, properties, uuid = data
    elif event == _IRQ_GATTC_CHARACTERISTIC_DONE:
        # Вызывается каждый раз при обнаружении сервиса.
        # Примечание: при успешном вызове статус будет «0»,
        # в противном случае будет значение, 
        # зависящее от используемой реализации. 
        conn_handle, status = data
    elif event == _IRQ_GATTC_DESCRIPTOR_RESULT:
        # Вызывается каждый раз, 
               # когда gattc_discover_descriptors()
        # находит новый дескриптор.
        conn_handle, dsc_handle, uuid = data
    elif event == _IRQ_GATTC_DESCRIPTOR_DONE:
        # Вызывается каждый раз при обнаружении сервиса.
        # Примечание: при успешном вызове статус будет «0»,
        # в противном случае будет значение,
        # зависящее от используемой реализации. 
        conn_handle, status = data
    elif event == _IRQ_GATTC_READ_RESULT:
        # Была выполнена функция gattc_read().
        conn_handle, value_handle, char_data = data
    elif event == _IRQ_GATTC_READ_DONE:
        # Была выполнена функция gattc_read().
        # Примечание: в btstack «value_handle» будет «0»,
        # но в NimBLE оно будет присутствовать.
        # Примечание: при успешном вызове статус будет «0»,
        # в противном случае будет значение,
        # зависящее от используемой реализации. 
        conn_handle, value_handle, status = data
    elif event == _IRQ_GATTC_WRITE_DONE:
        # Была выполнена функция gattc_write().
        # Примечание: в btstack «value_handle» будет «0»,
        # но в NimBLE оно будет присутствовать.
        # Примечание: при успешном вызове статус будет «0»,
        # в противном случае будет значение,
        # зависящее от используемой реализации. 
        conn_handle, value_handle, status = data
    elif event == _IRQ_GATTC_NOTIFY:
        # Сервер отправил запрос на уведомление.
        conn_handle, value_handle, notify_data = data
    elif event == _IRQ_GATTC_INDICATE:
        # Сервер отправил запрос на индикацию.
        conn_handle, value_handle, notify_data = data
    elif event == _IRQ_GATTS_INDICATE_DONE:
        # Клиент подтвердил индикацию.
        # Примечание: при успешном подтверждении
        # статус будет «0», 
        # в противном случае будет значение,
        # зависящее от используемой реализации. 
        conn_handle, value_handle, status = data

А вот коды этих событий:

from micropython import const
_IRQ_CENTRAL_CONNECT = const(1)
_IRQ_CENTRAL_DISCONNECT = const(2)
_IRQ_GATTS_WRITE = const(3)
_IRQ_GATTS_READ_REQUEST = const(4)
_IRQ_SCAN_RESULT = const(5)
_IRQ_SCAN_DONE = const(6)
_IRQ_PERIPHERAL_CONNECT = const(7)
_IRQ_PERIPHERAL_DISCONNECT = const(8)
_IRQ_GATTC_SERVICE_RESULT = const(9)
_IRQ_GATTC_SERVICE_DONE = const(10)
_IRQ_GATTC_CHARACTERISTIC_RESULT = const(11)
_IRQ_GATTC_CHARACTERISTIC_DONE = const(12)
_IRQ_GATTC_DESCRIPTOR_RESULT = const(13)
_IRQ_GATTC_DESCRIPTOR_DONE = const(14)
_IRQ_GATTC_READ_RESULT = const(15)
_IRQ_GATTC_READ_DONE = const(16)
_IRQ_GATTC_WRITE_DONE = const(17)
_IRQ_GATTC_NOTIFY = const(18)
_IRQ_GATTC_INDICATE = const(19)
_IRQ_GATTS_INDICATE_DONE = const(20)


В целях сделать прошивку максимально компактной эти константы не включены в модуль ubluetooth. Поэтому если вам нужны какие-то константы из списка выше, просто добавьте их в свою программу.


<syntaxhighlight lang="python">

См.также

Внешние ссылки