因为一大堆同学大创结不了题,求我帮忙,所以这两天一直怼app控制硬件.今天是wifi.
思路还是比较简单的.无非建立通讯流,然后交换信息,通讯方法都差不多.
界面
大体思路
如上图
一共只有3个类,一个通讯类,一个活动,一个广播.
WIFI通信
通讯类思路是通过 new Socket("192.168.4.1",5000);
建立通讯,两个形参,第一个是host,第二个是端口.
然后output = new PrintStream(socket.getOutputStream(),true,"gbk");
来建立输入流.
new BufferedInputStream(socket.getInputStream())
可以获得输出流,接受信息
通过output.print()就可以发送信息,.
UI
UI主要还是通过 Handler 和 localBroadCast进行交互.下次用 AsyncTask来玩吧.
曲线图还是使用的框架.
源码 :https://github.com/QQ951127336/Wifi_humidifier_controuler
贴代码了
MainActivity
package com.tree.max.humidifier;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Color;
import android.graphics.PointF;
import android.net.wifi.p2p.WifiP2pManager;
import android.os.Handler;
import android.os.Message;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.ToggleButton;
import com.idtk.smallchart.chart.LineChart;
import com.idtk.smallchart.data.LineData;
import com.idtk.smallchart.interfaces.iData.ILineData;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
final int HUMIDIFIER = 1;//用于handler判断
//绘图曲线图
LineChart lineChart;
LineData lineData;
ArrayList<ILineData> dataList;
ArrayList<PointF> linePointList ;
PointF pointF;
//坐标
int[] x = new int[12];
int[] y = new int[12];
//本地广播 控制UI
LocalReceiver localReceiver;
//监听WIFI状态
WifiP2pManager mManager;
WifiP2pManager.Channel mChannel;
BroadcastReceiver mReceiver;
IntentFilter mIntentFilter;
//布局控件
Button connectButton;
Button autoButton;
Button handButton;
TextView current_humidifier;
TextView aim_humidifier;
EditText input_humidifier ;
ToggleButton stateButton ;
//通讯线程
AcceptThread acceptThread;
//接受到的信息
static String number = "" ;
//判断是否已连接
private boolean isConnecting= false;
//显示数据 ,更新曲线图
final Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg) {
switch (msg.what)
{
case HUMIDIFIER:
current_humidifier.setText("当前湿度:"+number);
lineChart.invalidate();
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
acceptThread = new AcceptThread(MainActivity.this);
init();//初始化
MainOnClickListener mainOnClickListener = new MainOnClickListener();
connectButton.setOnClickListener(mainOnClickListener);
autoButton.setOnClickListener(mainOnClickListener);
handButton.setOnClickListener(mainOnClickListener);
for (int i = 1;i<=9;i++)
{
y[i-1] = y[i];
}
y[0] = 100;
y[1] = 0;
linePointList.clear();
for (int i = 0 ; i<=10;i++)
{
linePointList.add(new PointF(x[i],y[i]));
}
lineData.setValue(linePointList);
dataList.clear();
dataList.add(lineData);
lineData.setColor(Color.CYAN);
lineData.setPaintWidth(1);
lineData.setTextSize(4);
lineChart.isAnimated = false;
lineChart.setDataList(dataList);
}
@Override
protected void onResume() {
super.onResume();
registerReceiver(mReceiver,mIntentFilter);//注册广播
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("IVE_LOCAL_BROAD_RECECHANGED");//本地UI线程广播
localReceiver= new LocalReceiver();
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
localBroadcastManager.registerReceiver(localReceiver,intentFilter);
}
@Override
protected void onPause(){
super.onPause();
unregisterReceiver(mReceiver);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(localReceiver);
}
public void init()
{
lineChart = (LineChart)findViewById(R.id.times_data_view);
lineData = new LineData();
linePointList = new ArrayList<>();
dataList = new ArrayList<>();
for (int j= 0; j<12;j++)
{
x[j] = (j-2);
}
x[1] = 0;
x[0] = 0;
x[2] = 0;
for (int j =2;j<12;j++)
{
x[j] +=0.2*(j-1);
}
for (int j =3 ;j<12;j++)
{
x[j] += (j-2)*0.1;
}
connectButton = (Button)findViewById(R.id.connectButton);
autoButton = (Button)findViewById(R.id.autoButton);
handButton = (Button)findViewById(R.id.handButton);
//监听wifi状态
mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
mChannel = mManager.initialize(this, getMainLooper(), null);
mReceiver = new WifiBroadcastReceiver(mManager, mChannel, this);
mIntentFilter = new IntentFilter();
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
aim_humidifier = (TextView)findViewById(R.id.aim_humidifier);
current_humidifier = (TextView)findViewById(R.id.current_humidifier);
stateButton = (ToggleButton)findViewById(R.id.stateButton);
input_humidifier = new EditText(this);
}
class MainOnClickListener implements View.OnClickListener
{
@Override
public void onClick(View view) {
switch (view.getId())
{
case R.id.connectButton:
if (isConnecting)
{
isConnecting = false;
if (acceptThread.isAlive())
acceptThread.interrupt();
Log.e("Main","connectButton is touched");
connectButton.setText("连接仪器");
}
else
{
isConnecting = true;
connectButton.setText("断开连接");
if (acceptThread.isAlive())
acceptThread.interrupt();
acceptThread.start();
}
break;
case R.id.autoButton:
aim_humidifier.setText("设置湿度:60");
if (acceptThread.isAlive())
acceptThread.interrupt();
acceptThread = new AcceptThread(60);
acceptThread.start();
break;
case R.id.handButton:
new AlertDialog.Builder(MainActivity.this).setTitle("设置湿度")
.setView(input_humidifier = new EditText(MainActivity.this)).setPositiveButton("确定",onClickListener)
.setNegativeButton("取消",null)
.show();
break;
case R.id.stateButton:
if (stateButton.isChecked())
{
if (acceptThread.isAlive())
{
acceptThread.interrupt();
}
acceptThread = new AcceptThread("@CH1",1);
acceptThread.start();
}
else
{
if (acceptThread.isAlive())
{
acceptThread.interrupt();
}
acceptThread = new AcceptThread("@CH0",1);
acceptThread.start();
}
break;
}
}
}
DialogInterface.OnClickListener onClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
String input =input_humidifier.getText().toString();
aim_humidifier.setText("设置湿度:"+input);
if (acceptThread.isAlive())
acceptThread.interrupt();
acceptThread = new AcceptThread(Integer.valueOf(input));
acceptThread.start();
}
};
private class LocalReceiver extends BroadcastReceiver{
Bundle bundle;
@Override
public void onReceive(Context context, Intent intent) {
switch(intent.getAction())
{
case "IVE_LOCAL_BROAD_RECECHANGED":
Message msg = new Message();
bundle = intent.getExtras();
number = bundle.getString("humidifier");
msg.what = HUMIDIFIER;
for (int i = 3;i<=10;i++)
{
y[i-1] = y[i];
}
y[10] = Integer.valueOf(number);
linePointList.clear();
for (int i = 0 ; i<11;i++)
{
pointF = new PointF(x[i],y[i]);
linePointList.add(pointF);
}
handler.sendMessage(msg);
break;
}
}
}
}
AcceptThread
package com.tree.max.humidifier;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Message;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.PrivateKey;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by max on 17-5-20.
*/
public class AcceptThread extends Thread {
private PrintStream output;
private BufferedInputStream bufferedInputStream;
private Socket socket;
Bundle bundle;
LocalBroadcastManager localBroadcastManager;
Intent intent = new Intent("IVE_LOCAL_BROAD_RECECHANGED");
String patter = "(\\d+)";
Pattern r = Pattern.compile(patter);
Matcher matcher;
int relay = 0;
String relay_state = "";
int aim_humidifier = 0;
int humidifier_setting = 0;
public AcceptThread(Context context) {
localBroadcastManager = LocalBroadcastManager.getInstance(context);
bundle = new Bundle();
}
public AcceptThread(String s, int i) {
relay = i;
relay_state =s ;
}
public AcceptThread(int i) {
aim_humidifier = i;
humidifier_setting = 1;
}
@Override
public void run() {
initClientSocket();
String receive;
while (true)
{
byte[] data = receiveData();
if (data.length>1)
{
receive = new String(data);
matcher =r.matcher(receive);
if (matcher.find())
receive = matcher.group(1);
else
receive = "-1";
if (receive.startsWith("0"))
receive = receive.substring(1);
bundle = new Bundle();
bundle.putString("humidifier",receive);
intent.putExtras(bundle);
localBroadcastManager.sendBroadcast(intent);
}
}
}
public void initClientSocket(){
try{
socket = new Socket("192.168.4.1",5000);
output = new PrintStream(socket.getOutputStream(),true,"gbk");
} catch (UnknownHostException e) {
Log.e("init","host wrong");
e.printStackTrace();
} catch (IOException e) {
Log.e("init","IO");
e.printStackTrace();
}
if (relay==1)
{
sendMessage();
relay = 0;
}
if (humidifier_setting == 1)
{
output.print(aim_humidifier);
humidifier_setting = 0;
}
}
private void sendMessage()
{
output.print(relay_state);
}
public byte[] receiveData(){
if (socket == null || socket.isClosed()){
try{
socket = new Socket("192.168.4.1",5000);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
byte[] buffer =new byte[254];
int length;
if (socket.isConnected())
{
try{
bufferedInputStream = new BufferedInputStream(socket.getInputStream());
length = bufferedInputStream.read(buffer);
} catch (IOException e) {
e.printStackTrace();
}
}
else
{
buffer = new byte[1];
}
return buffer;
}
}
WifiBroad
package com.tree.max.humidifier;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.p2p.WifiP2pManager;
import android.util.Log;
import android.widget.Toast;
/**
* Created by max on 17-5-20.
*/
public class WifiBroadcastReceiver extends BroadcastReceiver {
private WifiP2pManager mManager;
private WifiP2pManager.Channel mChannel;
private MainActivity mainActivity;
public WifiBroadcastReceiver(WifiP2pManager mManager, WifiP2pManager.Channel channel,MainActivity mainActivity)
{
this.mainActivity = mainActivity;
this.mChannel = channel;
this.mManager = mManager;
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);
if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
Toast.makeText(mainActivity,"WIFI已打开",Toast.LENGTH_LONG).show();
} else {
Toast.makeText(mainActivity,"WIFI已关闭",Toast.LENGTH_LONG).show();
}
} else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
// Call WifiP2pManager.requestPeers() to get a list of current peers
} else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
// Respond to new connection or disconnections
} else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
// Respond to this device's wifi state changing
}
}
}