实例介绍
【实例简介】
主要通过连接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();
}
}
}
标签: 智能家居
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论