ESP32 S3 基于Arduino验证WIFI AP模式及WIFI Station模式-综合

572 阅读4分钟

1 WIFI 验证AP模式(S3建立连接点,所有设备连接到S3,此时S3类似路由器)

#include <Arduino.h>
#include "WiFi.h"

void setup()
{
  USBSerial.begin(115200);
  WiFi.softAP("ESP_AP", "12345678");
}
void loop()
{
  USBSerial.print("主机名:");
  USBSerial.println(WiFi.softAPgetHostname());
  USBSerial.print("主机IP:");
  USBSerial.println(WiFi.softAPIP());
  USBSerial.print("主机IPV6:");
  USBSerial.println(WiFi.softAPIPv6());
  USBSerial.print("主机SSID:");
  USBSerial.println(WiFi.SSID());
  USBSerial.print("主机广播IP:");
  USBSerial.println(WiFi.softAPBroadcastIP());
  USBSerial.print("主机mac地址:");
  USBSerial.println(WiFi.softAPmacAddress());
  USBSerial.print("主机连接个数:");
  USBSerial.println(WiFi.softAPgetStationNum());
  USBSerial.print("主机网络ID:");
  USBSerial.println(WiFi.softAPNetworkID());
  USBSerial.print("主机状态:");
  USBSerial.println(WiFi.status());
  delay(1000);
}

2 WIFI 验证Station模式(S3连接到路由器wifi,此时S3类似一台待上网的手机)

2.1 station模式下WIFI详细信息

#include <Arduino.h>
#include "WiFi.h"

// station 模式
void setup()
{
  USBSerial.begin(115200);
  WiFi.begin("wifiname", "qkx20212021");
  WiFi.setAutoReconnect(true);
}

void loop()
{
  USBSerial.print("是否连接:");
  USBSerial.println(WiFi.isConnected());
  USBSerial.print("本地IP:");
  USBSerial.println(WiFi.localIP());
  USBSerial.print("本地IPv6:");
  USBSerial.println(WiFi.localIPv6());
  USBSerial.print("mac地址:");
  USBSerial.println(WiFi.macAddress());
  USBSerial.print("网络ID:");
  USBSerial.println(WiFi.networkID());
  USBSerial.print("休息:");
  USBSerial.println(WiFi.getSleep());
  USBSerial.print("获取状态码:");
  USBSerial.println(WiFi.getStatusBits());
  USBSerial.print("getTxPower:");
  USBSerial.println(WiFi.getTxPower());
  USBSerial.print("是否自动连接:");
  USBSerial.println(WiFi.getAutoConnect());
  USBSerial.print("是否自动重连:");
  USBSerial.println(WiFi.getAutoReconnect());
  USBSerial.print("获取模式:");
  USBSerial.println(WiFi.getMode());
  USBSerial.print("获取主机名:");
  USBSerial.println(WiFi.getHostname());
  USBSerial.print("获取网关IP:");
  USBSerial.println(WiFi.gatewayIP());
  USBSerial.print("dnsIP:");
  USBSerial.println(WiFi.dnsIP());
  USBSerial.print("状态:");
  USBSerial.println(WiFi.status());

  USBSerial.println();
  USBSerial.println();
  delay(1000);
}

2.2 station模式下同步进行WIFI扫描

#include <Arduino.h>
#include "WiFi.h"

String ssid;
String password;
void setup()
{
  USBSerial.begin(115200);
  WiFi.mode(WIFI_MODE_STA);
  WiFi.disconnect(); //断开可能的连接
  delay(100);
  USBSerial.println("开始扫描WIFI:");
  int n = WiFi.scanNetworks();
  if (n)
  {
    USBSerial.print("扫描到");
    USBSerial.print(n);
    USBSerial.println("个WIFI");
    for (size_t i = 0; i < n; i++)
    {
      USBSerial.print("WiFi的名称(SSID):");
      USBSerial.println(WiFi.SSID(i));
      USBSerial.print("WiFi的信号强度(RSSI):");
      USBSerial.println(WiFi.RSSI(i));
      USBSerial.print("WiFi加密与否:");
      USBSerial.println(WiFi.encryptionType(i) == WIFI_AUTH_OPEN ? "未加密" : "加密");

      if (WiFi.SSID(i) == "kaixin")
      {
        ssid = WiFi.SSID(i);
        password = "qkx20212021";
      }
      USBSerial.println();
    }
  }
  else
  {
    USBSerial.println("没扫描到WIFI");
  }
  WiFi.begin(ssid.c_str(), password.c_str());
  //WiFi.setAutoReconnect(true);
  while (!WiFi.isConnected())
  {
    USBSerial.println(">>>>>>>>>");
  }
  USBSerial.println("连接成功");
}
void loop()
{
  
}

