messaging -- メッセージの送受信¶
他のデバイスとの間でメッセージを送受信するためのクラス。
| ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|---|
- class BLERadio(broadcast_channel=None, observe_channels=[])¶
Bluetooth Low Energy を使って、接続なしでメッセージを送受信します。
バージョン 4.0 で追加: これは以前、各ハブクラスの一部でした。
- パラメータ:
broadcast_channel -- データ配信に使用するチャンネル番号(0~255)。ブロードキャストを使わない場合には
Noneを指定してください。observe_channels --
hub.ble.observe()呼び出し時に観測するチャネルのリスト。監視するチャネル数を増やすと、より多くのメモリが必要になります。デフォルトは空のリスト(チャネルなし)です。
- awaitbroadcast(data)¶
事前に選択してある
broadcast_channelに指定したデータのブロードキャストを開始します。データは、型が
int,float,str,bytes,True,Falseのものです。それらのリストやタプルも指定できます。ブロードキャスト通信を停止するに
Noneを指定します。ブロードキャスト通信が必要ない場合には、停止することによりパフォーマンスを向上させられます。同時にデータ観測をしている場合には特に便利です。合計データサイズはかなり制限されています(26バイト)。
TrueとFalseはそれぞれ1バイトを占有します。floatは5バイトを占有します。intは数値の大きさに応じて2から5バイトを占有します。strとbytesはオブジェクトのバイト数に加えて1バイトを占有します。マルチタスクを行う場合、ブロードキャスト通信は一度に1つのタスクでしかできません。複数のタスク(またはブロックスタック)からの情報をブロードキャストするには、ブロードキャスト通信用の専用タスクを用意して、他の複数タスクからの情報を送信するようにできます。
- パラメータ:
data -- ブロードキャストする値、もしくは値のリスト。
- 例外:
RuntimeError --
broadcast_channelが設定されていない場合に発生します。ValueError -- エンコードしたデータが 26 バイトを超えた場合に発生します。
TypeError --
dataが持つ値にbool,int,float,str,bytes以外のものがあった場合に発生します。
- observe(channel) bool | int | float | str | bytes | tuple | None¶
指定したチャンネルで最後に観測されたデータを取得します。
ハブがコンピュータや他のデバイスに同時に接続しないようにすると、データを受信する信頼性が高くなります。
- パラメータ:
channel (int) -- 観測するチャンネル。このオブジェクトを作成する際に
observe_channelsに設定したチャネルのいずれかである必要があります。- 戻り値:
受信データは、送信した形式と同じ形式となります。最新のデータが利用できない場合は
Noneが返ります。- 例外:
ValueError --
channelがobserve_channelsにない場合に発生します。
- signal_strength(channel) int: dBm¶
指定したチャンネルの平均信号強度を dBm 単位で取得します。
これはブロードキャストデバイスがどれだけ近くにあるかを示します。近くのデバイスは約 -40 dBmの信号強度を持ち、遠くのデバイスは約 -70 dBm の信号強度を持ちます。
- パラメータ:
channel (int) -- チャンネル番号。このオブジェクトを作成する際に
observe_channelsに設定したチャネルのいずれかである必要があります。- 戻り値:
最近の受信データがない場合、信号強度は
-128となります。- 例外:
ValueError --
channelがobserve_channelsにない場合に発生します。
- class AppData(modes)¶
Pybricks Code ホストアプリケーションと USB または Bluetooth 経由で生データを交換します。これは、ビジョンプロセッサなどのスマートセンサー機能で使われます。
各プロセッサは1つの emode を持ち、一定量のデータを生成します。これらのデータは変化するたびにハブに継続的に送信します。ユーザーコードは、ブロックすることなくいつでもこれらのバッファリングされた値を読み取れます。すべての値は初期状態ではゼロです。
ハブの観点から見ると、ホストへの書き込みは待機可能な操作です。モードとモード設定の構成に使えます。
一度に存在できるインスタンスは1つだけです。プログラムの初期化中に作成する必要があります。その後、マルチタスク中にすべてのメソッドを使用できます。
- パラメータ:
modes --
(mode, size)タプルのリスト。modeはモード番号(0~255)、sizeはそのモードの受信バッファに割り当てるバイト数です。モード番号は一意である必要があります。リストはモード番号で自動的にソートされます。- 例外:
RuntimeError --
AppDataインスタンスが既に存在する場合に発生します。TypeError --
modesがリストでない場合、または要素のいずれかが、0から255のモード値を持つ(mode, size)タプルでない場合に発生します。ValueError -- モード番号が複数回出現する場合に発生します。
- get_bytes(mode, index=None) bytes | int¶
指定したモードについてホストから受信したデータを取得します。
- パラメータ:
- 戻り値:
モードに対して受信したすべてのバイト列。
indexを指定している場合は整数としての1バイト。- 例外:
ValueError --
modeが設定されていない場合、またはindexが範囲外の場合に発生します。
- awaitconfigure(mode, parameter, value)¶
指定したモードに対して、ホストに設定コマンドを送信します。
これは
write_bytes()のラッパーです。モード設定を構成するために[0x01, mode, parameter]ヘッダーを先頭に追加します。
- close()¶
データコールバックを無効にし、受信バッファを解放します。
これは、オブジェクトがガベージコレクションされる際にも自動的に呼び出されます。
BLERadio の利用例¶
他のハブへのデータのブロードキャスト¶
from pybricks.pupdevices import Motor
from pybricks.parameters import Port
from pybricks.tools import wait
from pybricks.messaging import BLERadio
# ハブを初期化。
radio = BLERadio(broadcast_channel=1)
# モーターを初期化。
left_motor = Motor(Port.A)
right_motor = Motor(Port.B)
while True:
# 他のハブに送るモーター回転角度の読取り。
left_angle = left_motor.angle()
right_angle = right_motor.angle()
# ブロードキャストするデータを設定。まだブロードキャストしていなければ開始。
data = (left_angle, right_angle)
radio.broadcast(data)
# ブロードキャストは100ミリ秒ごとにのみ送信するので、それ以上の頻度で
# broadcast() メソッドを呼び出す理由はありません。
wait(100)
他のハブからのデータ観測¶
from pybricks.pupdevices import Motor
from pybricks.parameters import Port
from pybricks.tools import wait
from pybricks.messaging import BLERadio
# ハブを初期化。
radio = BLERadio(observe_channels=[1])
# モーターを初期化。
left_motor = Motor(Port.A)
right_motor = Motor(Port.B)
while True:
# 他のハブからのブロードキャストの受信。
data = radio.observe(1)
if data is not None:
# データは受信済みで、1秒未満前のもの。
# データには、他のハブで hub.ble.broadcast() に
# 指定したときと同じ順序で同じ値が含まれています。\ left_angle, right_angle = data
# 他のハブのモーターの位置をこのハブのモーターに反映します。
left_motor.track_target(left_angle)
right_motor.track_target(right_angle)
# ブロードキャストは100ミリ秒ごとにのみ送信されるので、それ以上の
# 頻度で observe() メソッドを呼び出す理由はありません。
wait(100)