僕は発展途上技術者

Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その2)

のんびり書こうかなとも思っていたが、こちらの記事 →Pyonkeeで遊ぼう! でも紹介されたりと期待もされているようなので続けざまに2回目を書きます。

シリーズ全エントリーはこちら↓

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その1)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その2)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その3)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その4)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その5)

ポート番号 42001 を開放



前回の記事で、スクラッチの「遠隔センサー接続」を有効にする方法を書いた。

「遠隔センサー接続」を有効にするとスクラッチは TCP のポート番号 42001 を開放する。

スクラッチのユーザーを意識して、コンピューターのことにまだ詳しくない人にも、できればスクラッチ中上級者になったこどもたちにもわかるようにと思ってこの記事を書いているが、とはいえ全部を説明しだすとキリがないので、TCP について、あるいはポート番号についてもっと詳しく知りたかったら Wikipedia などで調べて欲しい。

ポート番号というのは、語源が port(船の荷物の出入口)であることから連想できるように、プログラム同士をつなげて通信するときの出入口の番号だと思ってもらいたい。ポート番号というのは実はたくさんあるのだけれど、42001 番の出入口だけが開いて、そこからだけ通信できるようになると想像してほしい。

Ruby のプログラムをスクラッチにつなげる



これ以降の説明では Ruby が登場する。Ruby がわかっているのが望ましいが、遠隔センサー接続の仕組み自体は実はそれほど難しいわけではないし、説明にはアニメーションgifを使って実際に動いている様子を見せるようにするので、Ruby がわかっていなくても何となく雰囲気だけでもわかってもらえるかもしれない。

Scratch につなげる Ruby のプログラムは以下の通り、コメントを抜かせばたった2行だ。



localhost とは、プログラムを動かしているマシンのそのもののアドレスだ。スクラッチとこの ruby のプログラムは同じマシン上で動いているので、つなげる接続先は、同じマシン上の TCP 番号 42001 となる。

これを実行してみても、特に何も起こらない。プログラムをスクラッチにつなげただけで何もせず終了しているからだ。



スクラッチからのメッセージを覗き見る



スクラッチにつなげたあと、送られてきたメッセージを読み込んで表示するプログラムを追加した。



loop do と end で囲む部分はスクラッチでいえば「ずっと」のブロックだ。囲まれた部分はプログラムを中断するまでずっとループし続ける。

socket.recv(100) で、ポート番号 42001 から流れてくるメッセージを十分な長さ(100バイト)受け取っている。

そして puts message.unpack("H*")[0] でメッセージをバイトで表示している。unpack("H*")[0] は16進文字列に変換する命令だ。

これを実行して、試しに「◯◯を送る」ブロックで a というメッセージを送ってみる。



「a を送る」をクリックするたび、何やら謎めいた文字列が表示されているのがわかるだろうか。メッセージの内容は良いとして、どうやらスクラッチから Ruby のプログラムに何らかのメッセージが送られているらしいということはわかってもらえたと思う。

メッセージの内容を読み解く



「a を送る」をクリックしたときにスクラッチから送られてきたメッセージは


0000000d62726f61646361737420226122


だ。これは送られてきたメッセージを16進文字列で表示したものだ。

読みやすくするため数字2つずつで区切ってみる。


00 00 00 0d 62 72 6f 61 64 63 61 73 74 20 22 61 22


Scratch Wiki の Remote Sensors Protocol の説明を読めばわかるのだが、スクラッチとの間でやり取りされるメッセージは、最初の4バイトとその残りとに分けられ、最初の4バイトは残りのメッセージが何バイトなのかの長さを示している。

上記の例では


00 00 00 0d


が残りのメッセージのサイズを示している部分だ。これを10進数で表すと 13、つまりその後に続くメッセージの長さは 13 バイトであることを示していて、0d に続く 62 以降のバイト(2つの文字または数字のかたまり)を数えてみれば 13 個であることがわかる。

残りのメッセージの部分


62 72 6f 61 64 63 61 73 74 20 22 61 22


は、ASCII 文字列(本当は UTF-8 なのだが英数字しか登場していないので ASCII 文字列と考えて良い)の16進数表示だ。

ASCII文字コードを頼りに、置き換えてみよう。

62 → b、72 → r、.... 20 → スペース、22 → " と置き換えていくと、


62 72 6f 61 64 63 61 73 74 20 22 61 22
b r o a d c a s t " a "


のように暗号が解ける。

スクラッチから送られてきていたメッセージは broadcast "a"(a をブロードキャスト、放送する)だったことがわかる。

「制御」カテゴリの「◯◯を送る」ブロックは実は英語では「broadcast ◯◯」ブロックなのだ。スクラッチの言語を英語に切り替えてみればそれが確認できる。

これで、「◯◯を送る」を実行すると、スクラッチから broadcast "◯◯(送るメッセージの内容)" というメッセージが送られてくる、ということがわかったかと思う。

プロフィール

株式会社まちクエスト代表、つくる社LLC代表。

Raspberry Piではじめる どきどきプログラミングを書きました。

Amazonから図書館検索 Libron、iPhoneアプリ ひらがなゲーム かなぶん を作っています。

Twitter @jishiha

最近のエントリー

アーカイブ