admin管理员组文章数量:1627760
/*****************************************/
/*
* 注意:该项目的一键配网功能不知道为什么在家中WiFi的连接出现异常,但是连接移动热点并未出错,所以使用时需要小心,可以设置直接TCP连接
* 使用的时候需要冷启动,即一键配网成功之后需要关闭设备再重新启动,这样才能正确读取errom,否则使用的仍然是上一次的WiFi
* bug已修复,是我家里WiFi密码记错了,我是个憨憨
*/
#include <ESP8266WiFi.h>
#include <EEPROM.h>
#include <PubSubClient.h>
/*onenet设备端口配置*/
const char* mqtt_server = "183.230.40.39";
const char* DeviceID="xxxxxx"; //设备号
const char* ProductID="xxxxxx"; //产品号
const char* AuthInfo="xxxxxx"; //鉴权信息
/*LED灯配置*/
int led=14; //对应引脚D5,用于LED控制
#define LED 16 //对应D0引脚
/*mqtt配置项*/
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
/*****************网络设置项 *****************/
const char *ssid2; //提供上网的无线路由ssid
String ssid3;
int ss;
const char *password2; //提供上网的无线路由密码
String password3;
int pp;
int count=0;
bool WIFI_Status = true;
/*初始化*/
void setup(){
//Serial.println("Start"); /***********测试**********/
/*初始化*/
Serial.begin(115200);
EEPROM.begin(1024);
pinMode(LED, OUTPUT);
digitalWrite(LED, 0);
pinMode(led, OUTPUT); // Initialize the BUILTIN_LED pin as an output
/*读取errom中数据并开始配网测试*/
//Serial.println("Start");
if(EEPROM.read(0)==200){
Serial.println("OK"); //测试数据
WiFi.mode(WIFI_STA);
ss= EEPROM.read(1); //ssid长度
pp= EEPROM.read(2); //密码长度
ssid3=ssid1(ss,10);
ssid2=ssid3.c_str();
password3=password1(pp,30);
password2=password3.c_str();
WiFi.begin(ssid2, password2);
delay(1000);
/*检测errom中数据是否正确匹配当前网络,如果不匹配,则重新配网*/
/*****************************************/
Serial.println("\r\n正在连接");
while(WiFi.status()!=WL_CONNECTED)
{
if(WIFI_Status)
{
Serial.print(".");
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, LOW);
delay(500);
count++;
if(count>=5)//5s
{
WIFI_Status = false;
Serial.println("WiFi连接失败,可能errom中数据出错,请用手机重新进行配网");
}
}
else
{
smartConfig(); //微信智能配网
}
}
/*****************************************/
}
/*如果errom中没有数据,则开始执行配网*/
else{
Serial.println("Start module");
smartConfig();
}
/*连接路由器*/
setup_wifi();
/*连接mqtt的onenet端口并设置回调函数*/
client.setServer(mqtt_server, 6002);
client.setCallback(callback);
}
//循环函数进行LED的控制
void loop(){
/*连接WiFi*/
if (WiFi.status() != WL_CONNECTED) {
WiFi.begin(ssid2, password2);
Serial.println("go to wifi");
Serial.println(ssid2);
Serial.println(password2);
delay(1000);
return;
}
delay(100);
/*mqtt端口连接*/
if (!client.connected()) {
reconnect();
}
client.loop();
/*
//mqtt连接测试函数
long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
++value;
snprintf (msg, 50, "hello world #%ld", value);
Serial.print("Publish message: ");
Serial.println(msg);
client.publish("outTopic", msg);
}
*/
}
//添加errom保存后
void smartConfig(){
WiFi.mode(WIFI_STA);
Serial.println("\r\nWait for Smartconfig");
//调用smartconfig功能
WiFi.beginSmartConfig();
while (1){
Serial.print(".");
digitalWrite(LED, 0);
delay(500);
digitalWrite(LED, 1);
delay(500);
//若配置完成打印获取到的ssid
if (WiFi.smartConfigDone()){
String s="";
String p="";
int cd1;
int cd2;
Serial.println("SmartConfig Success");
Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
s=WiFi.SSID();
p=WiFi.psk();
cd1=s.length();
cd2=p.length();
EEPROM.write(1,cd1);
EEPROM.write(2,cd2);
for(int i=0;i<cd1;i++){
EEPROM.write(10+i,s[i]);
}
for(int i=0;i<cd2;i++){
EEPROM.write(30+i,p[i]);
}
EEPROM.write(0,200);
EEPROM.commit();
Serial.println(s);
Serial.println(p);
/*重新修改路由器账号和密码*/
//ssid2=WiFi.SSID().c_str(); //重新修改路由器账号和密码
//password2=WiFi.psk().c_str();
Serial.println("ok");
break;
}
}
}
/*读取errom数据*/
String ssid1(int a,int b){
String data = "";
for (int i = 0; i < a; i++){
data += char(EEPROM.read(b + i));
}
return data;
}
String password1(int a,int b){
String data = "";
for (int i = 0; i < a; i++){
data += char(EEPROM.read(b + i));
}
return data;
}
/*连接WiFi函数*/
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid2);
WiFi.begin(ssid2, password2);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print("-)");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
/*mqtt回调函数*/
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
// Switch on the LED if an 1 was received as first character
if ((char)payload[0] == '1') {
digitalWrite(led, HIGH); // Turn the LED on (Note that LOW is the voltage level
// but actually the LED is on; this is because
// it is active low on the ESP-01)
} else {
digitalWrite(led, LOW); // Turn the LED off by making the voltage HIGH
}
//RGB颜色拾取
/*针对有rgb三种颜色的灯光的亮度控制*/
/*****************************************/
if ((char)payload[0] == 'R') {
char r[5]; memset(r,0x00,sizeof(r));
char g[5]; memset(g,0x00,sizeof(g));
char b[5]; memset(b,0x00,sizeof(b));
Serial.println("parse_str string...");
char *rgb=(char*) payload;
parse_str(rgb,"R","G",r,5);
Serial.println(r);
analogWrite(led, float(atoi(r))/255*1024);
parse_str(rgb,"G","B",g,5);
Serial.println(g);
parse_str(rgb,"B","END",b,5);
Serial.println(b);
}
/*****************************************/
}
/*mqtt断线重连函数*/
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(DeviceID,ProductID,AuthInfo)) {
Serial.println("connected");
// Once connected, publish an announcement...
//client.publish("outTopic", "hello world");
// ... and resubscribe
client.subscribe("LED");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
/*****************************************/
/*字符串截取*/
/*
str 被查找的字符串
b_str 对比的字符串头
e_str 查找的结束符
dest 获取到的字符串
len 想要获取的长度
*/
char *parse_str(char *str, char * b_str, char *e_str, char *dest, int len) {
char *pos, *p, *p2;
int i;
//strstr 函数搜索一个字符串在另一个字符串中的第一次出现,该子字符串到原字符串结尾被提取出来。
pos = strstr(str, b_str);
if (pos == NULL) {
return NULL;
}
pos = pos + strlen(b_str);
p = pos;
if (e_str == NULL) {
p2 = NULL;
} else {
p2 = strstr(str, e_str);
}
if (p2 == NULL) {
p2 = str + strlen(str);
}
i = 0;
for (i = 0; p < p2 && (*p) && i < len; dest[i++] = *p, ++p)
;
dest = 0;
return dest;
}
/*****************************************/
本文标签: 一键
版权声明:本文标题:一键配网 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1729002528a1182703.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论