2.3 station模式下异步进行WIFI扫描

#include <Arduino.h>
#include "WiFi.h"
#include "Ticker.h"

String ssid = "";
String password = "";
Ticker t1;

void aysncScanHandler()
{
  if (!WiFi.isConnected())
  {
    int wifiScanStatus = WiFi.scanComplete();
    switch (wifiScanStatus)
    {
      case -1:
        USBSerial.println("扫描中...");
        break;
      case -2:
        USBSerial.println("未进行扫描...");
        break;
      default:
        USBSerial.println("扫描完成");
      for (size_t i = 0; i < wifiScanStatus; i++)
      {
        USBSerial.print("WiFi的名称(SSID):");
        USBSerial.println(WiFi.SSID(i));
        USBSerial.print("WiFi的信号强度(RSSI):");
        USBSerial.println(WiFi.RSSI(i));
        USBSerial.print("WiFi加密与否:");
        USBSerial.println(WiFi.encryptionType(i) == WIFI_AUTH_OPEN ? "未加密" : "加密");

        if (WiFi.SSID(i) == "kaixin")
        {
          ssid = WiFi.SSID(i);
          password = "qkx20212021";
        };
      }
      WiFi.scanDelete();
      t1.detach();
      break;
    }
  }
}

void connectAnny()
{
  WiFi.begin();
  while (!WiFi.isConnected())
  {
    USBSerial.println(">>>>>>>");
  }
  USBSerial.println("连接成功");
}

void setup()
{
  USBSerial.begin(115200);
  WiFi.mode(WIFI_MODE_STA);
  WiFi.disconnect(); //断开可能的连接
  delay(100);
  USBSerial.println("开始扫描WIFI:");
  WiFi.scanNetworks(true);
  t1.attach(0.5, aysncScanHandler);
}
void loop()
{
  if (!WiFi.isConnected())
  {
    if (ssid == "kaixin")
    {
      USBSerial.println(ssid);
      connectAnny();
    }
  }
}

采用异步扫描方式, 每隔0.5秒询问一下WiFi.scanComplete();判断是否扫描完毕.PNG

3 WIFI UDP

/*
 *  This sketch sends random data over UDP on a ESP32 device
 *
 */
#include <WiFi.h>
#include <WiFiUdp.h>

WiFiUDP Udp;//声明UDP对象

const char* wifi_SSID="ESP_AP";  //存储AP的名称信息
const char* wifi_Password="12345678";  //存储AP的密码信息

uint16_t udp_port=1122;  //存储需要监听的端口号

char incomingPacket[255];  //存储Udp客户端发过来的数据

void setup() {
  // put your setup code here, to run once:
  USBSerial.begin(115200);  //开启串口,波特率为115200
  WiFi.softAP(wifi_SSID,wifi_Password);  //打开ESP32热点

  USBSerial.println("\n开发板IP地址为:");
  USBSerial.println(WiFi.softAPIP());  //串口输出模块IP地址

  Udp.begin(udp_port);//启动UDP监听这个端口
}

void loop() {

  /*接收发送过来的Udp数据*/
  int Data_length=Udp.parsePacket();  //获取接收的数据的长度
  if(Data_length)  //如果有数据那么Data_length不为0,无数据Data_length为0
  {
    int len = Udp.read(incomingPacket, 255);  //读取数据,将数据保存在数组incomingPacket中
    if (len > 0)  //为了避免获取的数据后面乱码做的判断
    {
      incomingPacket[len] = 0;
    }
    
    /*将接受到的数据发送回去*/
    Udp.beginPacket(Udp.remoteIP(),Udp.remotePort());  //准备发送数据到目标IP和目标端口
    Udp.println("receive data:");  //将数据receive data:放入发送的缓冲区
    Udp.println(incomingPacket);  //将接收到的数据放入发送的缓冲区
    Udp.endPacket();  //向目标IP目标端口发送数据
  }
}

