ESP8266开发之旅 网络篇⑦ TCP Server TCP Client (3)

函数说明:

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

注意点:

此函数读取完数据后,会把该数据从缓冲区清掉;

3.3.5 peek() - 读取接收缓冲区一个字节

函数说明:

/** * 读取接收缓冲区一个字节 * @return int 一字节数据 */ int peek();

注意点:

此函数读取完数据后,不会把该数据从缓冲区清掉,所以需要特别关注这一点;

3.3.6 peekBytes(buf,size) - 读取接收缓冲区size大小的字节数据

函数说明:

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

注意点:

此函数读取完数据后,不会把该数据从缓冲区清掉,所以需要特别关注这一点;

3.3.7 readStringUntil - 读取响应数据直到某个字符串为止

函数说明:

/** * 读取响应数据直到某个字符串为止 * @param end 结束字符 * @return String 读取成功的字符串 */ String readStringUntil(char end); 3.3.8 find - 查找某个字符串

函数说明:

/** * 判断是否存在某个目标字符串 * @param buffer 目标字符串 * @return bool 存在返回true */ bool find(char *buffer);

注意点:

此函数会把数据从缓冲区清掉;

3.3.9 flush - 清除接收缓冲区

函数说明:

/** * 清除缓冲区 */ void flush(void);

注意点:

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

while(client.read()>0); 方法要点

博主建议大家尽量用批量处理的方法,比如 readStringUntil、read(buf,size)、peekBytes(buf,length),性能方面会好很多;

博主通过查看源码,发现client的发送缓冲区的大小是256Bytes;

3.4 普通设置 3.4.1 setNoDelay - 是否禁用 Nagle 算法。

函数说明:

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

底层源码:

void setNoDelay(bool nodelay) { if(!_pcb) { return; } if(nodelay) { tcp_nagle_disable(_pcb); } else { tcp_nagle_enable(_pcb); } }

注意点:

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

4. 实例操作

    前面讲了这么多理论内容,接下来用几个例子来说明一下。

4.1 演示 WiFiClient 与 TCP server 之间的通信功能

例子介绍:
    本实验演示 WiFiClient 与 TCP server 之间的通信功能,需要使用到TCP调试助手,请在TCP调试助手上建立一个Tcp server,ip地址是192.168.1.102,端口号是8234。

源码:

/** * Demo: * STA模式下,演示WiFiClient与TCP server之间的通信功能 * 本实验需要跟TCP调试助手一起使用。 * @author 单片机菜鸟 * @date 2019/1/25 */ #include <ESP8266WiFi.h> //以下三个定义为调试定义 #define DebugBegin(baud_rate) Serial.begin(baud_rate) #define DebugPrintln(message) Serial.println(message) #define DebugPrint(message) Serial.print(message) #define AP_SSID "TP-LINK_5344" //这里改成你的wifi名字 #define AP_PSW "xxxxxxx"//这里改成你的wifi密码 const uint16_t port = 8234; const char * host = "192.168.1.102"; // ip or dns WiFiClient client;//创建一个tcp client连接 void setup() { //设置串口波特率,以便打印信息 DebugBegin(115200); //延时5s 为了演示效果 delay(5000); // 我不想别人连接我,只想做个站点 WiFi.mode(WIFI_STA); WiFi.begin(AP_SSID,AP_PSW); DebugPrint("Wait for WiFi... "); //等待wifi连接成功 while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } DebugPrintln(""); DebugPrintln("WiFi connected"); DebugPrint("IP address: "); DebugPrintln(WiFi.localIP()); delay(500); } void loop() { DebugPrint("connecting to "); DebugPrintln(host); if (!client.connect(host, port)) { DebugPrintln("connection failed"); DebugPrintln("wait 5 sec..."); delay(5000); return; } // 发送数据到Tcp server DebugPrintln("Send this data to server"); client.println(String("Send this data to server")); //读取从server返回到响应数据 String line = client.readStringUntil('\r'); DebugPrintln(line); DebugPrintln("closing connection"); client.stop(); DebugPrintln("wait 5 sec..."); delay(5000); }

测试结果:

image

4.2 演示 Http请求天气接口信息

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzpgfx.html