第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