無線感測網路協定與應用(3) - Android應用程式

上一篇文章中,我們實作了從com port讀取資料,並開啟server供client端連線,並將值傳入所有的client端中。
本小專題主要目的即為讓使用者在外也可以靠手機取得家中電器的狀態,甚至達到控制的效果。

本篇文章則實作了android的Server&client的程式。

這程式並非我自己撰寫了,是課程中學長所提供,所以Server端有些不清楚怎麼使用...不過經過測試確定可以利用本程式達到與前篇文章所實作的程式做整合,並取得arduino的值。

使用方法在 無線感測網路協定與應用(1)



以下為實作Android的程式:

package com.example.asda;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

 EditText ipText,portText,sendText;
 Button btnConnect,btnServerStart,btnSend;
 TextView tv;
 Socket client;
 int port;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  findviews();
 }
 public void findviews()
 {
  ipText=(EditText) findViewById(R.id.editText1);
  portText=(EditText) findViewById(R.id.editText2);
  sendText=(EditText) findViewById(R.id.editText3);
  btnConnect=(Button) findViewById(R.id.button1);
  btnConnect.setOnClickListener(listener);
  btnServerStart=(Button) findViewById(R.id.button2);
  btnServerStart.setOnClickListener(listener);
  btnSend=(Button) findViewById(R.id.button3);
  btnSend.setOnClickListener(listener);
  tv=(TextView) findViewById(R.id.textView3);
  tv.setText("");
 }

 OnClickListener listener = new OnClickListener() {

  @Override
  public void onClick(View v) {
   switch (v.getId()) {
   case R.id.button1:
    String ipaddress = ipText.getText().toString();
    port = Integer.parseInt(portText.getText().toString());
    new Thread(new ClientThread(ipaddress, port)).start();
    break;
   case R.id.button2:
    port = Integer.parseInt(portText.getText().toString());
    new Thread(new ServerThread(port)).start();
    break;
   case R.id.button3:
    try {
      OutputStreamWriter out = new OutputStreamWriter(
       client.getOutputStream());
      String text;
      text = sendText.getText().toString() + "\r\n";
      out.write(text);
      out.flush();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    break;
   }

  }
 };

 class ServerThread implements Runnable
 {
  ServerSocket ss;
  Socket client;
  int port;
  public ServerThread(int PORT)
  {
   port=PORT;
  }
  @Override
  public void run() {
   try {
    ss = new ServerSocket(port);
    tv.post(new Runnable() {
     @Override
     public void run() {
      tv.append("等待使用者連入...");

     }
    });
    client = ss.accept();
    tv.post(new Runnable() {
     @Override
     public void run() {
      tv.append("已經有使用者連入...");

     }
    });
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   // 讀入
   new Thread(new Runnable() {

    @Override
    public void run() {
     try {
      BufferedReader br = new BufferedReader(
        new InputStreamReader(client.getInputStream(),"UTF-8"));
      while (true) {
       final String text;
       text = br.readLine();
       tv.post(new Runnable() {
        @Override
        public void run() {
         tv.append(text);
        }
       });
      }
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }

    }
   });
  }
  
 }
 class ClientThread implements Runnable
 {
  String IPAddress;
  int PORT;
  BufferedReader br;
  public ClientThread(String ipaddress,int port)
  {
   IPAddress=ipaddress;
   PORT=port;
  }

  @Override
  public void run() {
   try {
    client = new Socket(IPAddress, PORT);
   } catch (UnknownHostException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   new Thread(new Runnable() {

    @Override
    public void run() {
     try {
      br = new BufferedReader(
        new InputStreamReader(client.getInputStream(),
          "UTF-8"));
      while (true) {
       final String text;
       text = br.readLine();
       tv.post(new Runnable() {
        @Override
        public void run() {
         tv.setText(text.toCharArray(), 0, text.length());
        }
       });
      }
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }

    }
   }).start();
  }

 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }

}


APK下載:載點 (4.3)
                    載點 (4.0.1)  20140113補

因為在下本人小弟我的手機安卓版本比較舊...所以請朋友幫忙降版本了
這樣就不會出現剖析程式問題囉!

沒有留言:

張貼留言