Радио

radio Модуль позволяет устройствам работать вместе через беспроводную сеть.

Радиомодуль концептуально очень прост:

  • Широковещательные сообщения имеют определенную настраиваемую длину (до 251 байта).

  • Полученные сообщения считываются из очереди настраиваемого размера. Если очередь заполнена, новые сообщения игнорируются. Чтение сообщения удаляет его из очереди.

  • Сообщения передаются и принимаются по предварительно выбранному каналу (с номерами 0-83).

  • Трансляции имеют определенный уровень мощности — чем больше мощность, тем больше радиус действия.

  • Сообщения фильтруются по адресу и группе.

  • Скорость пропускной способности может быть одной из трех предустановленных настроек.

  • Отправка и получение байтов для работы с произвольными данными.

  • Используйте receive_full, чтобы получить полную информацию о входящем сообщении: данные, уровень принимаемого сигнала и отметку времени в микросекундах, когда сообщение было получено.

  • Для удобства детей можно легко отправлять и получать сообщения в виде строк.

  • Конфигурация по умолчанию разумна и совместима с другими платформами, предназначенными для BBC micro:bit..

Для доступа к этому модулю вам необходимо:

import radio

Мы предполагаем, что Вы сделали это для приведенных ниже примеров.

Константы

radio.RATE_250KBIT

Константа, используемая для обозначения пропускной способности 256 Кбит в секунду.

radio.RATE_1MBIT

Константа, используемая для обозначения пропускной способности 1 Мбит в секунду.

radio.RATE_2MBIT

Константа, используемая для обозначения пропускной способности 2 Мбит в секунду.

Функции

radio.on()

Включает радио. Это должно быть вызвано явно, так как радио потребляет энергию и занимает память, которая в противном случае может понадобиться.

radio.off()

Выключает радио, тем самым экономя энергию и память.

radio.config(**kwargs)

Конфигурирует различные настройки на основе ключевых слов, относящиеся к радио.

length (по умолчанию=32) определяет максимальную длину сообщения в байтах, переданное по радио. Он может иметь длину до 251 байта (254–3 байта).

queue (по умолчанию=3) указывает количество сообщений, которые могут хранится в очереди входящих сообщений. Если не осталось свободных мест в очереди для входящих сообщений, входящее сообщения отбрасываются.

channel (по умолчанию=7) может быть целым числом от 0 до 83 (включительно), которое определяет произвольный «канал» радио. Сообщения будут отправляться через этот канал, и только полученные сообщения через этот канал будут помещены в очередь входящих сообщений. Каждый шаг Ширина 1 МГц, частота 2400 МГц.

power (по умолчанию=6) — целочисленное значение от 0 до 7 (включительно) указывает мощность сигнала, используемого при передаче сообщения. Чем выше значение, тем сильнее сигнал, но тем больше энергии потребляется устройством. Нумерация переводится на позиции в следующем списке значений дБм: -30, -20, -16, -12, -8, -4, 0, 4.

address (по умолчанию = 0x75626974) — произвольное имя, выраженное в виде 32-битного адреса, который используется для фильтрации входящих пакетов на оборудовании. Сохраняет только те, которые соответствуют заданному вами адресу.

group (по умолчанию = 0) представляет собой 8-битное значение (0-255), используемое с address при фильтрации сообщений.

data_rate (по умолчанию = радио.RATE_1MBIT) указывает скорость, с которой происходит передача данных. Может быть одной из следующих констант, определенных в radio: RATE_250KBIT, RATE_1MBIT или RATE_2MBIT.

Если config не вызывается, то принимаются значения по умолчанию.

radio.reset()

Сбросьте настройки до их значений по умолчанию (как указано в документации для config.

Примечание

Ни один из следующих методов отправки или приема не будет работать, пока радио не будет включенно.

radio.send_bytes(message)

Отправляет сообщение, содержащее байты.

radio.receive_bytes()

Получите следующее входящее сообщение в очереди сообщений. Возвращает None, если нет ожидающих сообщений. Сообщения возвращаются в виде байтов.

radio.receive_bytes_into(buffer)

Получите следующее входящее сообщение в очереди сообщений. Копирует сообщение в buffer, обрезая конец сообщения, если это необходимо. Возвращает None, если нет ожидающих сообщений, в противном случае возвращает длину сообщения (которое может быть больше, чем длина буфера).

radio.send(message)

Отправляет строку сообщения. Это эквивалент send_bytes(bytes(message, 'utf8')) но с b'\x01\x00\x01' в начале (чтобы сделать его совместимым с другими платформами, которые поддерживают Microbit).

radio.receive()

Работает точно так же, как receive_bytes, но возвращает сообщение если не было отправленно.

В настоящее время он эквивалентен str(receive_bytes(), 'utf8'), но проверяет, что первые три байта равны b'\x01\x00\x01' (чтобы сделать его совместим с другими платформами, которые поддерживают micro:bit).

ValueError исключение возникает, если преобразование в строке не удается.

radio.receive_full()

Возвращает кортеж, содержащий три значения. Если нет ожидающих сообщений, то возвращает None.

Три значения в кортеже представляют:

* следующее входящее сообщение в очереди сообщений в виде байтов.
* RSSI (сила сигнала): значение от 0 (самый сильный) до -255 (самый слабый), измеренное в дБм.
* отметка времени в микросекундах: значение, возвращаемое ``time.ticks_us()``когда сообщение было получено.

Например:

details = radio.receive_full()
if details:
    msg, rssi, timestamp = details

эта функция полезна для предоставления информации, необходимой для триангуляции и/или трилитерация с другими устройствами micro:bit.

Примеры

# A micro:bit Firefly.
# By Nicholas H.Tollervey. Released to the public domain.
import radio
import random
from microbit import display, Image, button_a, sleep

# Анимация вспышка
flash = [Image().invert()*(i/9) for i in range(9, -1, -1)]

# Включить радиомодуль.
radio.on()

# Вечный цикл.
while True:
    # Если кнопка A нажата отправить сообщение.
    if button_a.was_pressed():
        radio.send('flash')
    # Читать входящие сообщения
    incoming = radio.receive()
    if incoming == 'flash':
        # Если пришло сообщение"flash" проиграть анимацию после случайно задержки
        sleep(random.randint(50, 350))
        display.show(flash, delay=100, wait=False)
        # Передать ответное сообщение.
        if random.randint(0, 9) == 0:
            sleep(500)
            radio.send('flash')