2010年11月16日火曜日

AndroidとPCをネットワークでつなぐ その1


AndroidからPCへ情報送りたいって思いません?
しかも一度PC側のソースを書いたらどのOSでも動いたらうれしくないですか?
そこで、今回はマルチプラットフォームで動くProcessingを使って、
AndroidとPCをつないでみたいと思います。




Processingに標準で搭載されているネットワーク関係のライブラリは
使ってみた感じUDPではなさそうです。(おそらくTCPかな?)
ファイルのやり取りなどはそれでもよいのですが、
今後のことを考えてUDPで通信を行います。(今後はお楽しみ)

しかし、Processingには標準でUDPのライブラリが入っていないようです。
なので、こちらからudp.zipをダウンロードし、解凍してできたフォルダを
Processingが格納されているフォルダ内のlibrariesへコピーします。
macの場合、Finderから「アプリケーション」→「Processing」を右クリックする。
そしたら、「パッケージの内容を表示」をクリック。

パッケージの内容が表示されるので、
「Contents」→「Resources」→「Java」→「libraries」に
「udp」フォルダを追加する。そうすることでProcessingの開発環境でライブラリを
使用することができるようになる。


環境が整ったら、コーディング方法。
Processingを立ち上げ、メニューから
「Sketch」→「Import Library...」→「udp」をクリックする。
そうすると、スケッチに

import hypermedia.net.*;

が追加される。
それで、今回作成したコードは以下。


/**
 * Server
 */
import hypermedia.net.*;
import processing.net.*;
import processing.serial.*;



/*************************************************
 * 定数定義
 ************************************************/

/** ポート番号 */
private static final int PORT = 1113;

/** 画面横幅 */
private static final int WIND_WIDTH = 320;

/** 画面縦幅 */
private static final int WIND_HEIGHT = 240;



/*************************************************
 * 変数定義
 ************************************************/

/** サーバー */
//private Server mServer;

/** UDP */
private UDP udp;

/** タイムアウト回数 */
private int timeout = 50;

/** サーボへの出力値 */
private int sensor1, sensor2;




/*************************************************
 * 通信
 ************************************************/

void receive(byte[] data) {
  sensor1 = data[0];
  sensor2 = data[2];
}


/*************************************************
 * Processingのメソッド定義
 ************************************************/

/**
 * セットアップ
 */
void setup() {
 
  size(WIND_WIDTH, WIND_HEIGHT);
  frameRate(10);
 
  // サーバーのインスタンスの生成
  //mServer = new Server(this, PORT);
 
  // UDPのインスタンス生成
  udp = new UDP(this, PORT);
  udp.listen(true);
 
  noStroke();
}



/**
 * 描画ループ
 */
void draw() {

  background(0,0,0);
 
  fill(color(255,255,255));
  text("Sensor[0]:" + sensor1, 0, 15);
  text("Sensor[1]:" + sensor2, 0, 30);
 
}



これでUDP通信でAndroid側から情報を受け取ることができます。
今回はデータはbyte配列内にbyte型のデータのみを入れています。
データをきちんと格納してあげればshortでもintでも格納することは可能です。

それで以下がAndroid側のコード

// 一部抜粋
DatagramSocket sock;
DatagramPacket packet;
byte[] buf = {(byte)1, (byte)2};
int ret = buf.length;

sock = new DatagramSocket();
packet = new DatagramPacket(buf, ret, InetAddress.getByName(mIp), mPort);
sock.send(packet);
sock.close();


今後につながってくる部分なので一部抜粋をしてコードをのせています。
しかし、基礎となるコードは基本これだけです。
これにいろいろデータをのせてあげたりすることでデータのやり取りが可能になります。

まとめ
今回はProcessingを使ってPCとAndroidの通信の基礎部分を構築しました。
比較的簡単に構築することができるかと思います。
今後は大きいサイズのデータのやり取りやもう少しひねった物を作っていきます。



0 件のコメント:

コメントを投稿