前言
TCP和客户端对于我来说就是完全陌生的知识领域,所以这部分也是百度了解来的
05-ESP8226的TCP客户端库学习
有标题先拆分两个内容TCP和客户端,下图是ESP8266作为客户端的示意图,其中PC作为服务器,ESP8266作为客户端获取服务器的数据
什么是TCP?
对于一个不懂的小白确实需要初步了解一下TCP的三个过程。引用博客
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接、可靠的、基于字节流的传输层通信协议。
TCP 协议的执行过程分为三个阶段
- 连接创建(Connection Establishment)
- 数据传送(Data Transfer)
- 连接终止(Connection Termination)
其中「连接创建」与「连接终止」分别是耳熟能详的 TCP 协议三次握手(TCP Three-way Handshake)与四次挥手(TCP Four-way Handshake),也是理解本文 TCP 服务器与客户端通信过程的两个核心阶段。
下图是「连接创建」的三次握手示意图
下图是「连接终止」的四次挥手示意图
什么是客户端和服务器端?
简单点说:客户端(Client)是发送请求(request),服务器端(Service)是响应请求(response),返回相应的资源数据
服务器的特征:被动角色,等待来自客户端的连接请求,处理请求并回传结果。
客户端的特征:主动角色,发送连接请求,等待服务器的响应。
端口:是指用于区分不同服务的逻辑编号,端口号的范围从0到65535,SIEMENS设备的开放式以太网通信通常使用编号为2000~5000范围内端口。
客户端侧在配置TCP连接时,必须设置服务器IP地址及端口号,自身使用的端口号如果没有明确指定,则由设备自动分配。
服务器侧在配置TCP连接时,必须设置服务器使用的端口号,客户端IP地址及端口号为可选项。
下面来看库文件**WiFiClient.h
**,同样做了分类:
连接操作:
//客户端连接
virtual int connect(IPAddress ip, uint16_t port) override;
virtual int connect(const char *host, uint16_t port) override;
virtual int connect(const String& host, uint16_t port);
//停止TCP连接
bool stop(unsigned int maxWaitMs);
//TCP连接状态
virtual uint8_t status();
//连接状态宏定义,与上面TCP部分对应
enum tcp_state {
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
};
//客户端是否在连接
virtual uint8_t connected() override;
写
//写
virtual size_t write(uint8_t) override;
virtual size_t write(const uint8_t *buf, size_t size) override;
virtual size_t write_P(PGM_P buf, size_t size);
//发送数据
println();
print();
读
//读取响应数据中的一个字符,清掉
virtual int read() override;
//读取固定大小的响应数据,清掉
virtual int read(uint8_t* buf, size_t size) override;
//读取响应数据中的一个字符,不清掉
virtual int peek() override;
//读取固定大小的响应数据,不清掉
virtual size_t peekBytes(uint8_t *buffer, size_t length);
//清除缓冲区
bool flush(unsigned int maxWaitMs);
官方例程1:
/*
This sketch sends a string to a TCP server, and prints a one-line response.
You must run a TCP server in your local network.
For example, on Linux you can use this command: nc -v -l 3000
*/
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#ifndef STASSID
#define STASSID "tangbo"
#define STAPSK "88888888"
#endif
const char* ssid