第9回 ネットワーク通信
1.やってみよう
(1) 図1に示す実験回路を作りなさい。
図1.実験回路
(2) Arduinoのプログラミング環境に、つぎのプログラムを入力しなさい。
int r; void setup() { pinMode(13, OUTPUT); Serial.begin(9600); r = 1; } void loop() { if (Serial.available() >= 1) { r = Serial.read(); if (r == 0) { digitalWrite(13, 1); } else { digitalWrite(13, 0); } } delay(20); }
(3) 書き込みボタンを押して、Arduinoのプログラムを実行しなさい。
(4) Processingのプログラミング環境に、つぎのプログラムを入力しなさい。
import processing.serial.*; import processing.net.*; Serial serial; Server server; Client client; int s, r; void setup() { size(200, 150); frameRate(30); serial = new Serial(this, "COM1", 9600); server = new Server(this, 10000); r = 1; } void draw() { background(255, 255, 255); client = server.available(); if (client != null) { r = client.read(); s = r; serial.write(s); } if (r == 0) { stroke(0, 0, 0); fill(255, 255, 255); rect(90, 65, 20, 20); fill(0, 0, 0); ellipse(100, 75, 18, 18); } else { stroke(0, 0, 0); fill(255, 255, 255); rect(90, 65, 20, 20); fill(255, 255, 255); ellipse(100, 75, 18, 18); } }
(5) このプログラムにserver.pdeという名前をつけて保存し、Runボタンを押して実行しなさい。
(6) Processingのプログラミング環境に、つぎのプログラムを入力しなさい。
import processing.net.*; Client client; int s; void setup() { size(200, 150); frameRate(30); client = new Client(this, "127.0.0.1", 10000); s = 1; } void draw() { if (s == 0) { background(255, 255, 255); fill(0, 0, 255); textSize(28); textAlign(CENTER); text("click", 100, 75); } else { background(0, 0, 255); fill(255, 255, 255); textSize(28); textAlign(CENTER); text("click", 100, 75); } } void mousePressed() { s = 1 - s; client.write(s); }
(7) このプログラムにclient.pdeという名前をつけて保存し、Runボタンを押して実行しなさい。マウスをクリックするたびに、LEDの発光と消灯が切り替わることを確認しなさい。
2.解説
Processingには、ネットワーク環境に接続されているPCの間でデータをやり取りするしくみとして、ネットワーク通信の機能が用意されている。
図2に示すように、こうしたネットワーク通信では、ひとつのPCをサーバー、そのほかのPCをクライアントにして、クライアントのリクエストに応じてサーバーを動作させるクライアント・サーバー方式のしくみによってデータをやり取りすることが一般的である。
ネットワーク通信によってデータをやり取りするには、そのための約束事として、あて先を指定するためのしくみが必要になるが、こうしたしくみとして一般的に利用されているのがIPアドレスとポート番号である。IPアドレスは、それぞれのPCを識別するために割り当てられたIDである。一方、ポート番号は、それぞれのアプリケーションを識別するために割り当てられたIDである。
server.pdeは、ポート番号として10000を指定することで、クライアントからのデータを受信するサーバーのプログラムとして動作している。一方、client.pdeは、サーバーのIPアドレスとして127.0.0.1、ポート番号として10000を指定することで、サーバーに対してデータを送信するクライアントのプログラムとして動作している。
図2.クライアント・サーバー方式のネットワーク通信
ネットワーク通信の機能を利用するため、Processingに用意されているのが、ServerクラスとClientクラスというライブラリである。シリアル通信と同様、図3に示すように、write関数を使ってデータを送信し、available関数とread関数を使ってデータを受信するのが、クライアントとサーバーの間でデータをやり取りするための一連の手順になっている。
図3.クライアントとサーバーの間でデータをやり取りするための一連の手順
もちろん、こうしたクライアント・サーバー方式によるデータのやり取りは、サーバーとクライアントをそれぞれ別々のPCに割りあてて動作させることが一般的であるが、じつは、ここで紹介したプログラムは、サーバーとクライアントをどちらも同じPCに割りあてて動作させるものになっている。
IPアドレスのなかには、特殊なものとして、自分自身を表すアドレスが用意されている。127.0.0.1はそのひとつであり、これをループバックアドレスと呼ぶ。IPアドレスとしてループバックアドレスを指定すると、一台のPCだけでネットワーク通信によるデータのやり取りを実現することができる。
3.課題
(1) 複数のPCを用意し、ひとつのPCをサーバー、そのほかのPCをクライアントとして、それぞれのプログラムの動作を確認しなさい。
(2) クライアントにArduinoを接続しなさい、また、Arduinoにスイッチを接続しなさい。スイッチを押すたびに、サーバーのウィンドウの表示が交互に切り替わるプログラムを作りなさい。
4.ヒント
複数のPCによるネットワーク通信の実験を行うには、そのための準備として、それぞれのPCのIPアドレスを調べておく必要がある。
PCに割りあてられたIPアドレスは、Windows環境の場合、「コマンドプロンプト」から「ipconfig」コマンドを実行することで確認することができる。また、Macintoch環境の場合、「ターミナル」から「ifconfig」コマンドを実行することで確認することができる。
Last Modified: July 4 12:00 JST 2017 by Naofumi Aoki
E-mail: aoki@ime.ist.hokudai.ac.jp