夸克之书

  • 首页
  • 科普
  • 笔记
  • C#
  • 物联网
  • 算法
  • Linux
  • 树莓派
夸克之内,别有洞天
  1. 首页
  2. 物联网
  3. 正文

ESP8266 SmartConfig配置连网

2019-01-21 2980点热度 0人点赞 0条评论

很多时候ESP8266都是直接将WIFI的信道和密码写入Arduino内部的,这样做虽然对于个人项目并没有什么影响,但是如果涉及到项目商业化则明显不行。所以波波也一直在探索如何让用户更加便捷的配置开发板上网。功夫不负有心人,在简书上看到乐鑫提供了一个SmartConfig的方案感觉很不错,所以分享一下。

Arduino一键配置上网

所谓的smartconfig就是手机APP端发送包含WIFI 用户名 WIFI密码的 UDP 广播包或者组播包,智能终端的WIFI芯片可以接收到该UDP包,只要知道UDP的组织形式,就可以通过接收到的UDP包解密 出WIFI 用户名 密码,然后智能硬件 配置受到的WIFI 用户名 密码到指定的WIFI AP 上。

这种方式尤其适合对没有屏幕的外设进行相关配置。

smartconfig

配置步骤:

1、ESP8266 端调用 WiFi.beginSmartConfig() 等待手机端发出的用户名与密码。
2、手机端填写当前网络的密码发送到UDP端口。
3、ESP8266 自动收到连接信息并调用 WiFi.smartConfigDone() 退出等待。
是不是很简单呢?

附:ESP8266固件代码(APP及代码下载)

#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
#include "FS.h"

#define LED 2

struct Config {
  String SSID;
  String Passwd;
  String Server = "esaylinker";
  String Token = "0000";
};
Config _config;

bool LoadConfig() {
  File configFile = SPIFFS.open("/config.json", "r");
  if (!configFile) {
    Serial.println("Failed to open config file");
    return false;
  }
  StaticJsonDocument<1024> doc;
  DeserializationError error = deserializeJson(doc, configFile);
  if (error) {
    Serial.println("Failed to read file, using default configuration");
    return false;
  }
  _config.SSID = doc["SSID"] | "fail";
  _config.Passwd = doc["Passwd"] | "fail";
  if (_config.SSID == "fail" || _config.Passwd == "fail") {
    return false;
  }
  else {
    Serial.println("Load wifi config from spiffs successful.");
    Serial.print("Loaded ssid: ");
    Serial.println(_config.SSID);
    Serial.print("Loaded passwd: ");
    Serial.println(_config.Passwd);
    return true;
  }
}

bool SaveConfig() {
  DynamicJsonDocument doc(1024);
  JsonObject root = doc.to<JsonObject>();
  root["SSID"] = _config.SSID;
  root["Passwd"] = _config.Passwd;
  root["Server"] = _config.Server;
  root["Token"] = _config.Token;

  File configFile = SPIFFS.open("/config.json", "w");
  if (!configFile) {
    Serial.println("Failed to open config file for writing");
    return false;
  }
  if (serializeJson(doc, configFile) == 0) {
    Serial.println("Failed to write to file");
    return false;
  }
  return true;
}

void setup() {
  Serial.begin(115200);
  //Set LED
  pinMode(LED, OUTPUT);
  //Mount FS
  Serial.println("Mounting FS...");
  if (!SPIFFS.begin()) {
    Serial.println("Failed to mount file system");
    return;
  }
  //Connect WIFI
  ConnectServer();
}

void loop() {
  //Wifi watch dog,if wifi not connect, it will auto reconnect.
  WiFiWatchDog();

  Serial.print("Looks like working. now:");
  Serial.println(millis() / 1000);
  delay(1000);
}

void ConnectServer() {
  if (LoadConfig()) {
    BaseConfig();
  } else {
    SmartConfig();
  }
  digitalWrite(LED, LOW);
}

bool WiFiWatchDog(){
  if(WiFi.status() != WL_CONNECTED){
    BaseConfig();
  }
  return true;
}

void BaseConfig() {
  Serial.println("Use base config to connect wifi.");
  WiFi.mode(WIFI_STA);
  WiFi.begin(_config.SSID, _config.Passwd);
  //连接超时时间,30s后没有连接将会转入SmartConfig
  int timeout = 30000;
  while (WiFi.status() != WL_CONNECTED) {
    Serial.println("Wait to connect wifi...");
    digitalWrite(LED, LOW);
    delay(150);
    digitalWrite(LED, HIGH);
    delay(150);
    timeout = timeout - 300;
    if (timeout <= 0) {
      Serial.println("Wifi connect timeout, use smart config to connect...");
      SmartConfig();
      return;
    }
  }
  Serial.println("WiFi connected by base config.");
  Serial.print("SSID:");
  Serial.println(WiFi.SSID());
  Serial.print("IP Address:");
  Serial.println(WiFi.localIP());
}

