6-51單片機ESP8266學習-AT指令(8266TCP服務器--做自己的AndroidTCP客戶端發信息給單片機控制小燈的亮滅)


http://www.cnblogs.com/yangfengwu/p/8776712.html

 

先把源碼和資料鏈接放到這里

鏈接: https://pan.baidu.com/s/1jpHZjW_7pQKNfN9G4B6ZjA     密碼:nhn3 

先做手機的,然后做C#的

詳細點的可以看我這篇文章,這篇文章會解決一些細節問題

http://www.cnblogs.com/yangfengwu/p/5212570.html

咱們不做很復雜的直接越簡單越好,就做成這樣

先編譯一下

 

 

不用管,后期的話咱會用一下

 

 

最后做成這樣子

 

 

發現還是有點大..

把像素低的放到像素高的里面圖片顯示出來會縮小,把像素高的放到像素低的里面圖片顯示出來會放大

 

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        imageViewLamp = (ImageView) findViewById(R.id.imageView1);
        switchLamp = (Switch) findViewById(R.id.switch1);
        switchLamp.setOnCheckedChangeListener(switchLamplistener);//設置SWITCH的狀態改變事件
    }
    private OnCheckedChangeListener switchLamplistener = new OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // TODO Auto-generated method stub
//            Toast.makeText(getApplicationContext(), isChecked+"", 500).show();
            if (isChecked) {//切換圖片
                imageViewLamp.setImageResource(R.drawable.ledon);
            }
            else {
                imageViewLamp.setImageResource(R.drawable.ledoff);
            }
        }
    };

現在做點擊連接按鈕就連接服務器

 

 有點迫不及待的想試一試騰訊雲了,

下面做的是:點擊連接按鈕,連接TCP服務器,連接上以后啟動數據接收任務,因為數據接收任務可以判斷是不是和服務器斷開了連接

然后按鈕顯示"斷開",如果意外斷開了連接也顯示斷開....

public class MainActivity extends Activity {

    ImageView imageViewLamp;//燈的圖片
    Switch switchLamp;//燈的控制開關
    EditText editTextIPAdress,editTextPort;//ip地址和端口號的編輯框
    Button buttonConnect;//連接按鈕
    Socket socket;//cocket
    boolean ConnectFlage = false;//連接標志,控制按鈕顯示連接和斷開
    ThreadConnectService threadConnectService = new ThreadConnectService();//建立一個連接任務的變量
    InputStream inputStream;//獲取輸入流,可以用來判斷有沒有斷開連接
    ThreadReadData threadReadData = new ThreadReadData();//接收數據的任務的變量
    boolean threadReadDataFlage = false;//接收數據任務一直運行控制
    byte[] ReadBuffer = new byte[1024];//存儲接收到的數據
    int ReadBufferLengh = 0;//接收到的數據個數
     
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        editTextIPAdress = (EditText) findViewById(R.id.editText1);
        editTextPort = (EditText) findViewById(R.id.editText2);
        buttonConnect = (Button) findViewById(R.id.button1);
        buttonConnect.setOnClickListener(buttonConnectClick);
        
