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 で取得していのだが、エミュレータだと、本当のマウスの位置(笑)が取れる。エミュレータのウィンドウの左上ではなく、ディスプレイの左上からの位置が取れる。なので、マウスクリックを取る場合は、エミュレータの位置を左上にしないといけない。