文章目录
1. 硬件、接线、环境配置
- 【物联网初探】- 01 - ESP32 开发环境搭建 (Arduino IDE)
- 【物联网初探】- 02 - ESP32 利用 SPI 联通 TFT 彩屏 (Arduino IDE)
- 【物联网初探】- 03 - ESP32 结合 TFT_eSPI 库标定 TFT 触摸屏 (Arduino IDE)
- 【物联网初探】- 04 - ESP32 结合 LVGL 库开发环境搭建 (Arduino IDE)
- 【物联网初探】- 05 - ESP32 上 LVGL 库的多个例程测试 (Arduino IDE)
2. ESP32 下的 wifi 基本功能 (arduino)
- 头文件包含
#include <WiFi.h>
,arduino 官网文档 WiFi library。 - 很好的参考博客使用Arduino开发ESP32(03):WiFi基本功能使用
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 的极简释义
TCP
(Transmission Control Protocol,传输控制协议)是面向连接的协议,在收发数据前,必须和对方建立可靠的连接。UDP
(User 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 上的串口数据接收函数,本例程中没有写。