1. 程式人生 > >esp8266(一)esp8266和電腦在同一區域網中傳輸資料

esp8266(一)esp8266和電腦在同一區域網中傳輸資料

superce

主要

esp8266怎麼配置
    esp8266和USB轉TTL連線
esp8266簡單介紹
esp8266連線路由器
esp8266通過路由器連線在同一區域網中的電腦,建立TCP連線
esp8266使用串列埠傳送資料到電腦上的網路除錯助手
esp8266使用串列埠通過區域網傳送到電腦上自己寫的Java程式
esp8266的透傳模式
esp8266使用透傳模式連線到電腦的網路除錯助手
esp8266使用透傳模式連線到電腦上的java程式
USB轉TTL如何和esp8266連線?
USB轉TTL 
    5V
    VCC
    3V3
    TXD
    RXD
    GND

esp8266
    3V3 RX
    IO16    IO0
    EN  IC2
    TX  GND
連線
    USB轉TTL esp8266
    TXD RX
    RXD TX
    GND GND
    VCC和3V3用短路帽連線後再同時連到esp8266的3V3和EN
esp8266測試
開啟串列埠除錯助手,選擇傳送新行
AT
OK
-----------
AT+GMR

AT version:1.3.0.0(Jul 14 2016 18:54:01)
SDK version:2.0.0(656edbf)
compile time:Jul 19 2016 18:44:44
OK
-----------
AT+CWSAP_CUR?

+CWSAP_CUR:"ESP_A5A06F","",1,0,4,0

OK
-----------
AT+CWSAP_DEF?

+CWSAP_DEF:"ESP_A5A06F","",1,0,4,0

OK
Esp8266三種模式
STA      連線其他裝置來上網,作為client
    STA 站點,每一個連線到無線網路中的終端(如膝上型電腦、 PDA及其它可以聯網的使用者裝置)都可稱為一個站點
AP        可以當作路由器來給其他esp8266或其他裝置連線
    是無線接入點,是一個無線網路的建立者,是網路的中心節點
STA+AP
Wifi模組包括兩種型別的拓撲形式:基礎網(Infra)和自組網(Adhoc)
      基於AP組建的基礎無線網路(Infra):Infra也稱為基礎網,是由AP建立,眾多 STA加入所組成的無線網路,這種型別的網路的特點是AP是整個網路的中心,網路中所有的通訊都通過 AP 來轉發完成。
      基於自組網的無線網路(Adhoc):Adhoc也稱為自組網,是僅由兩個及以上STA自己組成,網路中不存在 AP,這種型別的網路是一種鬆散的結構, 網路中所有的 STA 都可以直接通訊
單連線,多連線和透傳模式的關係
多連線情況下(”AT+CIPMUX=1“),才能開啟 TCP 伺服器
    伺服器僅⽀持多連線
    建立 TCP 伺服器後,⾃動建⽴ TCP server 監聽
    當有 TCP client 接⼊,會⾃動按順序佔⽤⼀個連線 id
    ⾮透傳模式 ( “AT+CIPMODE=0”) ,才能設定為多連線
透傳模式,僅⽀持 TCP 單連線和 UDP 固定通訊對端的情況
esp8266連線路由器
esp8266已經設定為STA/AP模式
指令:
    AT+CWJAP_CUR="Cise_132_Middle",""
    AT+CWJAP_CUR="Cise_128_01","213213213"

    WIFI CONNECTED
    WIFI GOT IP

    OK
這樣esp8266就有一個IP地址了
    AT+CIFSR

    +CIFSR:APIP,"192.168.4.1"
    +CIFSR:APMAC,"5e:cf:7f:a5:a0:6f"
    +CIFSR:STAIP,"192.168.1.110"
    +CIFSR:STAMAC,"5c:cf:7f:a5:a0:6f"

    OK
那麼查詢一下現在的網路連線狀態
    AT+CIPSTATUS

    STATUS:2

    OK
    引數說明:
        <stat>
            2:獲得 IP
            3:已連線
            4:斷開連線
            5:未連線到 WiFi
測試一下域名解析功能
    AT+CIPDOMAIN="www.baidu.com"

    +CIPDOMAIN:61.135.169.125

    OK
現在試一下和電腦建立TCP連線
    先建立單連線
        查詢電腦IP
            192.168.1.108
            255.255.255.0
            192.168.1.1
        AT+CIPSTART="TCP","192.168.1.108",8000
            不能先用esp8266建立一個tcp連線,連不上的,因為TCP server 還沒有建立,esp8266也連不上
        先用網路除錯助手建立一個TCP  server,開啟指定埠,再連線
            AT+CIPSTART="TCP","192.168.31.171",6699

            CONNECT

            OK
            AT+CIFSR

            +CIFSR:APIP,"192.168.4.1"
            +CIFSR:APMAC,"5e:cf:7f:a5:a0:6f"
            +CIFSR:STAIP,"192.168.31.103"
            +CIFSR:STAMAC,"5c:cf:7f:a5:a0:6f"

            OK
        在網路除錯助手上顯示已經和192.168.31.103建立連線
    通過路由器在一個區域網中向電腦傳送資料
        esp8266和電腦連線同一個路由器
        AT+CIPSEND=9


        OK
        > 123asdfgh

        busy s...

        Recv 9 bytes