        imageViewLamp = (ImageView) findViewById(R.id.imageView1);
        switchLamp = (Switch) findViewById(R.id.switch1);
        switchLamp.setOnCheckedChangeListener(switchLamplistener);
    }
    /*指示燈控制開關*/
    private OnCheckedChangeListener switchLamplistener = new OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                imageViewLamp.setImageResource(R.drawable.ledon);
            }
            else {
                imageViewLamp.setImageResource(R.drawable.ledoff);
            }
        }
    };
    
    /*按鈕點擊連接事件*/
    private OnClickListener buttonConnectClick = new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (ConnectFlage) 
            {
                try {
                    threadConnectService.start();//啟動連接任務
                }
                catch (Exception e) //預防任務還沒關閉呢又點擊開始
                {
                    threadConnectService.run();
                }
            }
            else 
            {
                ConnectFlage = true;
                buttonConnect.setText("連接");
                try 
                {
                    socket.close();//關閉socket
                    inputStream.close();//關閉數據流
                } catch (Exception e) {
                    // TODO: handle exception
                }
            }
        }
    };
    
    /**
     * 連接服務器的任務
     * @author yang
     *
     */
    class ThreadConnectService extends Thread
    {
        public void run()
        {
            InetAddress ipAddress;
            try 
            {
                ipAddress = InetAddress.getByName(editTextIPAdress.getText().toString());//獲取IP地址
                int port =Integer.valueOf(editTextPort.getText().toString());//獲取端口號 
                socket = new Socket(ipAddress, port);//創建連接地址和端口
                inputStream = socket.getInputStream();//獲得通道的數據流變量
                threadReadDataFlage = true;//一直接收數據
                try 
                {
                    threadReadData.start();
                }
                catch (Exception e) {//預防任務還沒關閉呢又點擊開始
                    threadReadData.run();
                }
                
                runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,這里力求簡單,下幾節再用
                    public void run() {
                        ConnectFlage = false;
                        buttonConnect.setText("斷開");
                        Toast.makeText(getApplicationContext(), "連接成功", 500).show();
                    }
                });
            } 
            catch (Exception e) 
            {
                e.printStackTrace();
            }
        }
    }
    
    /**
     * 接收數據的任務
     * @author yang
     *
     */
    class ThreadReadData extends Thread
    {
        public void run()
        {
            while (threadReadDataFlage)
            {
                try 
                {
                    ReadBufferLengh = inputStream.read(ReadBuffer);//服務器斷開會返回-1
                    if (ReadBufferLengh == -1) {
                        threadReadDataFlage = false;
                        runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,這里力求簡單,下幾節再用
                            public void run() {
                                ConnectFlage = true;
                                buttonConnect.setText("連接");
                                Toast.makeText(getApplicationContext(), "與服務器斷開連接", 500).show();
                            }
                        });
                    }
                } 
                catch (Exception e) 
                {
                    // TODO Auto-generated catch block
                    Log.e("error", ReadBufferLengh+"");
                    e.printStackTrace();
                }
            }
        }
    }
    
    /** 當活動(界面)不再可見時調用 */
    @Override
    protected void onStop() 
    {
        threadReadDataFlage = false;//結束接收數據任務
        super.onStop();
    }
    
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

 

  

 

 忘了說一件事情....加權限

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.yfw456.tcpclientdemo"
    android:versionCode="1"
    android:versionName="1.0" >

    <!--     獲取手機信息權限 -->  
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission>"
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>  
    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
     <uses-permission android:name="android.permission.WAKE_LOCK"/>
     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
     <uses-permission android:name="android.permission.VIBRATE" />
     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
     <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE">
     </uses-permission>
     <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    
    <uses-sdk
        android:minSdkVersion="17"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

我把上面做的打包了

 

 

 

 好現在接着寫發數據(控制燈的亮滅)

public class MainActivity extends Activity {

    ImageView imageViewLamp;//燈的圖片
    Switch switchLamp;//燈的控制開關
    EditText editTextIPAdress,editTextPort;//ip地址和端口號的編輯框
    Button buttonConnect;//連接按鈕
    Socket socket;//cocket
    boolean ConnectFlage = true;//連接標志,控制按鈕顯示連接和斷開
    ThreadConnectService threadConnectService = new ThreadConnectService();//建立一個連接任務的變量
    InputStream inputStream;//獲取輸入流,可以用來判斷有沒有斷開連接
    OutputStream outputStream;//獲得輸出流
    ThreadReadData threadReadData = new ThreadReadData();//接收數據的任務
    ThreadSendData threadSendData = new ThreadSendData();//發送數據的任務
    boolean threadReadDataFlage = false;//接收數據任務一直運行控制
    boolean threadSendDataFlage = false;//接收數據任務一直運行控制
    byte[] ReadBuffer = new byte[1024];//存儲接收到的數據
    byte[] SendBuffer = new byte[1024];//存儲發送的數據
    int ReadBufferLengh = 0;
        
    int SendDataCnt = 0;//控制發送數據的個數
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        editTextIPAdress = (EditText) findViewById(R.id.editText1);
        editTextPort = (EditText) findViewById(R.id.editText2);
        buttonConnect = (Button) findViewById(R.id.button1);
        buttonConnect.setOnClickListener(buttonConnectClick);
        
