一般ESP8266建立AP接入点是通过程序中设定,只适合DIY的作品,为了更大的灵活性可以通过SPIFFS 文件系统预设置WIFI AP接入点参数。
直接上代码:
#include <ESP8266WiFi.h>
#include <FS.h> //Include File System Headers
void setup() {
File myFile;
String file_str;//从文件读取的数据转成String类型
String m_ssid, m_sn;//从文件数据中提取的WIFI热点名称和密码
int firOfColon, secOfColon;//第一个冒号的位置,第二个冒号的位置
Serial.begin(115200);
Serial.println();
if (!SPIFFS.begin()) {
Serial.println("Start SPIFFS Failed!please check Arduino Download Config.");
return;
}
Serial.println("File System Initialized");
myFile = SPIFFS.open("/sn.txt", "r");//文件名前的反斜杠不能少
if (myFile) {
Serial.println("Reading sn.txt...");
while (myFile.available()) {
//读取文件输出
file_str += (char)myFile.read(); //循环读取文件转换成String类型
//Serial.write(myFile.read());//循环文件输出到串口
}
Serial.println(file_str);//串口输出已转换成String类型的文件内容
firOfColon = file_str.indexOf(':');//从字符串开始位置查找":"位置
secOfColon = file_str.lastIndexOf(':');//从字符串尾部查找":"位置
Serial.print("firOfColon=");
Serial.println(firOfColon);
Serial.print("secOfColon=");
Serial.println(secOfColon);
m_ssid = file_str.substring(firOfColon + 1,'\r');
m_ssid.trim();//自动清除字符串中最前面和最后面的空白数据。不做清除字符串会包含有'\n'
m_sn = file_str.substring(secOfColon + 1);
m_sn.trim();//保险起见,自动清除字符串中最前面和最后面的空白数据。
Serial.print("m_ssid=");
Serial.println(m_ssid);
Serial.print("m_sn=");
Serial.println(m_sn);
myFile.close();
} else {
Serial.println("Open File Failed.");
}
//Initialize File System
WiFi.softAP(m_ssid, m_sn);
IPAddress IP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(IP);
}
void loop() {
// put your main code here, to run repeatedly:
}
程序调试串口输出:
配套文件是在data文件夹里的sn.txt
文件内容:
创建的热点图片:
手机可以正常显示nodemcu建立的热点中文名字,但电脑的无线 显示是乱码,不知道为何。知道的朋友请留言。
注:在Notepad++中可以设置txt文本编码为GBK,这样WIN7系统无线网络名称可以显示正常,安卓手机也可以显示正常,但arduino串口监视器就显示异常.
若编码设置为UTF-8则WIN7显示不正常,但安卓手机和arduino串口监视器就显示正常
文章 最上面的代码有问题,如果热点名称是英文就会出现偏差,现更改代码:
#include <ESP8266WiFi.h>
#include <FS.h> //Include File System Headers
void setup() {
File myFile;
String file_str;//从文件读取的数据转成String类型
String m_ssid, m_sn;//从文件数据中提取的WIFI热点名称和密码
int firOfColon, secOfColon;//第一个冒号的位置,第二个冒号的位置
int posOfCr;//回车符的位置
Serial.begin(115200);
Serial.println();
if (!SPIFFS.begin()) {
Serial.println("Start SPIFFS Failed!please check Arduino Download Config.");
return;
}
Serial.println("File System Initialized");
myFile = SPIFFS.open("/sn.txt", "r");//文件名前的反斜杠不能少
if (myFile) {
Serial.println("Reading sn.txt...");
while (myFile.available()) {
//读取文件输出
file_str += (char)myFile.read(); //循环读取文件转换成String类型
//Serial.write(myFile.read());//循环文件输出到串口
}
myFile.close();
Serial.println(file_str);//串口输出已转换成String类型的文件内容
firOfColon = file_str.indexOf(':');//从字符串开始位置查找":"位置
secOfColon = file_str.lastIndexOf(':');//从字符串尾部查找":"位置
Serial.print("firOfColon=");
Serial.println(firOfColon);
Serial.print("secOfColon=");
Serial.println(secOfColon);
posOfCr = file_str.indexOf('\r');
Serial.print("posOfCr位置=");
Serial.println(posOfCr);
m_ssid = file_str.substring(firOfColon + 1, posOfCr);
m_ssid.trim();//自动清除字符串中最前面和最后面的空白数据。不做清除字符串会包含有'\n'
m_sn = file_str.substring(secOfColon + 1);
m_sn.trim();//保险起见,自动清除字符串中最前面和最后面的空白数据。
delay(10);//加此延时以确保串口输出完整
Serial.print("m_ssid=");
Serial.println(m_ssid);
Serial.print("m_ssid长度=");
Serial.println(m_ssid.length());
Serial.print("m_sn=");
Serial.println(m_sn);
Serial.print("m_sn长度=");
Serial.println(m_sn.length());
} else {
Serial.println("Open File Failed.");
}
//Initialize File System
WiFi.softAP(m_ssid, m_sn);
IPAddress IP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(IP);
}
void loop() {
// put your main code here, to run repeatedly:
}
增加了第9、32、33、34行,修改m_ssid = file_str.substring(firOfColon + 1,posOfCr);
增加了delay(10);加此延时以确保串口输出完整