Minecraftとタートルと僕

PCゲームMinecraftのMOD「ComputerCraft」の情報を集めたニッチなブログです。

こちらのページは更新が滞っており、情報が古くなりつつあります。新しいCC情報サイトをはじめましたので、もしよければご参照ください。今後ともよろしくお願い申し上げます。

「百億のマインクラフトと千億のタートル」(https://hevo2.hatenablog.com/)

ComputerCraftの無線通信を使いこなそう(2) ―RednetAPIの解説

はじめに

前回は無線通信システムについて概要を説明しました。

今回はRednet APIを紹介しつつ、実際に動かしてみましょう。

Rednet APIを使ったメッセージの送受信

WirelessModemの使用準備

まず最初に、Wireless Modemの装着方向を確認します。 そしてその方向を引数にrednet.open()関数を実行することで、周辺機器を使用可能な状態にします。 イメージとしては、チャンネル回線を開く準備をしていると思えばよいでしょう。

メッセージを送信する側も受信する側も、必ず最初に使用準備をしてください

なおモデムは、タートルならば右側に装着されていますし、コンピュータならば任意の方向に装着することができます。

-- 右側に装着したWirelessModemの使用準備をする
rednet.open("right")
  • 方向として指定できる文字列: "top", "bottom", "right", "left", "front", "back"

補足)装着方向についての注意

  • f:id:hevohevo:20140312005402j:plain

    • 装着された周辺機器の方向を考えるとき、コンピュータ(画像中で黄色)ならば、プレイヤーとコンピュータ画面が向かい合った状態でプレイヤーから見た方向を考えます。つまり画像中でモデムが装着されているのはプレイヤーから見て右側なので、rightです。
    • それに対してタートル(画面中で赤)では、タートルから見た方向を考えます。画像ではタートルの右手側にモデムが装着されているので、こちらもrightと指定します。
    • あるいは、コンピュータ(タートル)を設置したときに、そのまま素直にプレイヤーから見てどちら側かで判断しても良いかもしれません。

メッセージを送信する

rednet.send()関数によって、指定したチャンネルに「文字列」を送信します。

送信先コンピュータIDをあらかじめ調べておき、そのIDと同じチャンネルIDを使ってください。 たとえば、ID2のコンピュータにメッセージを送信したいのならば、チャンネル2を使います。

rednet.send(チャンネルID, メッセージ文字列)
  • メッセージ送信に成功したらこの関数はtrueを返す。
  • ただし注意したいのは、「送信」に成功であって、相手が「受信したかどうか」は保証されない。
    • 「送信成功と言った。しかしそのメッセージを相手が受け取ったとは言ってない(キリッ」

メッセージ受信する

rednet.receive()関数は、

自分のIDのチャンネルを監視しつつ待機。メッセージ文字列が流れてきたら受信する。という機能を持ちます。 また、BROADCAST(同時通信)用のチャンネルである65535に流れてきたメッセージも受け取ることができます。

この関数は受信チャンネルを選ぶことはできません。自分IDのチャンネルとBROADCASTチャンネルのみです。

rednet.receive(待ち時間)
  • 引数で指定した待ち時間(秒)だけ自分ID(とBROADCAST用)のチャンネルを監視しつつ待機。待ち時間を省略したらメッセージが流れてくるまで永遠に待ち続ける。
  • 返し値は以下のとおり
    • 第1返値: 送信者のID(数値)
    • 第2返値: メッセージ(文字列)
    • 第3返値: 自分と送信者間の距離(数値)

サンプルプログラム

とてもシンプルなプログラムなので、実際に試してみると理解しやすいです。

これくらいのコード量ならターミナル画面でeditコマンドを使って入力してもそれほど手間ではないですよね。

以下のプログラムは、(1)受信側プログラム(=受信待機)、(2)送信側プログラム(=メッセージ送信)の順に実行してください。順番を間違えないように。

また、あらかじめ受信者側のIDを調べておくのを忘れないでください。WirelessModemの装着方向と合わせて、自分の環境によってプログラムを書き換えてください。

  • コンピュータ・タートルのIDを調べるには、ターミナル画面でidコマンドを使いましょう。
    • f:id:hevohevo:20140312012644j:plain(受信側であるタートルのIDは21でした。)

メッセージ受信側で動かすプログラム (←こちらから先に実行)

(1)右側に装着されたモデムの使用準備。(2)自分のIDのチャンネルでメッセージ待ちうけ。(3)メッセージを受信したら画面に表示。

rednet.open("right")

local senderID, message, distance = rednet.receive()
print(message,' from ID',senderID)
  • ポイントは、rednet.receive()からの返ってくる3つの返値をそれぞれ変数に代入しているところです(ちなみに、このように一度に複数の変数へ代入することを多重代入と呼びます)。
  • また、メッセージを画面表示するときに、誰から送られてきたメッセージなのか、そのIDも同時に表示します。

メッセージ送信側で動かすプログラム (←次にこちら)

(1)右側に装着されたモデムの使用準備。(2)チャンネルID21を使って「hello」というメッセージを送信。

rednet.open("right")

rednet.send(21, "hello")

実行結果

受信側 → 送信側 の順にプログラムを動かして、最終的に受信側のコンピュータのターミナル画面に、"hello"が表示されていたら成功です。

  • f:id:hevohevo:20140312013848j:plain

この画像では、ID20から「hello」というメッセージが送られてきたということがわかりますね。

次回のお話

次回は、このメッセージ送信プログラムをもうすこし使いやすくします。 たとえば、このプログラムでは、1回メッセージを送信・受信したらそれで終了ですが、

  • 何度でもメッセージを受け取ることができるように、受信側はメッセージを受信したらまたチャンネル監視モードに入るようループさせる
  • 送信側はプログラム実行時の引数で任意の文字列を送れるようにする。
  • 受信側を2台にして、送信側がBROADCAST(一斉通信)チャンネルにメッセージを送信したらどうなるか。

などを予定しています。