0
点赞
收藏
分享

微信扫一扫

ESP8266--Arduino开发(TCP服务端)


一、接口

下面接口来自​​ESP8266WiFi​​库

#include <ESP8266WiFi.h>

1、创建TCP server

WiFiServer server(IPAddress addr, uint16_t port);  //创建TCP server
//addr server的ip地址
//port server的端口

WiFiServer server(uint16_t port); //创建TCP server
//port server的端口

2、创建TCP server

void begin();  //启动TCP server

void begin(uint16_t port); //启动TCP server
//port server端口号

3、关闭延时发送功能

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

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

4、关闭TCP server

void close(); //关闭TCP server

5、停止TCP server

void stop(); //停止TCP server

注意:stop()和 close()是同样的功能,所以调用哪一个都没有问题

6、返回TCP server状态

uint8_t status();   //返回TCP server状态
//返回值:wl_tcp_state tcp状态

wl_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

7、获取有效的wificlient连接

WiFiClient available(uint8_t* status = NULL);  //获取有效的wificlient连接
//返回值://如果存在有效的wificlient连接,就返回WiFiClient对象,如果没有那就返回一个无效的wificlient(connected等于false,开发者可以通过判断connected()

8、判断是否有client请求连接

bool hasClient();//判断是否有client连接
//返回值:bool 如果有client连接就返回true

注意:开发者可以通过判断这个函数来判断是否有client连接,然后调用available() 方法来获取连接,这样拿到wificlient之后就可以调用wificlient的方法

9、允许最多多少个客户端

WiFiClient serverClients[1];   //定义最多多少个client可以连接本server(一般不要超过4个)

10、判断指定序号的客户端是否有效

serverClients[i]    //判断指定序号的客户端是否有效  
//有效返回True

11、判断指定序号的客户端是否还连接着

serverClients[i].connected()      //判断指定序号的客户端是否还连接着
//是 返回True 断开返回false

12、判断指定客户端是否有可读数据

serverClients[i].available()        判断指定客户端是否有可读数据

二、实例

//例子介绍:8266作为WiFiServer端,打开TCP调试助手,模拟TCP Client的请求

#include <ESP8266WiFi.h>

const char* ssid = "LaiFu";
const char* password = "12345678";
#define MAX_SRV_CLIENTS 2 //做多多少个客户端可以连接

WiFiServer server(6666); //创建server 端口号是6666

WiFiClient serverClients[MAX_SRV_CLIENTS]; //定义最多多少个client可以连接本server(一般不要超过4个)

void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("\n连接到:");
Serial.println(ssid);
uint8_t i = 0;
while (WiFi.status() != WL_CONNECTED && i++ < 20) {
delay(500);
}
if (i == 21) {
Serial.print("没能连接到:");
Serial.println(ssid);
return ;
}

server.begin(); //启动server
server.setNoDelay(true);//关闭小包合并包功能,不会延时发送数据

Serial.print("准备好了!使用网络吧 IP是: ");
Serial.print(WiFi.localIP());
Serial.println(" 端口是: 6666");
}

void loop() {
uint8_t i;

if (server.hasClient()) { //判断是否有新的client请求进来
for (i = 0; i < MAX_SRV_CLIENTS; i++) {

//释放旧无效或者断开的client
if (!serverClients[i] || !serverClients[i].connected()) {
if (!serverClients[i]) {
//serverClients[i] 判断指定序号的客户端是否有效
serverClients[i].stop(); //停止指定客户端的连接
}

serverClients[i] = server.available();//分配最新的client
Serial.print("1个新的客户端: ");
Serial.println(i);
break; //跳出一层for循环
}
}

//当达到最大连接数 无法释放无效的client,需要拒绝连接
if (i == MAX_SRV_CLIENTS) {
WiFiClient client = server.available();
client.stop();
Serial.println("连接被拒绝 ");
}
}


//检测client发过来的数据
for (i = 0; i < MAX_SRV_CLIENTS; i++) {
if (serverClients[i] && serverClients[i].connected()) {
if (serverClients[i].available()) {
//serverClients[i].available() 判断指定客户端是否有可读数据
while (serverClients[i].available()) {
Serial.write(serverClients[i].read());
}
}
}
}

if (Serial.available()) {
//把串口调试器发过来的数据 发送给client
size_t len = Serial.available(); //返回可读数据的长度
uint8_t sbuf[len];
Serial.readBytes(sbuf, len);
//push UART data to all connected telnet clients
for (i = 0; i < MAX_SRV_CLIENTS; i++) {
if (serverClients[i] && serverClients[i].connected()) {
serverClients[i].write(sbuf, len);//向客户端发送数据
delay(1);
}
}
}
}


举报

相关推荐

0 条评论