ESP8266 Arduino开发之路(3)— 作为TCP客户端连接到服务器_Willliam_william的博客-程序员秘密_esp8266连接服务器

技术标签: ESP8266  

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进行网络通信

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38113006/article/details/118075751

智能推荐

双一流博士导师整理:最新的计算机视觉学习路线(含时间分配建议)_woshicver的博客-程序员秘密

因工作需要,年初花了4个月左右时间学习了机器学习、神经网络相关的知识,工作日每天大概学习4-6个小时,周末每天大概10个小时,工作中的需求应对也得心应手了。想快速入门的话,从自己的经验看,...

关于Erlang/OTP的application参数配置 erlang app 文件_sdsabc2000的博客-程序员秘密

应用的概念¶ 当我们写了实现特定功能的代码之后,我们可能想将代码转成一个 应用 (application),这是可以作为一个单元启动和停止的组建,同时它也可以在其他系统中被重用。 我们要创建一个 应用回调模块 ,其中描述了该应用应该如何被启动和停止。 然后,需要一个应用规格,它被放在一个 应用资源文件 。我们还指定该应用由哪些模块组成,以及各个回掉模块的名字。

MySQL学习笔记_不会写代码的满满的博客-程序员秘密_mysql学习记录

文章目录记录一下自己学习MySQL的一些笔记 以后忘记了还可以重新回来翻一翻笔记哈!!!数据库什么是数据库?什么是数据库管理系统?什么是SQL?他们之间的关系是什么?数据库: 英文单词DataBase,简称DB。按照一定格式存储数据的一些文件的组合。 顾名思义:存储数据的仓库,实际上就是一堆文件。这些文件中存储了具有特定格式的数据。数据库管理系统: DataBaseManagement,简称DBMS。 数据库管理系统是专门用来管理数据库中数据的,数据库管理系统可以对数据库当中的

量化研究 | 残差动量策略刻画与构建(一)_松鼠宽客的博客-程序员秘密

致力于分享量化策略,培训视频,Python,程序化交易等相关内容

随便推点

综述 | 基于深度学习的目标检测算法_夕小瑶的博客-程序员秘密

计算机视觉是人工智能的关键领域之一,是一门研究如何使机器“看”的科学。图像目标检测又是计算机视觉的关键任务,主要对图像或视频中的物体进行识别和定位,是AI后续应用的基础。因此,检测性能的好坏直接影响到后续目标 追踪、动作识别的性能。传统图像目标检测的滑窗法虽然简单易于理解,但随目标大小而变化的窗口对图像进行从左 至右、从上至下的全局搜索导致效率低下。1为了在滑动窗口检测器...

R语言使用dataframe中的多个数据列相加形成新的向量、将向量数据除以一个固定值并并入dataframe中_sdgfbhgfj的博客-程序员秘密_r语言数据框相加

R语言使用dataframe中的多个数据列相加形成新的向量、将向量数据除以一个固定值并并入dataframe中

守护进程-_柯小诺的博客-程序员秘密_守护进程

守护进程运行周期长,在后台运行,不和用户交互会话:会话是一个或多个进程组的集合。会话首进程:创建此会话的进程,会话首进程的进程ID是会话ID,首进程是其所在的进程组的组长进程,因为在其创建一个会话的同时已经变成了一个组长进程。进程组:每个进程属于一个进程组,进程组是一个或多个进程的集合,每个进程有一个唯一的进程组ID。组长进程:每个进程组可以有个组长进程,组长进程的ID就是进程组的ID;组长进程可以创建进程组以及该组中的进程;进程组的创建从第一个进程(组长进程)加入开始;进程组的组号取第一个加入组

推荐文章

热门文章

相关标签