Радио
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')