PDAからPCへリモコン操作

PDAで無線LANを扱う(仮) http://www.moonmile.net/blog/?p=208 の続き

PDAがクライアント、PCがサーバーのパターンとして、PDAからPCをリモコン操作することを考える。つまりは、クラサバを作ってやれば良いわけで、作ってみたのがこれ。

09-06-01_11-07

09-06-01_11-08

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接続を確認していたのだが、

「エミュレータのネットワークを有効にする」

ことを忘れて、半刻ほど悶絶。

[ファイル]→[構成]で「エミュレータのプロパティ」を開いて「ネットワーク」タブで、ネットワークアダプタを有効にしないといけない。

09-05-28_11-202

後、エミュレータで直接Socketを使うと非常に遅い。Connect時にハングアップしたんじゃないかというほど遅く、1分ほどかかる。これは実機のPDAでやるとすんなり繋がるので、エミュレータの問題かな?

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

カテゴリー: PDA パーマリンク