Files
fastbee/sdk/Arduino/ApConfig/ApConfig.ino
2022-07-20 00:19:05 +08:00

162 lines
3.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
const char *ap_ssid = "wumei_smart";
const char *ap_password = ""; //开放式网络
char sta_ssid[32] = {0};
char sta_password[64] = {0};
char sta_user_name[64] = {0};
IPAddress local_IP(192, 168, 4, 1);
IPAddress gateway(192, 168, 4, 1);
IPAddress subnet(255, 255, 255, 0);
void initApConfig();
void initWebServer();
void handleGet();
void handlePost();
void handleNotFound();
ESP8266WebServer server(80);
void setup(void)
{
//打开串行端口:
Serial.begin(115200);
// AP模式
initApConfig();
// web服务
initWebServer();
}
void loop(void)
{
// Web服务端
server.handleClient();
}
/**
* AP模式
*/
void initApConfig()
{
WiFi.mode(WIFI_AP_STA);
WiFi.softAPConfig(local_IP, gateway, subnet);
WiFi.softAP(ap_ssid, ap_password);
printMsg("已启动AP配网IP地址" + WiFi.softAPIP().toString());
}
/**
* 初始化webserver配置
*/
void initWebServer()
{
server.on("/", HTTP_GET, handleGet);
server.on("/", HTTP_POST, handlePost);
server.onNotFound(handleNotFound);
server.enableCORS(true);
server.begin();
printMsg("HTTP服务已启动");
}
/**
* 处理配网状态请求
*/
void handleGet()
{
printMsg("获取网络状态");
if (server.hasArg("deviceNum"))
{
printMsg("收到设备编号:" + server.arg("deviceNum"));
}
printMsg("连接WIFI");
WiFi.begin(sta_ssid, sta_password);
int cnt = 0;
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
cnt++;
Serial.print(".");
if (cnt >= 30)
{
printMsg("设备连接WIFI超时进入到AP配网模式!");
server.send(500, "text/plain;charset=utf-8", "设备连接WIFI超时配网失败");
initApConfig();
break;
}
}
if(WiFi.status() == WL_CONNECTED){
server.send(200, "text/plain;charset=utf-8", "设备已连接WIFI配网成功");
server.close();
WiFi.softAPdisconnect(false);
printMsg("Http服务和热点已关闭设备已连接WIFI配网成功");
}
}
/**
* 处理配网Post请求
*/
void handlePost()
{
printMsg("进入配网......");
// wifi名称、wifi密码、用户名
if (server.hasArg("SSID") && server.hasArg("password") && server.hasArg("userName"))
{
strcpy(sta_ssid, server.arg("SSID").c_str());
strcpy(sta_password, server.arg("password").c_str());
strcpy(sta_user_name, server.arg("userName").c_str());
printMsg("收到WIFI名称" + (String)sta_ssid);
printMsg("收到WIFI密码" + (String)sta_password);
printMsg("收到用户名称:" + (String)sta_user_name);
}
else
{
printMsg("配网必须传递用户名、WIFI名称和WIFI密码,配网失败");
server.send(500, "text/plain;charset=utf-8", "配网必须传递用户名、WIFI名称和WIFI密码配网失败");
return;
}
// 可选字段
if (server.hasArg("deviceNum"))
{
printMsg("收到设备编号:" + server.arg("deviceNum"));
}
if (server.hasArg("deviceName"))
{
printMsg("收到设备名称:" + server.arg("deviceName"));
}
if (server.hasArg("extra"))
{
printMsg("收到补充信息:" + server.arg("extra"));
}
server.send(200, "text/plain;charset=utf-8", "设备已完成配置连接Wifi中...");
}
void handleNotFound()
{
printMsg("进入预检请求或请求地址找不到");
if (server.method() == HTTP_OPTIONS)
{
// 处理浏览器跨域问题
server.sendHeader("Access-Control-Max-Age", "10000");
server.sendHeader("Access-Control-Allow-Methods", "PUT,POST,GET,OPTIONS");
server.sendHeader("Access-Control-Allow-Headers", "*");
server.send(204);
}
else
{
server.send(404, "text/plain;charset=utf-8", "请求的地址找不到或无法访问");
}
}
//打印提示信息
void printMsg(String msg)
{
Serial.print("\r\n[");
Serial.print(millis());
Serial.print("ms]");
Serial.print(msg);
}