PDAで無線LANを扱う(仮) http://www.moonmile.net/blog/?p=208 の続き
PDAがクライアント、PCがサーバーのパターンとして、PDAからPCをリモコン操作することを考える。つまりは、クラサバを作ってやれば良いわけで、作ってみたのがこれ。
PDA クライアントのソースはこちら
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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 サーバのソースはこちら
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | 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 で取得していのだが、エミュレータだと、本当のマウスの位置(笑)が取れる。エミュレータのウィンドウの左上ではなく、ディスプレイの左上からの位置が取れる。なので、マウスクリックを取る場合は、エミュレータの位置を左上にしないといけない。