1. 程式人生 > >ESP8266 WIFI模組學習之路(7)——自寫Android手機APP接受微控制器資料

ESP8266 WIFI模組學習之路(7)——自寫Android手機APP接受微控制器資料

上一篇是寫關於自寫Android手機APP給微控制器下發資料的,這次我將寫一下APP如何接受微控制器資料。

其實使用除錯助手,或者別人開的的APP同樣能夠實現接受微控制器資料,但想學習的,我還是建議能夠自己寫一個Android軟體,這樣從底層到上層都能學到很多東西。

APP頁面如圖:

硬體連線如圖:

微控制器的硬體程式碼:

if(0 == P32)    //  通過串列埠給手機發送字串   wantin
        {
            ms_delay(400);
            if(0 == P32)
            {
                ES = 0;
            	TI = 1; 
            	printf("AT+CIPSEND=?\r\n");
            	LED();
            	ms_delay(1000) ;
                printf("AT+CIPSEND=0,10\r\n");
            	LED();
            	ms_delay(1000) ;
                printf("wangting\r\n");
            	LED(); 
            	ms_delay(1000) ;
            	LED();
            	ms_delay(1000) ;
            	LED();
            	ms_delay(1000) ;
            	while(!TI);
            	TI = 0;
            	ES = 1;
            }
            while(0 == P32);
        } 

我這裡只貼了串列埠傳送的程式碼,它的資料是通過按鍵進行傳送的,以前的文章也有寫到。上發的內容為wangting.

app程式碼部分:

package com.open_open_wt.myapplication;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private ConnectThread mConnectThread;
    private Socket mSocket;
    private EditText mEIP;
    private EditText mEPort;
    private String mStrIP;
    private int miPort;
    private Button mBtnConn;
    private Button mBtnRecData;
    private TextView mtvRec;
    private String line;
    private String mstr;
    private int flag=1;
    BufferedReader br;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mEIP=(EditText)findViewById(R.id.eTIP);
        mEPort=(EditText)findViewById(R.id.eTPort);
        mBtnConn=(Button)findViewById(R.id.btConn);
        mBtnRecData=(Button)findViewById(R.id.bRecData);
        mtvRec=(TextView)findViewById(R.id.tVRecData);
        mBtnConn.setOnClickListener(this);
        mBtnRecData.setOnClickListener(this);

    }
    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btConn:
                //  連線
                if(mSocket == null || !mSocket.isConnected()){
                    mStrIP=mEIP.getText().toString();
                    miPort=Integer.valueOf(mEPort.getText().toString());
                    mConnectThread=new ConnectThread(mStrIP,miPort);
                    mConnectThread.start();
                }
                if(mSocket != null && mSocket.isConnected()){
                    try {
                        mSocket.close();
                        mSocket=null;
                        mBtnConn.setText("連線");
                        Toast.makeText(MainActivity.this,"連線斷開",Toast.LENGTH_LONG).show();
                    }catch (IOException e){
                        e.printStackTrace();
                    }
                }
                break;
            case R.id.bRecData:
                if(mSocket != null && mSocket.isConnected()){
                    if(flag==1){
                        Toast.makeText(MainActivity.this,"開始接受資料",Toast.LENGTH_LONG).show();
                        mBtnRecData.setText("Doing recDta");
                        GetTCPstring();
                        flag=(-1)*flag;
                    }
                    else{
                        Toast.makeText(MainActivity.this,"停止接受資料",Toast.LENGTH_LONG).show();
                        mBtnRecData.setText("RecData");
                        try {
                            mSocket.getInputStream().close();
                        } catch (IOException e) {
                            e.printStackTrace();
                            Toast.makeText(MainActivity.this,"停止接受資料失敗",Toast.LENGTH_LONG).show();
                        }
                        flag=(-1)*flag;
                    }

                }
                else{
                    mBtnRecData.setText("RecData");
                    Toast.makeText(MainActivity.this,"開始接受資料失敗",Toast.LENGTH_LONG).show();
                }

                break;

        }

    }

    private void GetTCPstring(){
        new Thread(){
            public void run(){
                try{
                    char[] cbuf=new char[10];
                    br=new BufferedReader(new InputStreamReader(mSocket.getInputStream()));
                    while (true){
                        if(br.ready()){
                            br.read(cbuf,0,10);
                            line=String.valueOf(cbuf);
                            handler.sendMessage(handler.obtainMessage());
                        }
                    }
            }catch(IOException e){
                    e.printStackTrace();
                    Toast.makeText(MainActivity.this,"接受資料失敗",Toast.LENGTH_LONG).show();

                }
        }
        }.start();
    }

    //  訊息控制代碼
    private Handler handler=new Handler(){
      public void handleMessage(Message msg){
          super.handleMessage(msg);
          mstr+=line;
          if(mstr.length()>500){
              mstr="";
          }
          mtvRec.setText(mstr);

      }
    };

    private class ConnectThread extends Thread{
        private String ip;
        private int port;

        public ConnectThread(String ip,int port){
            this.ip=ip;
            this.port=port;
        }
        @Override
        public void run(){
            try {
                mSocket=new Socket(ip,port);
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mBtnConn.setText("斷開");
                        Toast.makeText(MainActivity.this,"連線成功",Toast.LENGTH_LONG).show();
                    }
                });

            }catch (IOException e){
                e.printStackTrace();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this,"連線失敗",Toast.LENGTH_LONG).show();
                    }
                });
            }
        }
    }
}

剛開始學習Android程式碼,寫的邏輯一定有問題,因為我測試了一下,會有閃退問題,但功能是能用的。手機連線到WIFI模組的WIFI上,然後開啟我編寫的APP——連線——接收資料按鈕按下,接收的資料如圖:

能夠正確接收資料了,這就說明,手機基本能正確接收微控制器上發的資料了,後期還需要不斷的研究與深化。