はじめに
前回は、無線通信機能をシンプルに提供してくれるRednet APIを紹介し、このAPIを使ったメッセージを送信/受信するプログラムを紹介しました。
今回は前回紹介したプログラムに少しだけ手を加えて、より使いやすく工夫しましょう。
なお、複数のコンピュータ・タートルが絡み合った場合にどのような挙動になるかも検証してみます。
ソースコード
短いですね。これだけなら、手入力でも行けそうです。
メッセージ受信側
- 右側にあるモデムの準備
rednet.open("right")
- whileループでずっと動き続ける
- 自分のIDのチャンネルで待機し、メッセージがきたら3つの値を返す。
- 第1返値(数字): 送信者ID(誰からのメッセージ?)
- 第2返値(文字列): メッセージ文字列
- 第3返値(数字): 通信する2者間の距離
- 送信者IDとメッセージを画面に表示
プログラムの使い方
プログラム名msg_receiver
を実行。
> msg_receiver
メッセージ送信側
- 右側にあるモデムの準備
rednet.open("right")
- プログラム実行時の引数を処理
- 第1引数は、送信するメッセージを入力
- 第2引数は、送信先のコンピュータID
- 内部的には文字列として扱われているので、数字型に変換。
- 指定したIDのコンピュータに、指定したメッセージを送信
rednet.send(receiver_id, message)
プログラムの使い方
プログラム名msg_sender
を、メッセージHello
、送信先ID21
として実行。
> msg_sender Hello 21
実行例その1(送信1台、受信1台)
下の画像のように、送信側をコンピュータ(ID20)、受信側をタートル(ID30)とします。
- 受信側タートル(ID30)で、
msg_receiver
プログラムを起動しておきます。 - 送信側コンピュータ(ID20)で、
msg_sender Hello 30
と実行します。 - 受信側タートル(ID30)のターミナル画面を覗きに行くと、
#20: Hello
と表示されているはずです。
- 受信側タートル(ID30)で、
実行例その2(送信2台、受信1台)
下の画像のように、送信側のコンピュータ2台(ID20)(ID21)、受信側のタートル1台(ID30)を用意します。
- 受信側タートルで、
msg_receiver
プログラムを起動しておきます。 - 送信側コンピュータ(ID20)で、
msg_sender Hello 30
と実行します。 - 送信側コンピュータ(ID21)で、
msg_sender HelloHello 30
と実行します。 - 受信側タートルのターミナル画面を覗きに行くと以下のように表示されているはずです。
- 受信側タートルで、
実行例その3(送信1台、受信2台)
BLOADCASTチャンネル(65535)を試しましょう。
下の画像のように、送信側のコンピュータ1台(ID20)、受信側のタートル2台(ID30)(ID31)を用意します。
- 受信側タートル2台(ID30)(ID31)で、それぞれ
msg_receiver
プログラムを起動しておきます。 - 送信側コンピュータ(ID20)で、以下の引数でプログラムを実行します。
- 受信側タートル2台(ID30)(ID31)で、それぞれ
> msg_sender Hello 65535
受信側の2台のタートルで、それぞれ#20: Hello
が表示されていたら成功です。
BLOADCASTチャンネルを使うと、同時に全てのチャンネルにメッセージを送ることができます。
まとめ
これでメッセージ送信・受信の雰囲気がつかめたのではないでしょうか。 またBLOADCASTチャンネルもうまく使えば非常に強力ですね。活用しましょう(ただし、マルチ環境では要注意)。
さて、送信プログラムmsg_sender
は、引数を指定することで、送信先IDとメッセージを自由に変えて送ることができます。
たとえば、次のようなことも可能です。
> msg_sender turtle.turnRight() 30
ここで注意したいのは、"turtle.turnRight()"という文字列を送信していることです。
受信側も、これを文字列と解釈して、#20 turtle.turnRight()
という文字列を表示します。
次回は、受信したこの文字列を関数として解釈させることで、受信側タートルを遠隔操作するプログラムを紹介します。
これね、笑えるほど簡単なんですよ。次回をお楽しみに。