WIFI android控制加湿器助手(附详解+源码)

因为一大堆同学大创结不了题,求我帮忙,所以这两天一直怼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
        }

    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值