esp8266(一)esp8266和电脑在同一局域网中传输数据

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/superce/article/details/78219707

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里面的数据满了之后再显示出来,还是有不少好处的。
展开阅读全文

没有更多推荐了,返回首页