Radio
- radio模块可以让设备通过简单的无线网络协同工作。
- 无线电模块在概念上非常简单:
- 广播消息的长度可配置(最多251字节)。
- 从消息队列中读取接收到的消息。如果队列已满,新消息会被忽略。
- 消息在预选频道(0-100)上广播和接收。
- 广播功率越大传输的范围越大。
- 消息通过address(如房间号)和group(如房间中的人)的方式过滤。
- 吞吐率可以是三个预定设置之一。
- 发送和接收来处理任意数据。
- 为方便孩子使用,将发送和接收消息转化成字符串方便操作。
- microbit的默认配置兼容其他的板子。
要访问此模块,您需要:
import radio
常量
- radio.RATE_250KBIT 用于指示每秒256 Kbit的吞吐量。
- radio.RATE_1MBIT 用于指示吞吐量1 MBit一秒。
- radio.RATE_2MBIT 用于表示吞吐量为2 MBit。
函数
radio.on()
打开广播,这函数必须被调用,因为无线电会消耗功率并占用你可能需要的内存。
radio.off()
关闭收音机,节省电量和内存。
radio.config(**kwargs)
配置与收音机相关的各种基于关键字的设置。可用的设置及其合理的默认值如下所示。
-
length(默认值=32)定义通过无线电发送的消息的最大长度,以字节为单位,长度可达251字节。
-
queue(默认值=3)指定可以被存储在收到的消息队列中的消息的数量。如果队列中没有接收新消息的空间,新消息就被删除。
-
channel(默认值=7)0到100的整数,限定一个“频道”。消息将通过此频道发送,只有通过此频道收到的消息将被放入到传入消息队列中。基于2400MHz,每次为1MHz。
-
power(默认值=6)0到7的整数值,指示广播消息所使用的信号强度。值越高,信号越强,但是设备消耗的功率越多。编号转换为这些值,单位dBm(分贝毫瓦):-30,-20,-16,-12,-8,-4,0,4。
-
address(默认值= 0x75626974)是一个任意名称,表示32位的地址,用于过滤接受的硬件的数据包,只保留与您设置的地址匹配的包。microbit相关平台使用的默认值是此处使用的默认设置。
-
group(默认值= 0)是在过滤消息时使用的8位值(0-255)。“address”就像房间的地址,“group”就像房间中的人。
-
data_rate(默认值= radio.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\x01\x01'(为了使其与其他microbit兼容)。
radio.receive()
和receive_bytes的工作方式相同,但返回发送的内容。
目前,这相当于str(receive_bytes(), 'utf8'),但是会检测前三个字节是不是b'\x01\x00\x01'(为了让它与其他的microbit兼容)。
它在转换为字符串之前,它会去掉预先的字节。如果转换为字符串失败,就会抛出ValueError异常。
例子
# 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
# Create the "flash" animation frames. Can you work out how it's done?
flash = [Image().invert()*(i/9) for i in range(9, -1, -1)]
# The radio won't work unless it's switched on.
radio.on()
# Event loop.
while True:
# Button A sends a "flash" message.
if button_a.was_pressed():
radio.send('flash') # a-ha
# Read any incoming messages.
incoming = radio.receive()
if incoming == 'flash':
# If there's an incoming "flash" message display
# the firefly flash animation after a random short
# pause.
sleep(random.randint(50, 350))
display.show(flash, delay=100, wait=False)
# Randomly re-broadcast the flash message after a
# slight delay.
if random.randint(0, 9) == 0:
sleep(500)
radio.send('flash') # a-ha