zoukankan      html  css  js  c++  java
  • ESP8266---TCP Client

    ESP8266WiFi库里面还有其他重要内容,比如跟http相关的 WiFiClient、WiFiServer,跟https相关的 WiFiClientSecure、WiFiServerSecure

    至于是client还是Server,取决于ESP8266开发需求:

    如果业务要求是获取其他server提供的数据(发送请求,比如请求天气信息),那么你就可以使用Client模式

    如果业务要求是别人请求你获取某些数据(web请求),那么你可以使用Server模式

    TCP client:

    client,又名客户端,也就是需要通过获取server提供的服务数据来展示自己。Tcp client,只是架构在tcp协议之上的客户端 .上图中,ESP8266作为client端,通过路由,访问局域网内的Pc server或者广域网下的网络服务器信息,server收到请求后会处理请求并且把响应数据返回以供ESP8266使用

    整体上来说,方法可以分为4类:

    第一类方法,连接操作

    第二类方法,发送请求操作

    第三类方法,响应操作

    第四类方法,普通设置

    1.连接操作

    int connect(IPAddress ip, uint16_t port);  //启动tcp连接--方式一
    //ip   IP地址
    //port  端口
    //返回值:1 成功    0 失败
    
    int connect(const char *host, uint16_t port); //启动tcp连接--方式二
    //host   tcpserver (192.xx.xx.xx)
    //port  端口
    //返回值:1 成功    0 失败
    
    int connect(const String host, uint16_t port);  //启动tcp连接--方式三
    //host   tcpserver (192.xx.xx.xx)
    //port   端口
    //返回值:1 成功    0 失败

    2. 判断tcp连接是否建立起来

    uint8_t connected();  //判断tcp连接是否建立起来
    //返回值:1成功  0 失败

    3.停止tcp连接

    void stop();  //关闭tcp连接

    4.连接状态

    uint8_t status();  //获取tcp连接状态
    /**
     * @return  result of tcp connect
     *          CLOSED      = 0,
     *          LISTEN      = 1,
     *          SYN_SENT    = 2,
     *          SYN_RCVD    = 3,
     *          ESTABLISHED = 4,
     *          FIN_WAIT_1  = 5,
     *          FIN_WAIT_2  = 6,
     *          CLOSE_WAIT  = 7,
     *          CLOSING     = 8,
     *          LAST_ACK    = 9,
     *          TIME_WAIT   = 10
     */

    4.发送数据到client连接的server---write方法

    size_t write(uint8_t str);//发送数据--方式一
    //str 需要单个字节
    //返回值:size_t 成功写入发送缓冲区的字节数
    
    
    size_t write(const char *str);  //发送数据--方式二
    //str 需要发送字符串或者字符数组
    //返回值:size_t 成功写入发送缓冲区的字节数
    
    
    size_t write(const char *buffer, size_t size); //发送数据--方式三
    //buffer 需要发送字符串或者字符数组
    //size 数据字节数
    //返回值:size_t 成功写入发送缓冲区的字节数
    
    
    size_t write(Stream& stream);  //发送数据--方式四
    //stream 数据流,比如文件流
    //返回值:size_t 成功写入发送缓冲区的字节数

    注意点:write(uint8_t)函数是发送数据的底层方法,也就是说print、println底层也是调用write

    write(const char *str) 函数底层是调用 write(const char *buffer, size_t size),通过strlen计算长度

    5.发送数据到client连接的server---print方法

    size_t print(const __FlashStringHelper *);  //发送数据
    //FlashStringHelper 需要发送的字符串,字符串存在flash中(PROGMEM)
    //返回值:size_t 成功写入发送缓冲区的字节数
    
    size_t print(const String &);  //发送数据
    //String 需要发送的字符串,字符串存在内存中
    //返回值:size_t 成功写入发送缓冲区的字节数
    
    size_t print(const char[]);  //发送数据
    //参数 需要发送的字符数组,字符数组存在内存中
    //返回值:size_t 成功写入发送缓冲区的字节数
    
    size_t print(char ch);  //发送数据
    //ch 需要发送的字符
    //返回值:size_t 成功写入发送缓冲区的字节数
    
    
    /**
     * 发送数据
     * @param String 需要发送的数据,多是数字,转成对应的进制,一般都是传输数字型数据
     * @return size_t 成功写入发送缓冲区的字节数
     */
    size_t print(unsigned char, int = DEC);
    size_t print(int, int = DEC);
    size_t print(unsigned int, int = DEC);
    size_t print(long, int = DEC);
    size_t print(unsigned long, int = DEC);
    size_t print(double, int = 2);
    //进制的英文表示法:BIN、OCT、HEX、DEC分别代表二、八、十六、十进制

    注意点:读者需要特别关注 print(const __FlashStringHelper *) 这个函数,以后代码内存优化需用用到

    例如:

    WiFiClient client;
    client.print( F("This is an flash string")); //字符串“This is an flash string”存在于flash

    6.发送数据到client连接的server---println方法

    size_t println(const __FlashStringHelper *);//发送数据,并且加上换行符 "
    "
    //FlashStringHelper 需要发送的字符串,字符串存在flash中(PROGMEM)
    //size_t 成功写入发送缓冲区的字节数
    
    size_t println(const String &s);//发送数据,并且加上换行符 "
    "
    //String 需要发送的字符串,字符串存在内存中
    //size_t 成功写入发送缓冲区的字节数
    
    size_t println(const char[]);//发送数据,并且加上换行符 "
    "
    //String 需要发送的字符数组,字符数组存在内存中
    //size_t 成功写入发送缓冲区的字节数
    
    size_t println(char);//发送数据,并且加上换行符 "
    "
    //String 需要发送的字符
    //size_t 成功写入发送缓冲区的字节数
    
    
    /**
     * 发送数据,并且加上换行符 "
    "
     * @param String 需要发送的数据,多是数字,转成对应的进制,一般都是传输数字型数据
     * @return size_t 成功写入发送缓冲区的字节数
     */
    size_t println(unsigned char, int = DEC);
    size_t println(int, int = DEC);
    size_t println(unsigned int, int = DEC);
    size_t println(long, int = DEC);
    size_t println(unsigned long, int = DEC);
    size_t println(double, int = 2);
    //进制的英文表示法:BIN、OCT、HEX、DEC分别代表二、八、十六、十进制
    
    size_t println(void);//发送换行符 "
    "
    //size_t 成功写入发送缓冲区的字节数

    7.响应操作

    int available();
    //返回值:int 接收缓冲区可读取字节数

    注意点:通过此方法,我们可以判断发送出去的请求是否有响应信息

    size_t availableForWrite();
    //返回值:int 发送缓冲区剩余可写字节数

    注意点:一般来说,调用发送数据操作之后,并不会立刻发送出去,而是把数据放入发送缓冲区,通过机制不断读取发送缓冲区的数据不断发送出去

    可以通过此函数判断请求是否发送完毕

    int read();  //读取接收缓冲区一个字节
    //返回值:int 一字节数据

    注意点:此函数读取完数据后,会把该数据从缓冲区清掉

    int read(uint8_t *buf, size_t size); //读取接收缓冲区size大小的字节数据
    //buf 数据存储到该buf
    //size 读取大小

    注意点:此函数读取完数据后,会把该数据从缓冲区清掉

    int peek();  //读取接收缓冲区一个字节
    //返回值:int 一字节数据

    注意点:此函数读取完数据后,不会把该数据从缓冲区清掉

    size_t peekBytes(uint8_t *buffer, size_t length);//读取接收缓冲区length大小的字节数据
    size_t peekBytes(char *buffer, size_t length);
    //buffer 数据存储到该 buffer
    //length 读取大小
    //返回值:size_t 成功读取的大小

    注意点:此函数读取完数据后,不会把该数据从缓冲区清掉

    String readStringUntil(char end);  //读取响应数据直到某个字符串为止
    //end 结束字符
    //返回值:String 读取成功的字符串
    bool find(char *buffer);  //查找某个字符串
    //buffer 目标字符串
    //返回值:bool 存在返回true

    注意点:此函数会把数据从缓冲区清掉

    void flush(void);  //清除接收缓冲区

    注意点:新版本flush功能是等待缓冲区中的所有传出字符都已发送。所以做不了清除缓冲区的作用

    可以有以下代替:while(client.read()>0);

    client的发送缓冲区的大小是256Bytes

    void setNoDelay(bool nodelay);  //是否禁用 Nagle 算法
    //nodelay true表示禁用 Nagle 算法

    注意点:Nagle 算法的目的是通过合并一些小的发送消息,然后一次性发送所有的消息来减少通过网络发送的小数据包的tcp/ip流量。这种方法的缺点是延迟了单个消息的发送,直到一个足够大的包被组装

    实例:---向 TCP server收发数据

    //例子介绍:本实验演示 WiFiClient 与 TCP server 之间的通信功能
    //个人建议:用TCP调试工具 查看IP地址, 用tcpudp测试工具 进行通讯
    //TCP调试工具 下载地址:链接:https://pan.baidu.com/s/1rwNQGcBSD-ogQljIeqgNxg 提取码:gibq 
    //tcpudp测试工具 下载地址:链接:https://pan.baidu.com/s/10vIVOi5JYeFRcb7oO19R0w 提取码:acrr
    //STA模式下,演示WiFiClient与TCP server之间的通信功能(两个机子之间的数据传输)
    
    #include <ESP8266WiFi.h>
     
    #define AP_SSID "jia" //这里改成你的wifi名字
    #define AP_PSW  "lm654321"//这里改成你的wifi密码
     
    const uint16_t port = 60000;
    const char * host = "192.168.188.166"; // ip or dns
    WiFiClient client;//创建一个tcp client连接
     
    void setup() {
      Serial.begin(115200);
      delay(1000);
      WiFi.mode(WIFI_STA);    //STA模式
      WiFi.begin(AP_SSID,AP_PSW); //登陆WIFI
     
      Serial.println("正在登陆WIFI... ");
      while (WiFi.status() != WL_CONNECTED) {
        Serial.print(".");
        delay(500);
      }
      Serial.println("");
      Serial.println("WiFi连接成功");
      Serial.print("IP地址是: ");
      Serial.println(WiFi.localIP());
     delay(500);
    
    Serial.print("连接到 ");
      Serial.println(host);
     
      if (!client.connect(host, port)) {
        //client.connect(host, port)   连接TCP server端,连接成功返回True
        Serial.println("TCP server端连接失败");
        Serial.println("请等待5秒后重新连接...");
        delay(5000);
        return;
      }
     Serial.println("TCP server端连接成功");
     
    }
     
    void loop() {
       
      Serial.println("发送数据到Tcp server");
      client.println(String("Send this data to server"));//发送数据,并且加上换行符 "
    "
    //向Tcp server发送数据
    
     
      //读取从server返回到响应数据
      String line = client.readStringUntil('
    ');  //读取响应数据直到某个字符串为止
    //读取从Tcp server发来的数据
      
      Serial.print("读取的数据是:");
      Serial.println(line);
     
      //client.stop();  //关闭tcp连接--与Tcp server断开连接
     
      Serial.println("wait 10 sec...");
      delay(10000);
    }

    client.connected()      判断客户端是否处于连接状态,是  返回True   

    天子骄龙

  • 相关阅读:
    共创力董事长杨学明先生受邀参加CED智慧大会!
    杨学明老师为华宇金信(北京)软件有限公司提供为期两天的内训服务!
    《互联网敏捷测试管理实践》课程大纲 2018.12.15~16 (上海)
    共创力咨询杨学明老师为国电南瑞提供两天的内训服务!
    《软件测试管理》深圳公开课预告 2018.11.23~24 中南海滨大酒店
    软件测试管理的十大挑战
    对于开发人员修改代码引发新问题的处理措施
    热烈庆祝杨学明老师为上海某著名金融互联网公司提供两天的内训服务!
    《高效的互联网研发项目管理》课程大纲
    《软件测试管理》北京公开课预告 2018.9.28~29
  • 原文地址:https://www.cnblogs.com/liming19680104/p/11227742.html
Copyright © 2011-2022 走看看