草庐IT

10- ESP8266自主WiFi配网

盐池虾 2023-07-07 原文

Author:teacherXue

一、ESP8266接入网络

前面我们已经可以使用nodemcu来读取传感器数据,或者控制外设。但这些功能和普通的单片机没有本质差别。物联网是需要接入网络的,传统的单片机系统还需要其他的设备中转才能互相连接以及访问公网。而ESP8266自带wifi功能,其本身就能充当智能网关的角色,ESP32芯片更是提供了蓝牙功能。

  1. 固定SSID以STA身份接入

在有路由器的场合,mcu多数作为从设备来工作即可,也就是STA身份,ESP芯片支持AP主设备、STA从设备、AP+STA主从设备模式。下面我们先通过固定方式接入我们所需要的WiFi路由器。

1)新建项目Lot_wifi_test_v1.0,设置串口波特率。

2)引入arduino框架自带库ESP8266WiFi。

#include <ESP8266WiFi.h>

3)定义连接wifi所需的账户密码

const char *ssid = "要连接的ssid";
const char *password = "密码";

4) Setup里面参考以下代码。

void setup()
{
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);//设置wifi模式为从设备STA模式,不声明默认为AP+STA
  // 获得当前mcu网络中主机名称
  Serial.printf("Default hostname: %s\n", WiFi.hostname().c_str());
  // 初始化 Wi-Fi
  WiFi.begin(ssid, password);
  Serial.print("正在连接 WiFi..");
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print('.');
    delay(1000);
  }
  Serial.println(WiFi.localIP());//打印获得的IP地址
  Serial.print("RRSI: ");
  Serial.println(WiFi.RSSI());//打印wifi的信号强度
}

5) 烧录程序,观察串口调试结果。

我们可以看到,串口打印出了连接到WiFI后的IP地址,还有MCU的hostname(来自于芯片id),最后输出WiFi信号的强度值。因为loop中我们没写任何代码,所以它后续并不会做什么。我们可以使用同一网络的计算机设备ping这个地址,可以看到如下结果。

二、WiFi自主配网

上一案例中,虽然代码比较简单,如果是自己做实验非常快速。但是如果场景发生了变化,如果是要销售的产品,如何知道用户的WiFi环境。所以在产品开发上该方法不可取。WiFi配网应该交给客户通过比较简单直接的方式进行。

  1. 配网方式

1)WiFi配网

MCU没有配网前,芯片工作在AP模式。SSID和密码预先写好,告知客户。客户使用WiFi设备连接芯片。然后打开web网页,扫描周围的WiFi热点,选择并输入密码进行配网。连接成功后,芯片转为从设备继续工作。

2)蓝牙配网

ESP8266并没有蓝牙功能,但可以通过串口蓝牙设备扩展。如果是ESP32则自带了蓝牙功能。可以通过手机和芯片进行蓝牙配对后,通过蓝牙通信传输WiFi配置信息。

  1. 安装WiFimanager扩展库

继续拿来主义,WiFimanager扩展库提供了非常便捷的WiFi配网功能。下面就来看一下如何使用WiFimanager进行WiFi配网。

  1. 新建项目Lot_wifi_test_v2.0

  1. 修改串口通信速率

  1. 安装WiFimanager扩展库。

这里需要注意:platformio扩展库下载的WiFimanager比较老旧,里面的案例也未能提供我们所需要的,所以我们将采取导入外部扩展库的方式。

打开arduino软件,我们将使用他来获得扩展库(其实去git上去获得这个扩展库也是可以的)。打开软件的工具 -> 管理扩展库-> 输入WiFiManager搜索后向下滚动,找到WiFiManager扩展库安装。

打开主界面 文件-> 首选项 ->找到项目文件夹位置。

该目录下的libraries目录就是下载的库文件目录。可以看到下载的WiFiManager库

将该目录用鼠标拖拽到(你也可以copy到目标文件夹)platformIO项目目录的lib目录下。

在项目文件中打开该扩展库的案例中的basic案例。

  1. 代码解析

1)引入支持库后我们需要创建wifimanager对象。

WiFiManager wm;

2)有些被注释掉的代码调用,仔细阅读,可能在某些场合有应用价值,例如擦除芯片设置。因为如果芯片被成功接入网络,那么它将不会再次出现配网界面,如果我们要改变网络配置,可以通过某些外置按钮来触发擦除操作。