        imageViewLamp = (ImageView) findViewById(R.id.imageView1);
        switchLamp = (Switch) findViewById(R.id.switch1);
        switchLamp.setOnCheckedChangeListener(switchLamplistener);
    }
    /*指示燈控制開關*/
    private OnCheckedChangeListener switchLamplistener = new OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            
            if (isChecked) {
                imageViewLamp.setImageResource(R.drawable.ledon);
                SendBuffer[0] = (byte) 0xaa;
                SendBuffer[1] = 0x55;
                SendBuffer[2] = 0x02;
                SendBuffer[3] = (byte) 0xff;
            }
            else {
                imageViewLamp.setImageResource(R.drawable.ledoff);
                SendBuffer[0] = (byte) 0xaa;
                SendBuffer[1] = 0x55;
                SendBuffer[2] = 0x02;
                SendBuffer[3] = 0x00;
            }
            SendDataCnt = 4;//控制發送數據的個數
        }
    };
    
    /*按鈕點擊連接事件*/
    private OnClickListener buttonConnectClick = new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (ConnectFlage) 
            {
                try 
                {
                    threadConnectService.start();//啟動連接任務
                }
                catch (Exception e) //預防任務還沒關閉呢又點擊開始
                {
                    threadConnectService.run();
                }
            }
            else 
            {
                ConnectFlage = true;
                threadSendDataFlage = false;//關掉發送任務,預防產生多的任務
                threadReadDataFlage = false;//關掉接收任務,預防產生多的任務
                buttonConnect.setText("連接");
                try 
                {
                    socket.close();//關閉socket
                    inputStream.close();//關閉數據流
                } catch (Exception e) {
                    // TODO: handle exception
                }
            }
        }
    };
    
    /**
     * 連接服務器的任務
     * @author yang
     *
     */
    class ThreadConnectService extends Thread
    {
        public void run()
        {
            InetAddress ipAddress;
            try 
            {
                ipAddress = InetAddress.getByName(editTextIPAdress.getText().toString());//獲取IP地址
                int port =Integer.valueOf(editTextPort.getText().toString());//獲取端口號 
                socket = new Socket(ipAddress, port);//創建連接地址和端口
                inputStream = socket.getInputStream();//獲得通道的數據流
                outputStream = socket.getOutputStream();//獲得通道的輸出流
                threadReadDataFlage = true;//一直接收數據
                threadSendDataFlage = true;//一直循環的判斷是否發送數據
                
                try 
                {
                    threadReadData.start();
                }
                catch (Exception e) {//預防任務還沒關閉呢又點擊開始
                    threadReadData.run();
                }
                
                try {
                    threadSendData.start();
                } catch (Exception e) {
                    threadSendData.run();
                }
                
                runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,這里力求簡單,下幾節再用
                    public void run() {
                        ConnectFlage = false;
                        buttonConnect.setText("斷開");
                        Toast.makeText(getApplicationContext(), "連接成功", 500).show();
                    }
                });
            } 
            catch (Exception e) 
            {
                e.printStackTrace();
            }
        }
    }
    
    /**
     * 接收數據的任務
     * @author yang
     *
     */
    class ThreadReadData extends Thread
    {
        public void run()
        {
            while (threadReadDataFlage)
            {
                try 
                {
                    ReadBufferLengh = inputStream.read(ReadBuffer);//服務器斷開會返回-1
                    if (ReadBufferLengh == -1) {
                        threadSendDataFlage = false;//關掉發送任務,預防產生多的任務
                        threadReadDataFlage = false;//關掉接收任務,預防產生多的任務
                        SendDataCnt = 0;//清零發送的個數
                        ConnectFlage = true;
                        runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,這里力求簡單,下幾節再用
                            public void run() {
                                buttonConnect.setText("連接");
                                Toast.makeText(getApplicationContext(), "與服務器斷開連接", 500).show();
                            }
                        });
                    }
                } 
                catch (Exception e) 
                {
                    // TODO Auto-generated catch block
                    Log.e("error", ReadBufferLengh+"");
                    e.printStackTrace();
                    runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,這里力求簡單,下幾節再用
                        public void run() {
                            buttonConnect.setText("連接");
                            Toast.makeText(getApplicationContext(), "與服務器斷開連接", 500).show();
                        }
                    });
                    ConnectFlage = true;
                    threadSendDataFlage = false;//關掉發送任務,預防產生多的任務
                    threadReadDataFlage = false;//關掉接收任務,預防產生多的任務
                    SendDataCnt = 0;//清零發送的個數
                }
            }
        }
    }
    
    /**
     * 發送數據任務
     * @author yang
     *
     */
    class ThreadSendData extends Thread
    {
        public void run()
        {
            while (threadSendDataFlage)
            {
                if (SendDataCnt>0) //要發送的數據個數大於0
                {
                    try 
                    {
                        outputStream.write(SendBuffer,0,SendDataCnt);//發送數據
                        SendDataCnt = 0;//清零發送的個數
                    } 
                    catch (Exception e) 
                    {
                        runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,這里力求簡單,下幾節再用
                            public void run() {
                                buttonConnect.setText("連接");
                                Toast.makeText(getApplicationContext(), "與服務器斷開連接", 500).show();
                            }
                        });
                        ConnectFlage = true;
                        threadSendDataFlage = false;//關掉發送任務,預防產生多的任務
                        threadReadDataFlage = false;//關掉接收任務,預防產生多的任務
                        SendDataCnt = 0;
                    }
                }
            }
        }
    }
    
    
    /** 當活動(界面)不再可見時調用 */
    @Override
    protected void onStop() 
    {
        threadReadDataFlage = false;//結束接收數據任務
        threadSendDataFlage = false;//結束發送數據任務
        SendDataCnt = 0;
        super.onStop();
    }
    
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

 

發送數據是寫在了一個任務里面

 

  

 

 

 

整體的源碼

 本來想這一節也寫好C#的,不過感覺寫的夠多的了,所以C#的放到下一節

下一篇

http://www.cnblogs.com/yangfengwu/p/8785516.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM