【物联网初探】- 06 - ESP32 利用 wifi 进行 TCP 通信(Arduino IDE)

1. 硬件、接线、环境配置

2. ESP32 下的 wifi 基本功能 (arduino)

2.1 Wifi 模式切换
  • ESP32可设置wifi工作的三种模式,分别为 AP 自身热点模式、STA 连接外部wifi模式、AP+STA 混合模式。

  • 可通过 WiFi.mode(WIFI_MODE_XX); 来设置,其中 WIFI_MODE_XX 参数如下:

    typedef enum {
        WIFI_MODE_NULL = 0,  /**< null mode */
        WIFI_MODE_STA,       /**< WiFi station mode */
        WIFI_MODE_AP,        /**< WiFi soft-AP mode */
        WIFI_MODE_APSTA,     /**< WiFi station + soft-AP mode */
        WIFI_MODE_MAX
    } wifi_mode_t;
    
2.2 AP模式 - 开启 wifi 热点
  • 极简代码,只需调用该函数,即可开启一个名为ESP32的热点,此时模块自身IP默认为192.168.4.1

    WiFi.softAP("ESP32"); 
    
  • 常用代码,定义好wifi的名字、密码、自身IP、网关、子网掩码、并传入AP启动函数:

    #include <WiFi.h>
    const char *ssid = "ESP32_wifi";
    const char *password = "12345678";
    IPAddress local_IP(192,168,4,2);
    IPAddress gateway(192,168,4,9);
    IPAddress subnet(255,255,255,0);
    
    void setup() 
    {
      Serial.begin(9600);// 启动串口通讯
      WiFi.mode(WIFI_AP);//设置为接入点模式
      WiFi.softAPConfig(local_IP, gateway, subnet);//配置接入点的IP,网关IP,子网掩码
      Serial.printf("设置接入点中 ... ");
      WiFi.softAP(AP_ssid, password,3,1);//启动校验式网络(需要输入账号密码的网络),通道为3,wifi隐藏,最大连接数=4
      flag = WiFi.softAP(AP_ssid, password);//监控状态变量result 
      if(flag){
         Serial.println("开启成功");
      }else{
            Serial.println("开启失败");
      }
    }
    void loop() {}
    
2.3 STA模式 - 连接已有 wifi
  • 极简代码,只需指定 wifi 的名字和密码即可连接。

    WiFi.begin(ssid, password);
    
  • 常用代码,

    #include <WiFi.h>
    
    const char *ssid = "********"; //网络名称
    const char *password = "********"; //网络密码
    
    void setup()
    {
      Serial.begin(9600);
      Serial.println();
      WiFi.begin(ssid, password); //连接网络
      while (WiFi.status() != WL_CONNECTED) //等待网络连接成功
      {
        delay(500);
        Serial.print(".");
      }
      Serial.println("WiFi connected, IP address: ");
      Serial.println(WiFi.localIP()); //打印模块IP
    }
    
    void loop(){}
    

3. ESP32 下 TCP server/client 通信

3.1 TCP / UDP 的极简释义
  • TCPTransmission Control Protocol,传输控制协议)是面向连接的协议,在收发数据前,必须和对方建立可靠的连接。
  • UDPUser Data Protocol,用户数据报协议)是一个非连接的协议,传输数据之前源端和终端不建立连。
  • 简单解释,TCP必须客户端和服务端连接上才能收发数据,UDP则是数据都扔在网上,谁用谁收,谁有谁发。
3.2 ESP32 TCP 通信小例子
3.2.1 准备工具
  • 网络调试助手,linux 下我使用了 NetAssistant - github ,任意能够创建 TCP 客户端的小工具都可以,利用 python 也可以,下面我以 NetAssistant 为例。
3.2.2 通信流程
  • 当服务端和客户端在同一网络下,ESP32作为客户端,其他主机作为服务端,基本的代码思路如下:

    • 第一步: 以家庭 wifi 为例,先确定服务端主机的 IP 和端口号,这里我在 ubuntu 主机上利用 NetAssistant 建立一个 TCP 服务器,IP 为本机 IP,端口号随意设置为 56050,点击连接网络,就建立好了服务端。

      在这里插入图片描述

    • 第二步: ESP32使用STA模式连接家庭wifi,并建立客户端,与服务端建立连接,并在建立的TCP连接上互相通信。

      #include <WiFi.h>
      
      const char *ssid = "xxx"; //wifi名
      const char *password = "xxx";//wifi密码
      
      const IPAddress serverIP(192,168,31,133); //欲访问的服务端IP地址
      uint16_t serverPort = 56050;         //服务端口号
      
      WiFiClient client; //声明一个ESP32客户端对象,用于与服务器进行连接
      
      void setup()
      {
          Serial.begin(115200);
          Serial.println();
      
          WiFi.mode(WIFI_STA);
          WiFi.setSleep(false); //关闭STA模式下wifi休眠,提高响应速度
          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);
      }
      
    • 第三步: 连接测试,保持 NetAssistant 上的服务端运行,ESP32 连接在电脑上,打开 Arduino 的串口监视器,设置好波特率,烧录程序至ESP32,成功后即会显示如下信息(wifi连接正常),此时 NetAssistant 上的窗口也会收到ESP32发送的**“Hello world!”**字符串,到这里测试基本结束。

3.2.3 简单测试
  • 可以在 NetAssistant 上发送任意字符至ESP32客户端,在 Arduino 的串口监视器中即可接收到,例如我在NetAssistant 上发送了 “esp32 TCP test !!!”,如下图所示。反向传输的话需要自己写个 arduino 上的串口数据接收函数,本例程中没有写。 在这里插入图片描述
  • 64
    点赞
  • 393
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值