// wm.resetSettings();

3)扩展库有三种建立连接的方式

  • 默认芯片ID的AP匿名连接。

  • 指定的AP名称匿名连接。

  • 指定AP名称并指定连接密码,此方式比较安全。

wm.autoConnect(); //从芯片id自动生成AP名称
wm.autoConnect("AutoConnectAP"); // 匿名连接
wm.autoConnect("AutoConnectAP","password"); //指定AP和密码

5) 完整的代码如下

#include <WiFiManager.h> // https://github.com/tzapu/WiFiManager
void setup() {    
    Serial.begin(115200); 
    // WiFiManager,本地初始化。一旦它的任务完成了,就没有必要再让它存在了
    WiFiManager wm;

    // 擦除设置,它们被保存在芯片中
    // wm.resetSettings();

    //自动连接使用保存的凭证,
//如果连接失败,它将启动一个具有指定名称的接入点("AutoConnectAP"),
//如果为空将自动生成SSID,如果密码为空将是匿名AP (wm.autoConnect())
//然后进入阻塞循环等待配置并返回成功结果

    bool res;
    // res = wm.autoConnect(); //从芯片id自动生成AP名称
    // res = wm.autoConnect("AutoConnectAP"); // 匿名连接
    res = wm.autoConnect("xm_"+ ESP.getChipId(),"12345678"); // 指定密码的AP
    //根据返回结果判断连接是否生效
    if(!res) {
        Serial.println("Failed to connect");
        // ESP.restart();
    } 
    else {
        //WiFi连接成功    
        Serial.println("connected...yeey :)");
    }

}

void loop() {
    // put your main code here, to run repeatedly:   
}

5) 烧录代码并运行

用手机扫描AP热点,找到xm开头后跟16进制数字的AP名称就是MCU芯片,输入密码12345678连接,自动打开浏览器页面跳转至192.168.4.1,此时为配网页面。选择第一项配网,会扫描附近WiFi热点,选择需要连接的热点,并输入密码保存。连接成功后页面跳转MCU已经转为从设备工作状态。

串口信息显示如下