上面是用網路除錯助手建立TCP Server,那麼可不可以使用java建立一個serversocket來接收資料呢?
    esp傳送命令
        AT+CIPSENDBUF=16
        一直按回車就可以了,因為這個命令本身的長度就是16,可以傳送自己
    java程式
        package espSever;

        import java.awt.BorderLayout;
        import java.awt.Color;
        import java.awt.event.ActionEvent;
        import java.awt.event.ActionListener;
        import java.io.BufferedReader;
        import java.io.InputStreamReader;
        import java.io.PrintWriter;
        import java.net.ServerSocket;
        import java.net.Socket;

        import javax.swing.BoxLayout;
        import javax.swing.JButton;
        import javax.swing.JFrame;
        import javax.swing.JPanel;
        import javax.swing.JScrollPane;
        import javax.swing.JTextArea;
        import javax.swing.ScrollPaneConstants;



        public class Esp {
            JButton Sendtoesp;
            JTextArea textArea;
            JButton opensocket;

            ServerSocket serverSocket;
            PrintWriter writer;
            Socket socket;
            BufferedReader reader;
            InputStreamReader streamReader;
            public static void main(String[] args) {
                // TODO Auto-generated method stub
                Esp esp  =new Esp();
                esp.go();
            }
            public void go() {
                JFrame frame = new JFrame("EspServer");
                JPanel panel01 = new JPanel();
                JPanel panel02 = new JPanel();
                opensocket = new JButton("OpenSocket");
                Sendtoesp = new JButton("Send To Esp");
                textArea = new JTextArea(20,20);
                textArea.setLineWrap(true); //可以使用滾動條

                //設定滾動條
                JScrollPane scrollPane = new JScrollPane(textArea);
                scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
                scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

                opensocket.addActionListener(new Socketopen());
                panel01.setBackground(Color.PINK);
                panel02.setBackground(Color.BLUE);
                panel02.setLayout(new BoxLayout(panel02, BoxLayout.Y_AXIS));


                panel01.add(scrollPane);//不能忘了加滾動條
                panel02.add(opensocket);
                panel02.add(Sendtoesp);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.getContentPane().add(BorderLayout.CENTER, panel01);
                frame.getContentPane().add(BorderLayout.EAST, panel02);
                frame.setSize(600, 600);
                frame.setVisible(true);
            }
            class Espget implements Runnable{

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    String message;
                    try {
                        while((message =reader.readLine())!=null)
                        {
                            textArea.append("IP : "+message+"\n");
                        }

                } catch (Exception e2) {
                    // TODO: handle exception
                    System.out.println("發生異常.\n");
                }
                }

            }
            class Socketopen implements ActionListener{

                @Override
                public void actionPerformed(ActionEvent arg0) {
                    // TODO Auto-generated method stub
                    textArea.append("server socket open  ing!\n");
                    try {
                        //@SuppressWarnings("resource")
                        serverSocket = new ServerSocket(6699);

                            Socket socket = serverSocket.accept();

                            streamReader = new InputStreamReader(socket.getInputStream());
                            reader = new BufferedReader(streamReader);      

                            writer = new PrintWriter(socket.getOutputStream());

                            Thread tserver = new Thread(new Espget());
                            tserver.start(); 
                            textArea.append("伺服器已啟動!\n");

                    } catch (Exception e2) {
                        // TODO: handle exception
                        System.out.println("發生異常.\n");
                    }
                }

            }

        }
        主要的問題是使用內部類和執行緒
    測試結果:
        使用Java的serversocket是可以接收到esp傳送的資料的,不過由於使用的是buffer,要傳送足夠的資料,因為AT+CIPSENDBUF=16太短了,Java程式才會顯示出來,而且有亂碼
怎麼解決有什麼接收什麼和防止亂碼的問題?
        涉及到編碼問題,稍後再研究
esp8266接收資料
    直接使用TCP server傳送資料,WiFi模組就能在串列埠上顯示,不需要特殊的配置
        不過如果需要顯示傳送訊息來的TCP server的IP和埠需要使用AT指令AT+CIPDINFO=1就可以顯示相關資訊了,
先了解一種工作模式叫透傳,這個很有用處
    透傳的意思是將WiFi模組設定為透傳模式(前提是設定為單連線,而且已經和TCP server建立連線)後,發給WiFi模組的資訊(AT指令)WiFi模組就不處理了,直接將輸入的發給TCP server
        這樣如果使用WiFi模組和STM32連線,STM32發給ESP8266後,其實就是發給了網路上的TCP server,就不用使用AT+CIPSEND命令設定長度再發送資料了。
