|
求助 web配置blinker秘钥和网络 高手给指点下 失败原因
#define BLINKER_WIFI
#include <Blinker.h> //设置点灯科技类库
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
//初始blinker的三个参数
char sta_miyao[] = ""; //设备key,打开点灯app,添加设备,选择arduino设备,选择wifi接入,这里就会获得一个密钥,把密钥填写在这里。
char sta_ssid[] = ""; //路由器wifi ssid
char sta_password[] = ""; //路由器wifi 密码
int pinRelay = 0;
// 新建blinker.app组件对象
BlinkerButton Button1("btn-abc");//在点灯科技app里面新建一个开关按钮 名字命名为btn-abc
BlinkerNumber Number1("num-abc");
//暂时存储wifi账号密码
const char* AP_NAME = "配网WIFI";//wifi名字
//配网页面代码 放进数组指针里
const char* page_html = "\
<!DOCTYPE html>\r\n\
<html lang='en'>\r\n\
<head>\r\n\
<meta charset='UTF-8'>\r\n\
<meta name='viewport' content='width=device-width, initial-scale=1.0'>\r\n\
<title>Document</title>\r\n\
</head>\r\n\
<body>\r\n\
<form name='input' action='/' method='POST'>\r\n\
wifi名称: <br>\r\n\
<input type='text' name='ssid'><br>\r\n\
wifi密码:<br>\r\n\
<input type='text' name='password'><br>\r\n\
blinker密钥:<br>\r\n\
<input type='text' name='miyao'><br>\r\n\
<input type='submit' value='保存'>\r\n\
</form>\r\n\
</body>\r\n\
</html>\r\n\
";
const byte DNS_PORT = 53;//DNS端口号
IPAddress apIP(192, 168, 4, 1);//esp8266-AP-IP地址
DNSServer dnsServer;//创建dnsServer实例
ESP8266WebServer server(80);//创建WebServer
//////////////////////////////从这里开始才是正式的函数////////////////////////////////////
void handleRoot() { //访问主页回调函数 访问主页时的函数
server.send(200, "text/html", page_html);
}
////////////////////////////////////////////////////////////////////////////////////////
//Post回调函数
void handleRootPost() {
Serial.println("handleRootPost");
//判断是否有账号参数
if (server.hasArg("ssid")) {
Serial.print("输入无线名称: ");
strcpy(sta_ssid, server.arg("ssid").c_str());//将账号参数拷贝到sta_ssid中
Serial.println(sta_ssid);
} else {//没有参数
Serial.println("error, not found ssid");
server.send(200, "text/html", "<meta charset='UTF-8'>error, not found ssid");//返回错误页面
return;
}
//密码与账号同理
if (server.hasArg("password")) {
Serial.print("输入无线密码: ");
strcpy(sta_password, server.arg("password").c_str());
Serial.println(sta_password);
} else {
Serial.println("error, not found password");
server.send(200, "text/html", "<meta charset='UTF-8'>error, not found password");
return;
}
//密钥与账号同理
if (server.hasArg("miyao")) {
Serial.print("输入电灯密钥: ");
strcpy(sta_miyao, server.arg("miyao").c_str());
Serial.println(sta_miyao);
} else {
Serial.println("error, not found miyao");
server.send(200, "text/html", "<meta charset='UTF-8'>error, not found password");
return;
}
//返回保存成功页面
server.send(200, "text/html", "<meta charset='UTF-8'>保存成功");
//连接wifi
connectNewWifi();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void initSoftAP(void) { //初始化AP模式
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
if (WiFi.softAP(AP_NAME)) {
Serial.println("ESP8266 SoftAP is right");
}
}
/////////////////////////////////////////////////强制访问主页函数///////////////////////////////////////////////////////
void initWebServer(void) { //初始化WebServer
//server.on("/",handleRoot);
//上面那行必须以下面这种格式去写否则无法强制门户
server.on("/", HTTP_GET, handleRoot);//设置主页回调函数
server.onNotFound(handleRoot);//设置无法响应的http请求的回调函数
server.on("/", HTTP_POST, handleRootPost);//设置Post请求回调函数
server.begin();//启动WebServer
Serial.println("WebServer started!");
}
/////////////////////////////////初始化DNS服务器////////////////////////////////////////////////////////////////////////
void initDNS(void) {
if (dnsServer.start(DNS_PORT, "*", apIP)) { //判断将所有地址映射到esp8266的ip上是否成功
Serial.println("start dnsserver success.");
}
else Serial.println("start dnsserver failed.");
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
void connectNewWifi(void)
{
Blinker.begin(sta_miyao,sta_ssid,sta_password);
Serial.print(Blinker.connect());
delay(5000);
Serial.println("");
Serial.print("正在尝试连接wifi");
Serial.println("");
int count = 0;
while (Blinker.connect()==0)
{
Blinker.connect();
delay(1000);
count++;
Serial.println(count);
if (count > 20) { //如果10秒内没有连上,就开启Web配网 可适当调整这个时间
initSoftAP();
initWebServer();
initDNS();
break;//跳出 防止无限初始化
}
Serial.print(".");
}
Serial.println(" ");
if (Blinker.connect())
{ //如果连接上 就输出IP信息 防止未连接上break后会误输出
Serial.println("WIFI Connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());//打印esp8266的IP地址
server.stop();
}
}
void heartbeat() //心跳包
{
Button1.icon("fas fa-lightbulb");
Button1.color("#fddb00");
Button1.text("关灯", "打开啦");
Number1.print(WiFi.RSSI()); //信号强度
}
// 按下按键即会执行该函数
void button1_callback(const String & state) //查找日志文件 把结果写进定义的字符串state中
{
BLINKER_LOG("get button state:", state); //获取按钮状态 写进字符串
if (state == "on") //如果按钮状态为开
{
digitalWrite(LED_BUILTIN, LOW); //把内置led状态设置为低电平
digitalWrite(pinRelay, LOW); //继电器给低电平
// 反馈开关状态
Button1.print("on"); //把按钮状态更改为开
}
else if (state == "off") //如果按钮状态为关
{
digitalWrite(LED_BUILTIN, HIGH); //把内置led状态设置为高电平
// 反馈开关状态
digitalWrite(pinRelay, HIGH); //继电器给高电平
Button1.print("off"); //把按钮状态更改为关
}
}
void setup()
{
Serial.begin(115200);
WiFi.hostname("Smart-ESP8266");//设置ESP8266设备名
pinMode(LED_BUILTIN, OUTPUT); //LED_BUILTIN 宏就是开发板指示灯的io口 // 初始化有LED的IO
pinMode(pinRelay, OUTPUT); //0号端口为输出模式
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(pinRelay, LOW);
connectNewWifi(); // /////////////////////调用配网函数
}
void loop() {
server.handleClient(); //启动客户端函数
dnsServer.processNextRequest(); //启动dns服务器函数
Blinker.run(); //启动blinker
//Blinker.run()语句负责处理Blinker收到的数据,每次运行都会将设备收到的数据进行一次解析。
//在使用WiFi接入时,该语句也负责保持网络连接
}
|
|