有关10- ESP8266自主WiFi配网的更多相关文章

  1. 由于 libgmp.10.dylib 的问题,Ruby 2.2.0 无法运行 - 2

    我刚刚安装了带有RVM的Ruby2.2.0,并尝试使用它得到了这个:$rvmuse2.2.0--defaultUsing/Users/brandon/.rvm/gems/ruby-2.2.0dyld:Librarynotloaded:/usr/local/lib/libgmp.10.dylibReferencedfrom:/Users/brandon/.rvm/rubies/ruby-2.2.0/bin/rubyReason:Incompatiblelibraryversion:rubyrequiresversion13.0.0orlater,butlibgmp.10.dylibpro

  2. ruby - ri 有空文件 – Ubuntu 11.10, Ruby 1.9 - 2

    我正在运行Ubuntu11.10并像这样安装Ruby1.9:$sudoapt-getinstallruby1.9rubygems一切都运行良好,但ri似乎有空文档。ri告诉我文档是空的,我必须安装它们。我执行此操作是因为我读到它会有所帮助:$rdoc--all--ri现在,当我尝试打开任何文档时:$riArrayNothingknownaboutArray我搜索的其他所有内容都是一样的。 最佳答案 这个呢?apt-getinstallri1.8编辑或者试试这个:(非rvm)geminstallrdocrdoc-datardoc-da

  3. ruby-on-rails - gem install rmagick -v 2.13.1 错误 Failed to build gem native extension on Mac OS 10.9.1 - 2

    我已经通过提供MagickWand.h的路径尝试了一切,我安装了命令工具。谁能帮帮我?$geminstallrmagick-v2.13.1Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingrmagick:ERROR:Failedtobuildgemnativeextension./Users/ghazanfarali/.rvm/rubies/ruby-1.8.7-p357/bin/rubyextconf.rbcheckingforRubyversion>=1.8.5...yescheckingfor/

  4. ruby - 安装 tiny_tds 在 mac os 10.10.5 上出现错误 - 2

    我正在使用macos,我想使用ruby​​驱动程序连接到sqlserver。我想使用tiny_tds,但它给出了缺少free_tds的错误,但它已经安装了。怎么能过这个?~brewinstallfreetdsWarning:freetds-0.91.112alreadyinstalled~sudogeminstalltiny_tdsBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtiny_tds:ERROR:Failedtobuildgemnativeextension.完整日志如下:/System

  5. ruby - rails 3.2.2(或 3.2.1)+ Postgresql 9.1.3 + Ubuntu 11.10 连接错误 - 2

    我正在使用PostgreSQL9.1.3(x86_64-pc-linux-gnu上的PostgreSQL9.1.3,由gcc-4.6.real(Ubuntu/Linaro4.6.1-9ubuntu3)4.6.1,64位编译)和在ubuntu11.10上运行3.2.2或3.2.1。现在,我可以使用以下命令连接PostgreSQLsupostgres输入密码我可以看到postgres=#我将以下详细信息放在我的config/database.yml中并执行“railsdb”,它工作正常。开发:adapter:postgresqlencoding:utf8reconnect:falsedat

  6. ruby-on-rails - 在 osx 10.9.3 上使用 RVM 安装 ruby​​-1.9.3-p547 时出错 - 2

    如何解决这个错误:$rvminstall1.9.3Searchingforbinaryrubies,thismighttakesometime.Nobinaryrubiesavailablefor:osx/10.9/x86_64/ruby-1.9.3-p547.Continuingwithcompilation.Pleaseread'rvmhelpmount'togetmoreinformationonbinaryrubies.Checkingrequirementsforosx.Certificatesin'/usr/local/etc/openssl/cert.pem'arealr

  7. u盘安装系统(win10为例) - 2

    下载微PE工具箱进入官网下载微PE工具箱-下载 安装好后,打开微PE工具箱客户端,选择安装PE到U盘 PE壁纸可选择自己喜欢的壁纸,勾选上包含DOS工具箱,个性化盘符图标 下载原版系统进入网站下载镜像NEXT,ITELLYOU如果没有账号,注册一下就好进入选择开始使用选择win10 这里我们选择消费者版,用迅雷把BT种子下载下来 下面的两个盘符,是PE工具箱安装进U盘后,分成的盘符,注意EFI的盘符,这里面不能删东西,也不能添东西,另一个盘符可以当做正常的U盘空间使用,我们现在需要把下载下来的景象文件复制到正常的U盘空间中去 这个时候我们的系统U盘就只做好了 安装系统我们将U盘插入电脑,开机,

  8. ruby-on-rails - OSX 10.7.5 - Ruby on Rails LoadError : Could not open library 'sodium' : dlopen(sodium, 5) - 2

    输入rakedb:create后我得到:LoadError:Couldnotopenlibrary'sodium':dlopen(sodium,5):imagenotfound.Couldnotopenlibrary'libsodium.dylib':dlopen(libsodium.dylib,5):imagenotfound这里还有一些输出。/Users/Mao/.rvm/gems/ruby-2.0.0-p451/gems/ffi-1.9.3/lib/ffi/library.rb:133:in`blockinffi_lib'/Users/Mao/.rvm/gems/ruby-2.0

  9. ruby-on-rails - 如何使用 Xcode 4.5.1 在 OSX Lion 10.8.2 上编译 EventMachine gem - 2

    我找遍了所有我能找到的地方,但似乎找不到解决这个问题的办法。我在Lion10.8.2上使用Xcode4.5.1,并尝试为Rails项目运行bundle,但它一直卡在这上面。我正在为Heroku使用Thingem。Bolanos@Jeremys-Mac-mini⦿-1.9.3fishfarm$sudogeminstalleventmachinePassword:Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingeventmachine:ERROR:Failedtobuildgemnativeextens

  10. ruby - Ruby 中允许 "p *1..10"打印出数字 1-10 的功能是什么? - 2

    require'pp'p*1..10这会打印出1-10。为什么这么简洁?您还可以用它做什么? 最佳答案 它是“splat”运算符。它可用于分解数组和范围并在赋值期间收集值。这里收集赋值中的值:a,*b=1,2,3,4=>a=1b=[2,3,4]在此示例中,内部数组([3,4])中的值被分解并收集到包含数组中:a=[1,2,*[3,4]]=>a=[1,2,3,4]您可以定义将参数收集到数组中的函数:deffoo(*args)pargsendfoo(1,2,"three",4)=>[1,2,"three",4]

随机推荐