PDAで無線LANを扱う(仮) http://www.moonmile.net/blog/?p=208 の続き
PDAがクライアント、PCがサーバーのパターンとして、PDAからPCをリモコン操作することを考える。つまりは、クラサバを作ってやれば良いわけで、作ってみたのがこれ。
PDA クライアントのソースはこちら
using System.Net;
using System.Net.Sockets; namespace RemoCon01
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
this.pictureBox1.Size = this.Size;
this.pictureBox1.Image = Properties.Resources.peorth;
} private string HOSTNAME = "192.168.0.7"; // "iomante-pc";
private int PORT = 9000; private void pictureBox1_Click(object sender, EventArgs e)
{
int n =
MousePosition.X / (pictureBox1.Width / 3) +
MousePosition.Y / (pictureBox1.Height / 3) * 3; //PCにコマンドを送る
TcpClient tcp = new TcpClient();
try {
tcp.Connect(HOSTNAME, PORT);
NetworkStream stream = tcp.GetStream();
byte [] buffer =
System.Text.Encoding.ASCII.GetBytes(
string.Format("R{0}", n ));
stream.Write( buffer, 0, buffer.Length );
tcp.Close(); MessageBox.Show(string.Format("送信 R{0}", n)); } catch ( Exception ex ) {
MessageBox.Show( ex.Message );
}
}
}
}
PC サーバのソースはこちら
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace RemoCon01PC
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{ } // ワーカースレッド
private Thread work;
private TcpListener server; // サーバを開始する
private void button1_Click(object sender, EventArgs e)
{
// ワーカースレッドの作成と開始
work = new Thread(DoWork);
work.Start();
}
// サーバを終了する
private void button2_Click(object sender, EventArgs e)
{
server.Stop();
}
// ワーカースレッド
private void DoWork()
{ // リスナーを作成する
server = new TcpListener(IPAddress.Any, 9000);
// リスナーを開始する
server.Start();
textBox1.Text = "サーバー開始";
try
{
while (true)
{
// クライアントからの接続を受け付ける
TcpClient client = server.AcceptTcpClient();
NetworkStream stream = client.GetStream();
// 受信データの読み出し
byte[] data = new byte[100];
int len = stream.Read(data, 0, data.Length);
string str = System.Text.Encoding.ASCII.GetString(data, 0, len);
textBox1.Text = "受信データ:" + str;
client.Close();
}
}
catch (Exception ex)
{
textBox1.Text = "サーバー終了";
}
}
}
}
本当は.NETリモートでやりたかったのだが、なんと!.NET Compact には.NETリモートが無い。ので、仕方がないので、TCP/IPで接続。IPが直書きになっているけど、気にせず。
TCP/IPで接続しているので、いろいろ送ることができるのだが、PDAの操作は決まっているので単純な(あまりにも単純な)コマンドを送っているだけです。PDAの画面を9分割して、タッチされたところの番号をPCに送ります。PCのほうは、コマンドを表示しているだけです。これに対応した「何か」を動かせばOK。
ブラウザの前/後へを考えたけど、画面をクリックしないと駄目なのでパス。DVDの出し入れとか、音量とか、なんかのアプリ起動に使えるだろう。
以下、エミュレータを使ったときの注意点。
最初、エミュレータでTCP/IP接続を確認していたのだが、
「エミュレータのネットワークを有効にする」
ことを忘れて、半刻ほど悶絶。
[ファイル]→[構成]で「エミュレータのプロパティ」を開いて「ネットワーク」タブで、ネットワークアダプタを有効にしないといけない。
後、エミュレータで直接Socketを使うと非常に遅い。Connect時にハングアップしたんじゃないかというほど遅く、1分ほどかかる。これは実機のPDAでやるとすんなり繋がるので、エミュレータの問題かな?
ボタンの位置を MousePosition で取得していのだが、エミュレータだと、本当のマウスの位置(笑)が取れる。エミュレータのウィンドウの左上ではなく、ディスプレイの左上からの位置が取れる。なので、マウスクリックを取る場合は、エミュレータの位置を左上にしないといけない。



