新闻  |   论坛  |   博客  |   在线研讨会
掌握了这些,学习ESP8266 TCP,如鱼得水
Linux嵌入式 | 2023-01-05 11:57:36    阅读:356   发布文章

TCP是网络应用中常用的功能,很多高级功能的实现也是建立在TCP的基础上的,学会使用TCP后我们就可以在此基础上实现很多与网络相关的操作。

TCP Client模式是我们最常用的一种网络通讯模式,主要是用来访问服务器的,很多可以通过外网访问的物联网设备主要就是工作在TCP Client下。设备主动去访问外部的服务器,与服务器建立连接。下面我们来学习如何使用操作TCP。

客服端访问服务器流程:

· 连接到Wi-Fi

· 选择服务器

· 实例化客户端

· 连接到服务器

· 向服务器请求数据

· 读取来自服务器的回复

相关函数介绍

1.WiFiClient

创建一个客户端,该客户端可以连接到client.connect()中定义的指定的网络IP地址和端口。

WiFiClient client;

2.connected()

检查客户端是否已连接。请注意,如果连接已关闭但仍存在未读数据,则认为客户端已连接。

句法

client.connected()

if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
for(;;)

参数:没有

返回值:如果客户端已连接,则返回true,否则返回false。

3.connect()

连接到构造函数中指定的IP地址和端口。返回值指示成功或失败。使用域名(ex:google.com)时,connect()还支持DNS查找。

句法:

client.connect(ip,端口)

client.connect(URL,端口)

参数

ip:客户端将连接的IP地址(4个字节的数组)

URL:客户端将连接到的域名(字符串,例如:“ arduino.cc”)

Port:客户端将连接到的端口(int)

返回值:如果连接成功,则返回true;否则,返回false。

4.write()

将数据写入客户端连接到的服务器。

句法

client.write(data)

参数

data:要写入的字节或字符

返回值:写入的字符数。无需读取此值。

5.print()

将数据打印到客户端连接到的服务器。将数字打印为数字序列,每个数字为一个ASCII字符(例如,数字123作为三个字符“ 1”,“ 2”,“ 3”发送)。

句法

client.print(data)

client.print(data,BASE)

参数

data:要打印的数据(char,byte,int,long或string)

BASE(可选):打印数字的基数:DEC代表十进制(基数10),OCT代表八进制(基数8),HEX代表十六进制(基数16)。

返回值:写入的字节数

6.println()

打印数据,后跟回车符和换行符,打印到客户端连接到的服务器。将数字打印为数字序列,每个数字为一个ASCII字符(例如,数字123作为三个字符“ 1”,“ 2”,“ 3”发送)。用法同print。

7.available()

描述

返回可用于读取的字节数(即,它所连接的服务器已将其写入客户端的数据量)。available()从Stream实用程序类继承。

句法

client.available()

参数:没有

返回值:可用字节数。

if (client.available())

{
char c = client.read();

Serial.print(c);

}

8.read()

读取从客户端连接到的服务器接收到的下一个字节(在对read()的最后一次调用之后)。read()从Stream实用程序类继承。

句法

client.read()

参数:没有

返回值:下一个字节(或字符);如果没有可用字节,则为-1。

9.flush()

丢弃已写入客户端但尚未读取的所有字节。flush()从Stream实用程序类继承。

句法

client.flush()

参数:没有

返回值:无

10.stop()

断开与服务器的连接

句法

client.stop()

参数:没有

返回值:无

了解完相关的函数和流程之后,我们来用实例练习一下,该实例的功能是每5秒访问一次百度,并将返回的数据从串口打印出来。

const char* ssid = "********";const char* password = "********";
 const char* host = "www.example.com";
 
 void setup(){
  Serial.begin(115200);
  Serial.println();
 
  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" connected");
}
 
 void loop(){
  WiFiClient client;
 
  Serial.printf("\n[Connecting to %s ... ", host);
  if (client.connect(host, 80))
  {
    Serial.println("connected]");
 
    Serial.println("[Sending a request]");
    client.print(String("GET /") + " HTTP/1.1\r\n" +
                 "Host: " + host + "\r\n" +
                 "Connection: close\r\n" +
                 "\r\n"                );
 
    Serial.println("[Response:]");
    while (client.connected() || client.available())
    {
      if (client.available())
      {
        String line = client.readStringUntil('\n');
        Serial.println(line);
      }
    }
    client.stop();
    Serial.println("\n[Disconnected]");
  }
  else  {
    Serial.println("connection failed!]");
    client.stop();
  }
  delay(5000);
}
程序运行结果如下所示:




*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
工科男,多年嵌入式工作者,每日分享工作中常遇到的一些“坑”
推荐文章
最近访客