void SmartConfig()
{
  Serial.println("Use smart config to connect wifi.");
  WiFi.mode(WIFI_STA);
  WiFi.beginSmartConfig();
  while (1)
  {
    Serial.println("Wait to connect wifi...");
    digitalWrite(LED, LOW);
    delay(1000);
    digitalWrite(LED, HIGH);
    delay(1000);
    if (WiFi.smartConfigDone())
    {
      Serial.println("WiFi connected by smart config.");
      Serial.print("SSID:");
      Serial.println(WiFi.SSID());
      Serial.print("IP Address:");
      Serial.println(WiFi.localIP());
      _config.SSID = WiFi.SSID();
      _config.Passwd = WiFi.psk();
      if (!SaveConfig()) {
        Serial.println("Failed to save config");
      } else {
        Serial.println("Config saved");
      }
      break;
    }
  }
}

如果使用NodeMCU Lua 的话代码会更简单一些:

wifi.setmode(wifi.STATION)
wifi.startsmart(0,function(ssid, password)
       print(string.format("Success. SSID:%s ; PASSWORD:%s", ssid, password))
       end )

参考文档:https://github.com/nodemcu/nodemcu-firmware/wiki/nodemcu_api_cn#wifistartsmart

手机端

上述固件烧录完毕后,在手机上只需启动乐鑫提供的ESP-Touch应用输入WIFI信道和密码即可配置让开发板联网了。

视频教程:http://www.electrodragon.com/smartconfig-nodemcu/

文章来源:https://www.zkii.net/tech/arduino/1343.html

本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2020-12-13

afirefish

这个人很懒,什么都没留下

打赏 点赞
下一篇 >

文章评论

您需要 登录 之后才可以评论

管理员

这个人很懒,什么都没留下

搜索文章
分类
  • C# (29)
  • Linux (3)
  • 树莓派 (13)
  • 物联网 (19)
  • 科普 (4)
  • 笔记 (30)
  • 默认 (46)
最新 热点 随机
最新 热点 随机
C#几种深拷贝方法探究及性能比较 获取访问IP信息接口(暂不开放) Vieu主题作者疑似跑路?这人品?!!! 树莓派PWM风扇控制 PVE重启后LVM Thin数据丢失,错误:Volume group "****" has insufficient free space (128 extents): 4048 required. OpenWrt配置SmartDNS OpenWrt x86安装Frpc Intel网卡开机显示Initializing Intel(R) Boot Agent GE v1.5.50
树莓派PWM风扇控制Error response from daemon: cannot stop container: ******: Cannot kill container *******:.....单机Docker搭建FastDFSC# Json序列化时将长整型(long)属性序列化为Json字符串使用淘宝npm以及安装cnpm免费本地解析域名(locallocal.cn),支持HTTPSIdentityServer4证书创建Intel网卡开机显示Initializing Intel(R) Boot Agent GE v1.5.50
火狐浏览器禁止缓存 那些令人惊叹的宣传片(CG) 树莓派.Net Core Iot入门系列篇(5):SPI Navicat 12 for MySQL激活 C# HTTP请求参数转实体类 树莓派4系统下载(集合) Nginx反向代理Frp HTTPS访问时报502 Bad Gateway 23种常见的设计模式(9):命令模式
最近评论
发布于 3 周前(03月21日) function getCpuTemp() 函数结束之前使用close关闭 文件流 不关闭的话长...
发布于 3 周前(03月19日) 闹了半天找到问题了 原来是gpio版本问题 pi@raspberrypi:~/Desktop $ ...
发布于 3 周前(03月19日) sudo下执行 无法控制小风扇 普通用户却可以 这是可能是什么原因 :redface:
发布于 2 个月前(02月21日) 好的谢谢,那我只能通过kill杀死推流指令进程来实现了。
发布于 2 个月前(02月21日) 要用这个项目的话,你得自己拉代码来改了。做这玩意儿主要是考虑全天候的,没考虑过关[笑哭]
书签
  • 打赏
  • 毒鸡汤(有点意思)
  • 米店
  • 金鱼直播间
放松一下
https://www.quarkbook.com/wp-content/uploads/2020/09/Yanni-Nightingale.flac
用户您好!请先登录!
登录 注册

COPYRIGHT © 2020 夸克之书. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

蜀ICP备15036129号-9

登录
注册|忘记密码?