ESP8266 Arduino开发之路(3)— 作为TCP客户端连接到服务器

ESP8266 Arduino开发之路(3)— 作为TCP客户端连接到服务器

一、前言

在上一篇我们已经成功连接到网络了,接下来就可以尝试建立TCP连接了。
接下来我们将ESP8266作为TCP客户端来连接到服务器。

二、建立连接

编写代码如下所示

/*
  ESP8266-NodeMCU作为TcpClient连接到服务器
*/
 
#include <ESP8266WiFi.h>                        // 本程序使用ESP8266WiFi库

const char* ssid     = "SixLab";                // 需要连接到的WiFi名
const char* password = "sixlab123";             // 连接的WiFi密码
                                            
void setup() {
  Serial.begin(115200);                         // 初始化串口通讯波特率为115200

  WiFi.mode(WIFI_STA);                          // 设置Wifi工作模式为STA,默认为AP+STA模式
  WiFi.begin(ssid, password);                   // 通过wifi名和密码连接到Wifi
  Serial.print("\r\nConnecting to ");           // 串口监视器输出网络连接信息
  Serial.print(ssid); Serial.println(" ...");   // 显示NodeMCU正在尝试WiFi连接
  
  int i = 0;                                    // 检查WiFi是否连接成功
  while (WiFi.status() != WL_CONNECTED)         // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 
  {                                             // 如果WiFi连接成功则返回值为WL_CONNECTED
    delay(1000);                                // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值
    Serial.print("waiting for ");                          
    Serial.print(i++); Serial.println("s...");       
  }                                             
                                               
  Serial.println("");                           // WiFi连接成功后
  Serial.println("WiFi connected!");            // NodeMCU将通过串口监视器输出"连接成功"信息。
  Serial.print("IP address: ");                 // 同时还将输出NodeMCU的IP地址。这一功能是通过调用
  Serial.println(WiFi.localIP());               // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。
}

const char* host = "192.168.3.2";
const uint16_t port = 8266;

void loop() {
  /* 新建一个WiFiClient类对象,作为TCP客户端对象 */
  WiFiClient tcpclient;

  /* 建立TCP连接 */
  Serial.print("connecting to "); Serial.print(host); Serial.print(':'); Serial.println(port);
  if (!tcpclient.connect(host, port)) {
    Serial.println("connection failed");        // 如果连接失败,则打印连接失败信息,并返回
    delay(5000);
    return;
  }
  
  /* LED闪烁 */
  pinMode(2, OUTPUT);
  while(1){
    digitalWrite(2, LOW);
    delay(300);
    digitalWrite(2, HIGH);
    delay(300);  
  }
}

使用网络调试助手创建一个TCP服务器,端口号设置为8266
在这里插入图片描述编译烧录运行,可以看到可以连接到tcp服务器
在这里插入图片描述

三、收发数据

修改代码如下所示

/*
  ESP8266-NodeMCU作为TcpClient连接到服务器
*/
 
#include <ESP8266WiFi.h>                        // 本程序使用ESP8266WiFi库

const char* ssid     = "SixLab";                // 需要连接到的WiFi名
const char* password = "sixlab123";             // 连接的WiFi密码
                                            
void setup() {
  Serial.begin(115200);                         // 初始化串口通讯波特率为115200

  WiFi.mode(WIFI_STA);                          // 设置Wifi工作模式为STA,默认为AP+STA模式
  WiFi.begin(ssid, password);                   // 通过wifi名和密码连接到Wifi
  Serial.print("\r\nConnecting to ");           // 串口监视器输出网络连接信息
  Serial.print(ssid); Serial.println(" ...");   // 显示NodeMCU正在尝试WiFi连接
  
  int i = 0;                                    // 检查WiFi是否连接成功
  while (WiFi.status() != WL_CONNECTED)         // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 
  {                                             // 如果WiFi连接成功则返回值为WL_CONNECTED
    delay(1000);                                // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值
    Serial.print("waiting for ");                          
    Serial.print(i++); Serial.println("s...");       
  }                                             
                                               
  Serial.println("");                           // WiFi连接成功后
  Serial.println("WiFi connected!");            // NodeMCU将通过串口监视器输出"连接成功"信息。
  Serial.print("IP address: ");                 // 同时还将输出NodeMCU的IP地址。这一功能是通过调用
  Serial.println(WiFi.localIP());               // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。
}

const char* host = "192.168.3.2";
const uint16_t port = 8266;

void loop() {
  /* 新建一个WiFiClient类对象,作为TCP客户端对象 */
  WiFiClient tcpclient;

  /* 建立TCP连接 */
  Serial.print("connecting to "); Serial.print(host); Serial.print(':'); Serial.println(port);
  if (!tcpclient.connect(host, port)) {
    Serial.println("connection failed");        // 如果连接失败,则打印连接失败信息,并返回
    delay(5000);
    return;
  }

  /* 如果连接成功,则发送一个字符串到TCP服务器 */
  Serial.println("Connected to TCPServer, sending data to server");
  if (tcpclient.connected()) {
    tcpclient.println("hello, I am ESP8266.");
  }

  /* 等待TCP服务器返回消息 */
  Serial.println("waiting for receive from remote Tcpserver...");
  while (tcpclient.available() == 0) {}
  Serial.println("received data:");
  while (tcpclient.available()) {
    char ch = static_cast<char>(tcpclient.read());
    Serial.print(ch);
  }
  Serial.println();

  /* 接受到服务器返回的消息后关闭TCP连接 */
  Serial.println("closing connection");
  tcpclient.stop();

  /* LED闪烁 */
  pinMode(2, OUTPUT);
  while(1){
    digitalWrite(2, LOW);
    delay(300);
    digitalWrite(2, HIGH);
    delay(300);  
  }
}

编译烧录运行后可以看到运行结果如下所示,成功发送和接受到数据
在这里插入图片描述

四、附录

上一篇:ESP8266 Arduino开发之路(2)— 连接到无线WiFi路由器
下一篇:ESP8266 Arduino开发之路(4)— 通过HTTP进行网络通信

  • 16
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是用Arduino写一个ESP32作为TCP客户端连接TCP服务器的示例代码: ```C++ #include <WiFi.h> #include <WiFiClient.h> // 定义WiFi网络的名称和密码 const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; // 定义TCP服务器的IP地址和端口号 const char* serverIP = "192.168.1.100"; const int serverPort = 8080; void setup() { Serial.begin(115200); // 连接到WiFi网络 WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi."); // 创建TCP客户端 WiFiClient client; // 连接TCP服务器 if (client.connect(serverIP, serverPort)) { Serial.println("Connected to TCP server."); // 向TCP服务器发送数据 client.println("Hello, TCP server!"); // 等待TCP服务器的响应 while (client.available()) { String response = client.readStringUntil('\n'); Serial.println("Received response from TCP server: " + response); } // 关闭TCP连接 client.stop(); } else { Serial.println("Failed to connect to TCP server."); } } void loop() { // 无需执行任何操作 } ``` 在代码中,首先定义了WiFi网络的名称和密码以及TCP服务器的IP地址和端口号。然后使用`WiFi`库连接到WiFi网络,并创建一个`WiFiClient`对象作为TCP客户端。接下来,调用`connect()`方法连接TCP服务器,并向服务器发送数据。最后,使用`available()`方法等待TCP服务器的响应,并在收到响应后关闭TCP连接。 请注意,此代码仅用于示例目的。在实际应用中,您可能需要添加错误处理和重试逻辑,以确保程序在网络故障或服务器故障时能够正确处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值