4 WIFI TCP

#include <WiFi.h>

const char *ssid = "kaixin"; //wifi名
const char *password = "qkx20212021";//wifi密码

const IPAddress serverIP(192,168,146,222); //欲访问的服务端IP地址
uint16_t serverPort = 1234;         //服务端口号

WiFiClient client; //声明一个ESP32客户端对象,用于与服务器进行连接

void setup()
{
    USBSerial.begin(115200);
    USBSerial.println();

    WiFi.mode(WIFI_STA);
    WiFi.setSleep(false);   //关闭STA模式下wifi休眠,提高响应速度
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(500);
        USBSerial.print(".");
    }
    USBSerial.println("Connected");
    USBSerial.print("IP Address:");
    USBSerial.println(WiFi.localIP());
}

void loop()
{
    USBSerial.println("尝试访问服务器");
    if (client.connect(serverIP, serverPort)) //尝试访问目标地址
    {
        USBSerial.println("访问成功");
        USBSerial.print("Hello world!");                    //向服务器发送数据
        while (client.connected() || client.available()) //如果已连接或有收到的未读取的数据
        {
            if (client.available()) //如果有数据可读取
            {
                String line = client.readStringUntil('\n');  //读取数据到换行符
                USBSerial.print("读取到数据:");
                USBSerial.println(line);
                client.write(line.c_str()); //将收到的数据回发
            }
        }
        USBSerial.println("关闭当前连接");
        client.stop(); //关闭客户端
    }
    else
    {
        USBSerial.println("访问失败");
        client.stop(); //关闭客户端
    }
    delay(5000);
}

5 WIFI HTTP

/**
通过getString方法获取网络时间和气象数据

*/

#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <WiFiClientSecure.h>

// 测试HTTP请求用的URL
#define URL "http://www.weather.com.cn/data/sk/101180901.html"
//填写WIFI入网信息
const char* ssid     = "kaixin";     // WIFI账户
const char* password = "qkx20212021"; // WIFI密码

void setClock() {

  //对于我们东八区,8 * 3600,使用夏令时 
  configTime(8 * 3600, 0, "2.cn.pool.ntp.org", "time.nist.gov","3.cn.pool.ntp.org");

  USBSerial.print(F("Waiting for NTP time sync: "));
  time_t nowSecs = time(nullptr);
  while (nowSecs < 8 * 3600 * 2) {
    delay(500);
    Serial.print(F("."));
    yield();
    nowSecs = time(nullptr);
  }
  USBSerial.println();
  struct tm timeinfo;
    if (!getLocalTime(&timeinfo))
    {
        USBSerial.println("Failed to obtain time");
        return;
    }
    USBSerial.println(&timeinfo, "%F %T %A"); // 格式化输出:2021-10-24 23:00:44 Sunday
}


void setup() {

  USBSerial.begin(115200);
  // Serial.setDebugOutput(true);
  USBSerial.println();
  for(uint8_t t = 4; t > 0; t--) {
          USBSerial.printf("[SETUP] WAIT %d...\n", t);
          USBSerial.flush();
          delay(1000);
  }

  //设置ESP32工作模式为WIFI_STA
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    USBSerial.print(".");
    // wait 1 second for re-trying
    delay(1000);
  }
  USBSerial.println(" connected");
  setClock();  
}

void loop() {
    
    HTTPClient https;  
    USBSerial.print("[HTTPS] begin...\n");
    //配置请求地址。此处也可以不使用端口号和PATH而单纯的
    https.begin(URL); 
    USBSerial.print("URL: "); 
    USBSerial.println(URL);
      //启动连接并发送HTTP请求
    int httpCode = https.GET();
    if (httpCode > 0) {
      // HTTP header has been send and Server response header has been handled
      USBSerial.printf("[HTTPS] GET... code: %d\n", httpCode); 
      // file found at server
      if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
        String payload = https.getString();
        USBSerial.println(payload);
      }
    } else {
      USBSerial.printf("[HTTPS] GET... failed, error: %s\n", https.errorToString(httpCode).c_str());
    }
  
    https.end();

  USBSerial.println();
  USBSerial.println("Waiting 10s before the next round...");
  delay(10000);
}