主要通过连接socket通信方式,实现向下位通信,只要输入正确IP地址和端口号,即可进行与下位机的通信,通过发送相关指令来控制单片机耳朵执行动作。
Android通过wifi链接智能摄像头来监控,通过wifi和门禁摄像头链接


package com.example.sarthome;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.StrictMode;
import android.text.method.ScrollingMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class LoginActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */
private Button startButton,curtainOnOffButton,curtainAddButtonClient,curtainSubButtonClient,autoButtonClient;
private Button fanOnOffButton,fanAddButtonClient,fanSubButtonClient,lampOnOffButton,lampAddButtonClient,lampSubButtonClient;
private TextView recvDamp,recvTamp,recPm25,airLevel;
private Context mContext;
private boolean isConnecting = false;
private int mport;
private String ip;
private Thread mThreadClient = null;
private Thread mThreadServer = null;
private Socket mSocketServer = null;
private Socket mSocketClient = null;
static BufferedReader mBufferedReaderServer = null;
static PrintWriter mPrintWriterServer = null;
static BufferedReader mBufferedReaderClient = null;
static PrintWriter mPrintWriterClient = null;
private String recvMessageClient = "";
private String mistakeMessage = "";
private String[] fanOnOff=new String[] { "*", "**"};//风扇数组长度为2
private String[] lampOnOff=new String[] { "!", "!!"};//大灯数组长度为2
private String[] curtainOnOff=new String[] { "@", "@@"};//窗帘数组长度为2
private String[] autoArray=new String[] { "$", "$$"};//窗帘数组长度为2
private String[] fanAdd=new String[] { "*0", "*1", "*2", "*3", "*4", "*5", "*6", "*7", "*8", "*9", "*10"};//风扇加数组长度为11
private String[] fanSub=new String[] { "*0", "*1", "*2", "*3", "*4", "*5", "*6", "*7", "*8", "*9", "*10"};//风扇减数组长度为11
private String[] lampSub=new String[] { "!0", "!1", "!2", "!3", "!4", "!5", "!6", "!7", "!8", "!9", "!10"};//大灯减数组长度为11
private String[] lampAdd=new String[] { "!0", "!1", "!2", "!3", "!4", "!5", "!6", "!7", "!8", "!9", "!10"};//大灯加数组长度为11
private String[] curtainSub=new String[] { "@0", "@1", "@2", "@3", "@4", "@5", "@6", "@7", "@8", "@9", "@10"};//窗帘减数组长度为11
private String[] curtainAdd=new String[] { "@0", "@1", "@2", "@3", "@4", "@5", "@6", "@7", "@8", "@9", "@10"};//窗帘加数组长度为11
private EditText dialog_ip;
private EditText dialog_port;
private int mFlag=-1,mFlagOnOff=-1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
mContext = this;
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.penaltyLog()
.penaltyDeath()
.build());
InitView();//初始化个组件
startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Connection();//连接服务器
}
});
}
public void InitView(){
startButton= (Button)findViewById(R.id.StartConnect);
fanOnOffButton= (Button)findViewById(R.id.fan_on_off);
fanAddButtonClient=(Button)findViewById(R.id.fanadd);
fanSubButtonClient=(Button)findViewById(R.id.fansub);
lampOnOffButton=(Button)findViewById(R.id.lamp_on_off);
lampAddButtonClient=(Button)findViewById(R.id.lampadd);
lampSubButtonClient=(Button)findViewById(R.id.lampsub);
curtainOnOffButton=(Button)findViewById(R.id.curtain_on_off);
curtainAddButtonClient=(Button)findViewById(R.id.curtainadd);
curtainSubButtonClient=(Button)findViewById(R.id.curtainsub);
autoButtonClient=(Button)findViewById(R.id.auto);
fanOnOffButton.setOnClickListener(this);
fanAddButtonClient.setOnClickListener(this);
fanSubButtonClient.setOnClickListener(this);
lampOnOffButton.setOnClickListener(this);
lampAddButtonClient.setOnClickListener(this);
lampSubButtonClient.setOnClickListener(this);
curtainOnOffButton.setOnClickListener(this);
curtainAddButtonClient.setOnClickListener(this);
curtainSubButtonClient.setOnClickListener(this);
autoButtonClient.setOnClickListener(this);
airLevel=(TextView)findViewById(R.id.airlevel);
recvDamp= (TextView)findViewById(R.id.Recdamp);
recvDamp.setMovementMethod(ScrollingMovementMethod.getInstance());
recvTamp= (TextView)findViewById(R.id.Rectemp);
recvTamp.setMovementMethod(ScrollingMovementMethod.getInstance());
recPm25= (TextView)findViewById(R.id.Recpm25);
recPm25.setMovementMethod(ScrollingMovementMethod.getInstance());
}
/*
* 连接服务我
*/
public void Connection(){
try
{
if (isConnecting)
{
isConnecting = false;
try {
if(mSocketClient!=null)
{
mSocketClient.close();
mSocketClient = null;
mPrintWriterClient.close();
mPrintWriterClient = null;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mThreadClient.interrupt();
startButton.setText("连接");
}
else
{
isConnecting = true;
DialogIpPort();
}
}catch(Exception e)
{
Toast.makeText(mContext, "网络连接异常:" e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
//事件监听
public void onClick(View v)
{
if(isConnecting&&mSocketClient!=null){
try{
switch(v.getId()){
case R.id.fan_on_off:
mFlagOnOff();
mPrintWriterClient.print(fanOnOff[mFlagOnOff]);//发送给服务器
mPrintWriterClient.flush(); //清除缓存,并释放数据
break;
case R.id.fanadd:
mFlagAdd();
mPrintWriterClient.print(fanAdd[mFlag]);//发送给服务器
mPrintWriterClient.flush();
break;
case R.id.fansub:
mFlagSub();
mPrintWriterClient.print(fanSub[mFlag]);//发送给服务器
mPrintWriterClient.flush();
break;
case R.id.lamp_on_off:
mFlagOnOff();
mPrintWriterClient.print(lampOnOff[mFlagOnOff]);//发送给服务器
mPrintWriterClient.flush();
break;
case R.id.lampadd:
mFlagAdd();
mPrintWriterClient.print(lampAdd[mFlag]);
mPrintWriterClient.flush();
break;
case R.id.lampsub:
mFlagSub();
mPrintWriterClient.print(lampSub[mFlag]);
mPrintWriterClient.flush();
break;
case R.id.curtain_on_off:
mFlagOnOff();
mPrintWriterClient.print(curtainOnOff[mFlagOnOff]);
mPrintWriterClient.flush();
break;
case R.id.curtainadd:
mFlagAdd();
mPrintWriterClient.print(curtainAdd[mFlag]);
mPrintWriterClient.flush();
break;
case R.id.curtainsub:
mFlagSub();
mPrintWriterClient.print(curtainSub[mFlag]);
mPrintWriterClient.flush();
break;
case R.id.auto:
mFlagOnOff();
mPrintWriterClient.print(autoArray[mFlagOnOff]);//发送给服务器
mPrintWriterClient.flush();
default:
break;
}
}catch(Exception e){
Toast.makeText(mContext, "发送异常:" e.getMessage(), Toast.LENGTH_SHORT).show();
}
}else{
Toast.makeText(mContext, "没有连接相应的服务器", Toast.LENGTH_SHORT).show();
}
}
/*
* 减标志
*/
protected void mFlagSub(){
if(mFlag>=0){
mFlag=-1 mFlag;
}
if(mFlag==10){
mFlag=-2 mFlag;
}
if(mFlag<0){
mFlag=0;
}
}
/*
* 加标志
*/
protected void mFlagAdd(){
if(mFlag<10){
mFlag=1 mFlag;
}
}
/*
* 开关标志
*/
protected void mFlagOnOff(){
if(mFlagOnOff<1){
mFlagOnOff=1 mFlagOnOff;
}
else
{
mFlagOnOff=0;
}
}
/*
* 端口和IP地址输入对话框
*/
public void DialogIpPort(){
LayoutInflater inflater=getLayoutInflater();
View login_dialog = inflater.inflate(R.layout.dialog,(ViewGroup)findViewById(R.id.dialog));
dialog_ip=(EditText)login_dialog.findViewById(R.id.dialog_ip);
dialog_port=(EditText)login_dialog.findViewById(R.id.dialog_port);
new AlertDialog.Builder(this).setTitle("请输入正确的IP地址和端口号").setView(login_dialog).
setPositiveButton("连接",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
try{
ip=dialog_ip.getText().toString();
mport=Integer.parseInt(dialog_port.getText().toString());
mThreadClient = new Thread(mRunnable);
mThreadClient.start();
startButton.setText("断开");
}catch(Exception e){
Toast.makeText(mContext, "网络连接异常:" e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
}).setNegativeButton("取消",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
startButton.setText("连接");
}
}).show();
}
//线程:监听服务器发来的消息
private Runnable mRunnable = new Runnable()
{
public void run()
{
try
{
//连接服务器
mSocketClient = new Socket(ip, mport); //portnum
//取得输入、输出流
mBufferedReaderClient = new BufferedReader(new InputStreamReader(mSocketClient.getInputStream()));
mPrintWriterClient = new PrintWriter(mSocketClient.getOutputStream(), true);
mistakeMessage = "已经连接server!";//消息换行
Message msg = new Message();
msg.what = 0;
mHandler.sendMessage(msg);
//break;
}
catch (Exception e)
{
mistakeMessage = "连接IP异常:" e.toString() e.getMessage() "\n";//消息换行
Message msg = new Message();
msg.what = 1;
mHandler.sendMessage(msg);
return;
}
setRecvMessage();
}
};
/*
* 接受消息机制
*/
public void setRecvMessage(){
char[] buffer = new char[256];
int count = 0;
while (isConnecting)
{
try
{
if((count = mBufferedReaderClient.read(buffer))>0)
{
recvMessageClient = getInfoBuff(buffer, count);//将接受的数据存入数组
Message msg = new Message();
msg.what = 1;
mHandler.sendMessage(msg);
}
}
catch (Exception e)
{
mistakeMessage = "接收异常:" e.getMessage() "\n";//消息换行
Message msg = new Message();
msg.what = 0;
mHandler.sendMessage(msg);
}
}
}
Handler mHandler = new Handler()
{
public void handleMessage(Message msg)
{
String[] string={"优","良","差"};
super.handleMessage(msg);
if(msg.what == 0)
{
Toast.makeText(LoginActivity.this,mistakeMessage,Toast.LENGTH_SHORT).show();//刷新消息机制
}
else if(msg.what == 1)
{
try
{
String[] result = recvMessageClient.split("\\*");
recvTamp.setText(result[0]);
recvDamp.setText(result[1]); // 刷新
recPm25.setText(result[2]);
if((0<=Integer.parseInt(result[2]))&&(35>=Integer.parseInt(result[2]))){
airLevel.setTextColor(android.graphics.Color.GREEN);//设置text的颜色
airLevel.setText(string[0]);
}else if((36<=Integer.parseInt(result[2]))&&(75>=Integer.parseInt(result[2]))){
airLevel.setTextColor(0xff99cc33);
airLevel.setText(string[1]);
}else{
airLevel.setTextColor(0xff663300);
airLevel.setText(string[2]);
}
}catch(Exception e)
{
Toast.makeText(LoginActivity.this,"无法获取数据,检查网络是否连接!",Toast.LENGTH_SHORT).show();//刷新消息机制
}
}
}
};
//创建服务端ServerSocket对象
private ServerSocket serverSocket = null;
private boolean serverRuning = false;
private String getInfoBuff(char[] buff, int count)
{
char[] temp = new char[count];
for(int i=0; i<count; i )
{
temp[i] = buff[i];
}
return new String(temp);
}
public void onDestroy() {
super.onDestroy();
if (isConnecting)
{
isConnecting = false;
try {
if(mSocketClient!=null)
{
mSocketClient.close();
mSocketClient = null;
mPrintWriterClient.close();
mPrintWriterClient = null;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mThreadClient.interrupt();
}
if (serverRuning)
{
serverRuning = false;
try {
if(serverSocket!=null)
{
serverSocket.close();
serverSocket = null;
}
if(mSocketServer!=null)
{
mSocketServer.close();
mSocketServer = null;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mThreadServer.interrupt();
}
}
}
资源文件列表
SartHome/.classpath , 475
SartHome/.project , 844
SartHome/.settings/org.eclipse.jdt.core.prefs , 177
SartHome/AndroidManifest.xml , 1308
SartHome/bin/AndroidManifest.xml , 1308
SartHome/bin/classes.dex , 704624
SartHome/bin/classes/com/example/sarthome/BuildConfig.class , 349
SartHome/bin/classes/com/example/sarthome/LoginActivity$1.class , 2318
SartHome/bin/classes/com/example/sarthome/LoginActivity$2.class , 2007
SartHome/bin/classes/com/example/sarthome/LoginActivity$3.class , 822
SartHome/bin/classes/com/example/sarthome/LoginActivity$4.class , 2486
SartHome/bin/classes/com/example/sarthome/LoginActivity$5.class , 1036
SartHome/bin/classes/com/example/sarthome/LoginActivity$6.class , 1616
SartHome/bin/classes/com/example/sarthome/LoginActivity.class , 12509
SartHome/bin/classes/com/example/sarthome/R$attr.class , 346
SartHome/bin/classes/com/example/sarthome/R$dimen.class , 467
SartHome/bin/classes/com/example/sarthome/R$drawable.class , 529
SartHome/bin/classes/com/example/sarthome/R$id.class , 1968
SartHome/bin/classes/com/example/sarthome/R$layout.class , 440
SartHome/bin/classes/com/example/sarthome/R$menu.class , 394
SartHome/bin/classes/com/example/sarthome/R$string.class , 1231
SartHome/bin/classes/com/example/sarthome/R$style.class , 468
SartHome/bin/classes/com/example/sarthome/R.class , 693
SartHome/bin/dexedLibs/android-support-v4-46b7cb9590026c97f0036d806e0c4924.jar , 232610
SartHome/bin/jarlist.cache , 120
SartHome/bin/resources.ap_ , 281269
SartHome/bin/res/crunch/drawable-hdpi/ic_launcher.png , 5964
SartHome/bin/res/crunch/drawable-mdpi/ic_launcher.png , 3112
SartHome/bin/res/crunch/drawable-xhdpi/ic_launcher.png , 9355
SartHome/bin/res/crunch/drawable-xxhdpi/ic_launcher.png , 17889
SartHome/bin/SartHome.apk , 524417
SartHome/gen/com/example/sarthome/BuildConfig.java , 162
SartHome/gen/com/example/sarthome/R.java , 6689
SartHome/ic_launcher-web.png , 51394
SartHome/libs/android-support-v4.jar , 621451
SartHome/proguard-project.txt , 781
SartHome/project.properties , 563
SartHome/res/drawable-hdpi/back.jpg , 68210
SartHome/res/drawable-hdpi/backgroud.jpg , 45015
SartHome/res/drawable-hdpi/blue.jpg , 120831
SartHome/res/drawable-hdpi/btn.xml , 430
SartHome/res/drawable-hdpi/ic_launcher.png , 7658
SartHome/res/drawable-mdpi/ic_launcher.png , 3777
SartHome/res/drawable-xhdpi/ic_launcher.png , 12516
SartHome/res/drawable-xxhdpi/ic_launcher.png , 24777
SartHome/res/layout/activity_login.xml , 12795
SartHome/res/layout/dialog.xml , 1450
SartHome/res/menu/main.xml , 1464
SartHome/res/values-sw600dp/dimens.xml , 203
SartHome/res/values-sw720dp-land/dimens.xml , 277
SartHome/res/values-v11/styles.xml , 334
SartHome/res/values-v14/styles.xml , 391
SartHome/res/values/dimens.xml , 220
SartHome/res/values/strings.xml , 1237
SartHome/res/values/styles.xml , 790
SartHome/src/com/example/sarthome/LoginActivity.java , 14415
