无线电

radio 模块使得各种设备能够通过简单的无线网络一起工作。

从概念上来讲无线电模块非常的简单:

  • 传播消息具有特定的可配置长度(高达251字节)。
  • 接收到的消息是从可配置大小的队列中读取的(队列越大,使用的RAM越多)。 如果队列已满,则会忽略新消息。
  • 消息在预先选择的频道上传输和接收(编号为0-100)。
  • 传输基于某特定功率 - 功率越大范围越广。
  • 消息通过地址(类似房屋号码)和组(类似指定地址处的指定收件人)进行过滤。
  • 吞吐率可以是三个预定义设置之一。
  • 发送和接收字节以处理任意数据。
  • 为了方便儿童,可以很容易地将消息作为字符串发送和接收。
  • 默认配置既合理又兼容其他针对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字节(254 - 3字节对于S0,LENGTH和S1前导码)。

queue (默认值= 3)指定可存储在传入消息队列中的消息数量。如果消息队列中没有剩余空间,传入消息将会丢失。

channel (默认值= 7)可以是0到100(含)之间的任一整数值,它定义了无线电调频的任意“频道”。 消息将通过此频道发送,并且只有通过此频道收到的消息才可以被放到传入消息队列中。 每一步长都是1MHz宽,基于2400MHz。

功率(默认值= 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_250KBITRATE_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' 预处理在前面(以使其与其他针对micro:bit的平台兼容)。

radio.receive()

receive_bytes 完全相同,但返回所有发送。

目前,它等同于 str(receive_bytes(),'utf8') 但是需检查前三个字节是 b'\x01\x00\x01' (以使其与其他针对micro:bit的平台兼容)。它在转换为字符串之前去除了预处理字节。

如果转换为字符串失败,将引发 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