无线电

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_1MBITRATE_2MBIT

如果 config未调用,则假定上述默认值。

radio.reset()

将设置重置为其默认值(如上述config功能的文档中所列)。

笔记

在打开收音机之前,以下任何发送或接收方法都不起作用。

radio.send_bytes(message)

发送包含字节的消息。

radio.receive_bytes()

接收消息队列上的下一条传入消息。None如果没有挂起的消息,则返回。消息以字节形式返回。

radio.receive_bytes_into(buffer)

接收消息队列上的下一条传入消息。将消息复制到 中bufferNone,如果没有未决的消息,否则它返回消息(可能超过缓冲区的长度)的长度。

radio.send(message)

发送消息字符串。这相当于 但 前面加上了前缀(以使其与其他针对 micro:bit 的平台兼容)。 send_bytes(bytes(message, 'utf8')) b'\x01\x00\x01'

radio.receive()

工作方式与 receive_bytes 但返回发送的任何内容完全相同。

目前,它相当于但检查前三个字节是(以使其与可能针对 micro:bit 的其他平台兼容)。它在转换为字符串之前去除前置字节。 str(receive_bytes(), 'utf8')b'\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