文章目录
- 目的
- TCP Client
- 使用说明
- 常用方法
- 基础使用演示
- 作为WEB Client使用
- TCP Server
- 使用说明
- 常用方法
- 基础使用演示
- 作为WEB Server使用
- 总结
目的
TCP是网络应用中常用的功能,很多高级功能也是建立在TCP的基础上的,学会使用TCP就可以开发很多网络应用了。
TCP Client
TCP Client主要是用来访问服务器的,很多可以通过外网访问的物联网设备主要就是工作在TCP Client下。设备主动去访问外部的服务器,与服务器建立连接,用户的app也是去访问这个服务器,这样变相实现了用户对设备的访问。
使用说明
TCP Client按如下方式使用:
- 引用相关库
#include <WiFi.h>
; 连上网(好像是一句废话) ;- 声明
WiFiClient
对象用于连接服务器; - 使用
connect
方法连接服务器; - 进行数据读写通讯;
常用方法
int connect(IPAddress ip, uint16_t port)
int connect(IPAddress ip, uint16_t port, int32_t timeout)
int connect(const char *host, uint16_t port)
int connect(const char *host, uint16_t port, int32_t timeout)
用于和服务器建立连接,可以连接指定IP地址或是指定域名,连接成功返回1,失败返回0;size_t write(uint8_t data)
size_t write(const uint8_t *buf, size_t size)
size_t write_P(PGM_P buf, size_t size)
size_t write(Stream &stream)
发送数据,发送成功返回发送字节数,失败返回0;
除了用write()
方法外也可以用print()
等方法发送数据;int available()
返回可读取数据长度,如果没有数据可读取则返回0;int read()
int read(uint8_t *buf, size_t size)
从接收缓存读取数据并返回读取到的数据字节数,如果返回-1则表示读取失败,读取过的数据会从接收缓存删除;int peek()
读取首字节数据,但并不从接收缓存中删除它;void flush()
清空当前接收缓存;void stop()
关闭客户端,释放资源;uint8_t connected()
返回当前客户端是否与服务器建立连接;IPAddress remoteIP() const
IPAddress remoteIP(int fd) const
返回服务器IP地址;uint16_t remotePort() const
uint16_t remotePort(int fd) const
返回服务器端口号;IPAddress localIP() const
IPAddress localIP(int fd) const
返回本地IP地址;uint16_t localPort() const
uint16_t localPort(int fd) const
返回本地端口号;
基础使用演示
使用下面代码进行测试:
#include <WiFi.h>
const char *ssid = "********";
const char *password = "********";
const IPAddress serverIP(192,168,50,14);
uint16_t serverPort = 50037;
WiFiClient client;
void setup()
{
Serial.begin(115200);
Serial.println();
WiFi.mode(WIFI_STA);
WiFi.setSleep(false);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("Connected");
Serial.print("IP Address:");
Serial.println(WiFi.localIP());
}
void loop()
{
Serial.println("尝试访问服务器");
if (client.connect(serverIP, serverPort))
{
Serial.println("访问成功");
client.print("Hello world!");
while (client.connected() || client.available())
{
if (client.available())
{
String line = client.readStringUntil('\n');
Serial.print("读取到数据:");
Serial.println(line);
client.write(line.c_str());
}
}
Serial.println("关闭当前连接");
client.stop();
}
else
{
Serial.println("访问失败");
client.stop();
}
delay(5000);
}
上图中我们用工具建立的TCP Server进行测试;
作为WEB Client使用
使用下面代码进行测试:
#include <WiFi.h>
const char *ssid = "********";
const char *password = "********";
const char *host = "www.example.com";
void setup()
{
Serial.begin(115200);
Serial.println();
WiFi.mode(WIFI_STA);
WiFi.setSleep(false);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("Connected");
Serial.print("IP Address:");
Serial.println(WiFi.localIP());
}
void loop()
{
WiFiClient client;
Serial.println("尝试访问服务器");
if (client.connect(host, 80))
{
Serial.println("访问成功");
client.print(String("GET /") + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n" +
"\r\n");
while (client.connected() || client.available())
{
if (client.available())
{
String line = client.readStringUntil('\n');
Serial.println(line);
}
}
client.stop();
}
else
{
Serial.println("访问失败");
client.stop();
}
delay(10000);
}
上图测试中(虽然是拿了以前的图,但结果是一样的)我们首先去访问 www.example.com(该网址是专门用于测试的),在连接成功后我们向服务器发送请求头请求网页数据,服务器在收到请求头向我们返回了响应头和网页数据(数据可以参考下图,你也可以在浏览器中打开此页面然后右击查看源代码);
TCP Server
使用说明
TCP Server按如下方式使用:
- 引用相关库
#include <WiFi.h>
; - 声明
WiFiServer
对象; - 使用
begin
方法启动监听; - 监听客户端连接并处理数据通讯;
常用方法
WiFiServer(uint16_t port=80, uint8_t max_clients=4)
在声明WiFiServer
对象可以选择输入要监听的端口号和最大接入客户数量;WiFiClient available()
WiFiClient accept(){return available();}
尝试建立客户对象;void begin(uint16_t port=0)
服务器启动监听;void setNoDelay(bool nodelay)
设置是否延时发送(使用begin
方法时会被设置为false
,这样服务器会合并小数据包后发送,产生延时);
开启NoDelay可以提高应答速度,但有些情况下会降低总传输效率,需要根据需求设置;bool getNoDelay()
返回是否延时发送;bool hasClient()
返回是否有客户端尝试接入;size_t write(const uint8_t *data, size_t len)
size_t write(uint8_t data){return write(&data, 1);}
发送数据,发送成功返回发送字节数,失败返回0;
除了用write()
方法外也可以用print()
等方法发送数据;void end()
void close()
void stop()
停止当前监听;int setTimeout(uint32_t seconds)
设置超时时间;
基础使用演示
使用下面代码进行测试:
#include <WiFi.h>
const char *ssid = "********";
const char *password = "********";
WiFiServer server;
void setup()
{
Serial.begin(115200);
Serial.println();
WiFi.mode(WIFI_STA);
WiFi.setSleep(false);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("Connected");
Serial.print("IP Address:");
Serial.println(WiFi.localIP());
server.begin(22333);
}
void loop()
{
WiFiClient client = server.available();
if (client)
{
Serial.println("[Client connected]");
String readBuff;
while (client.connected())
{
if (client.available())
{
char c = client.read();
readBuff += c;
if(c == '\r')
{
client.print("Received: " + readBuff);
Serial.println("Received: " + readBuff);
readBuff = "";
break;
}
}
}
client.stop();
Serial.println("[Client disconnected]");
}
}
作为WEB Server使用
后面会介绍更加方便的WebServer功能,如果想用TCP Server实现这个的话可以参考官方例程:
https://github.com/espressif/arduino-esp32/tree/master/libraries/WiFi/examples/SimpleWiFiServer
或是下面文章:
《从零开始的ESP8266探索(06)-使用Server功能搭建Web Server》
总结
TCP Client与TCP Server的基本使用主要就是上面这些了,结合之前的UDP功能,已经可以开发很多网络应用了。更多内容可以参考如下:
https://github.com/espressif/arduino-esp32/tree/master/libraries/WiFi
另外如果作为客户端使用有安全方面需求可以参考下面连接:
https://github.com/espressif/arduino-esp32/tree/master/libraries/WiFiClientSecure
The WiFiClientSecure class implements support for secure connections using TLS (SSL). It inherits from WiFiClient and thus implements a superset of that class’ interface. There are three ways to establish a secure connection using the WiFiClientSecure class: using a root certificate authority (CA) cert, using a root CA cert plus a client cert and key, and using a pre-shared key (PSK).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)