設定透傳模式
    第一次設定不對
        AT+CIPMUX=0


        OK
        AT+CIPSTART="TCP","192.168.31.171",6699

        CONNECT

        OK
        AT+CIPSMODE=1


        ERROR
        AT+CIPMODE=1


        OK
        AT+CIPMODE=1


        OK
        AT+CIPMODE=1


        OK
        BHBUUHY

        ERROR
        hhhhhhhhhhBHBUUHY

        ERROR
        BHBUUHY

        ERROR
        AT+CIFSR

        +CIFSR:APIP,"192.168.4.1"
        +CIFSR:APMAC,"5e:cf:7f:a5:a0:6f"
        +CIFSR:STAIP,"192.168.31.103"
        +CIFSR:STAMAC,"5c:cf:7f:a5:a0:6f"

        OK
        AT+CIPSTATUS

        STATUS:3
        +CIPSTATUS:0,"TCP","192.168.31.171",6699,46789,0

        OK
        AT+CIPSENDBUF=16

        IPMODE=1

        ERROR
        AT+CIPSENDBUF=16AT+CIPSENDBUF=16AT+CIPSENDBUF=16AT+CIPSENDBUF=16AT+CIPSENDBUF=16AT+CIPSENDBUF=16AT+CIPSENDBUF=16

        IPMODE=1

        ERROR
        CLOSED
好像應該設定為客戶端模式,再設定單連線,再連線TCP再設定透傳,
        設定為客戶端模式(其實設定為STA/AP模式也可以)
        重啟
        AT檢視
        檢視IP
        連線AP
        檢視IP
        設定單連線
        連線TCP server
        檢視IP
        設定透傳
        輸入AT+CIPSEND
            之後輸入的任何資訊都會直接傳輸到TCP server
        輸入連續的+++結束透傳
        輸入AT+CIPCLOSE斷開TCP連線
        AT+CWMODE_DEF=1


        OK
        AT+RST


        OK

         ets Jan  8 2013,rst cause:1, boot mode:(3,7)

        load 0x40100000, len 2408, room 16 
        tail 8
        chksum 0xe5
        load 0x3ffe8000, len 776, room 0 
        tail 8
        chksum 0x84
        load 0x3ffe8310, len 632, room 0 
        tail 8
        chksum 0xd8
        csum 0xd8

        2nd boot version : 1.6
          SPI Speed      : 40MHz
          SPI Mode       : DOUT
          SPI Flash Size & Map: 8Mbit(512KB+512KB)
        jump to run user1 @ 1000

        屻?僶鞗;凔g|?宒噋;l勩;沝宒?

        d`屻s踠?
        AT+CIFSR

        +CIFSR:STAIP,"0.0.0.0"
        +CIFSR:STAMAC,"5c:cf:7f:a5:a0:6f"

        OK
        AT+CWJAP_CUR="Cise_128_01","213213213"

        WIFI CONNECTED
        WIFI GOT IP

        OK
        AT+CIFSR

        +CIFSR:STAIP,"192.168.31.103"
        +CIFSR:STAMAC,"5c:cf:7f:a5:a0:6f"

        OK
        AT+CIPMUX=0


        OK
        AT+CIFSR

        +CIFSR:STAIP,"192.168.31.103"
        +CIFSR:STAMAC,"5c:cf:7f:a5:a0:6f"

        OK
        AT+CIPSTART="TCP","192.168.31.171",6699

        CONNECT

        OK
        AT+CIFSR

        +CIFSR:STAIP,"192.168.31.103"
        +CIFSR:STAMAC,"5c:cf:7f:a5:a0:6f"

        OK
        AT+CIPSTATUS

        STATUS:3
        +CIPSTATUS:0,"TCP","192.168.31.171",6699,29851,0

        OK
        AT+CIPMODE=1


        OK
        AT+CIPMODE=1


        OK
        AT


        OK
        AT


        OK
        VVREV

        ERROR
        VVREV

        ERROR
        hhhVVREV

        ERROR
        VVREV

        ERROR
        AT+CIPSENDBUF=16

        IPMODE=1

        ERROR
        AT+CIPSENDBUF=16

        IPMODE=1

        ERROR
        AT+CIPSENDBUF


        ERROR
        AT+CIPSENDBUF


        ERROR
        AT+CIPSEND


        OK

        >
那麼不用網路除錯助手建立TCP server,使用上面那個自己的Java程式會怎樣?
        還是按上面的步驟建立透傳
            不過每個傳送的字串在Java的textArea上面都顯示出來了,而不是像之前一樣得發夠一定的位元組數,在Java程式上一下顯示出來,看來使用透傳的話每次傳送都是一個單獨的包,Java直接就解析然後顯示出來,並沒有先等buffer裡面的資料滿了之後再顯示出來,還是有不少好處的。