无线电¶
该 radio
模块允许设备通过简单的无线网络协同工作。
无线电模块在概念上非常简单:
- 广播消息具有一定的可配置长度(最多 251 个字节)。
- 从可配置大小的队列中读取收到的消息(队列越大,使用的 RAM 越多)。如果队列已满,则忽略新消息。读取消息会将其从队列中删除。
- 消息在预选频道(编号 0-83)上广播和接收。
- 广播具有一定的功率水平 - 功率越大意味着范围越大。
- 邮件按地址(如门牌号)和组(如指定地址的指定收件人)过滤。
- 吞吐率可以是三个预先确定的设置之一。
- 发送和接收字节以处理任意数据。
- 使用receive_full获取有关传入消息的完整详细信息:数据、接收信号强度和消息到达时的微秒时间戳。
- 为方便儿童,可以轻松地以字符串形式发送和接收消息。
- 默认配置既合理又兼容其他针对 BBC micro:bit 的平台。
要访问此模块,您需要:
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 个字节(S0、LENGTH 和 S1 前导码为 254 - 3 个字节)。该
queue
(缺省= 3)指定可以被存储在收到的消息队列中的消息的数量。如果队列中没有为传入消息留下空间,则传入消息将被丢弃。该
channel
(缺省值= 7)可以是整数0至83(含)值,该值定义了该无线电调谐的任意的“通道”。消息将通过此通道发送,只有通过此通道接收到的消息才会放入传入消息队列。每步宽 1MHz,基于 2400MHz。该
power
(缺省值= 6)是从0到7(含)的整数值来指示广播消息时所使用的信号的强度。该值越高,信号越强,但设备消耗的功率也越大。编号转换为以下 dBm(分贝毫瓦)值列表中的位置:-30、-20、-16、-12、-8、-4、0、4。该
address
(默认值= 0x75626974)是一个任意名称,表示为32位地址,这是用来在硬件级别上进入的数据包进行过滤,只保留那些符合你设定的地址。其他 micro:bit 相关平台使用的默认值就是这里使用的默认设置。该
group
(缺省值= 0)是与所使用的一个8位数值(0-255)address
过滤时的消息。从概念上讲,“地址”就像是住宅/办公室地址,而“群组”就像是您要向其发送消息的那个地址的人。该
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)¶ 发送消息字符串。这相当于 但 前面加上了前缀(以使其与其他针对 micro:bit 的平台兼容)。
send_bytes(bytes(message, 'utf8'))
but withb'\x01\x00\x01'
-
radio.
receive
()¶ 工作方式与
receive_bytes
但返回发送的任何内容完全相同。目前,它相当于但检查前三个字节是(以使其与可能针对 micro:bit 的其他平台兼容)。它在转换为字符串之前去除前置字节。
str(receive_bytes(), 'utf8')
but with a check that the the first three bytes areb'\x01\x00\x01'
ValueError
,如果转换为字符串失败异常。
-
radio.
receive_full
()¶ 返回一个包含三个值的元组,表示消息队列中的下一条传入消息。如果没有挂起的消息,则
None
返回。元组中的三个值代表:
- 消息队列中的下一条传入消息作为字节。
- RSSI(信号强度):一个介于 0(最强)和 -255(最弱)之间的值,以 dBm 为单位。
- 微秒时间戳:
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
# 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