如何使用ESP8266制作可配置的Web服务器

描述

  在这个项目中,我们首先研究如何在 Arduino IDE 中安装 ESP8266 插件,然后使用 ESP8266 制作可配置的 Web 服务器。

  ESP8266 之所以受欢迎,很大程度上是因为它具有出色的性价比。它还可以通过 Wi-Fi 将互联网连接到微处理器。

  它的主要缺点是功耗。ESP8266 不是一款非常节能的芯片,因为它的设计符合大多数家庭和企业都可以使用的 IEEE 802.1 协议(我们称之为 Wi-Fi)。该协议议程保证了创建无线本地网络的良好速度和稳健性。更高的速度会导致更高的功耗,这使得 ESP8266 对于低功耗设计效率低下。

  但是,ESP8266 在功耗不重要的情况下非常有用,例如不断供电且不需要电池的设备。ESP8266 可以连接到任何 Wi-Fi 网络,并通过 TCP 和 UDP 等各种协议发送或接收数据。此外,它还可以构建 Wi-Fi 热点并管理其他设备。

  电路设计注意事项

  ESP8266 可能需要 250mA 的电流来传输数据。因此,如果我们想要有足够的余量,我们可能需要至少 500mA 的电流来为 ESP8266 供电。使用从计算机获取电源的 USB 电缆为 ESP8266 供电可能会导致不稳定。

  在这个项目中,我们使用保证 1A 电流的 5V 电源和 LM1086-3.3V 作为稳压器为 ESP8266 供电。在图 1 中,显示了在引导加载程序和使用模式下使用 ESP8266 的引脚配置。

ESP8266

  图 1.在引导加载程序和使用模式下使用 ESP8266。

  Arduino 附加组件

  安装 ESP8266 插件在互联网上的许多文章中都有描述,但为了清楚起见,我们将在这里简要介绍安装。要安装 ESP8266 插件,我们需要更新 Arduino IDE 中的板管理器。可以从 File-》Preferences-》Additional Boards Manager URLs 添加一个额外的 Board Manager URL。在 URL 部分,应输入以下 URL,如图 2 所示。

ESP8266

  图 2.其他董事会经理 URL

  通过更新 URL,可以通过导航到 Tools-》Boards-》Boards Manager 来访问 ESP8266 插件。ESP8266 板可用,应安装。安装后,在板部分,ESP8266 模块将可用。可以选择不同类型的模块,并且出于本项目的目的(因为我们构建了我们正在使用的电路板),我们将使用通用 ESP8266 模块。

  将草图上传到 ESP8266

  要对 ESP8266 进行编程,我们使用 ESP8266 已经包含的 UART 引导加载程序。在这个项目中,我制作了一个简单的 ESP8266 开发板,原理图如图 3 和以下部件列表:

  1. ESP8266-12(E或F不分大小,唯一区别是内存)

  2. 3.3K电阻 x 2

  3. 470R 功率演示LED电阻

  4. 一个LED决定板子是供电还是供电不是

  5. AMS1117-3.3: 电压调节器

  6. 10uF-25v 电解电容

  7. 22uF-25v 电解电容

  8. 100nF 电容

  9. 一个用于串行通信的 3 针连接器

  10. 一个用于进入引导加载程序的 2 针连接器

  为了进入启动模式,GPIO0 应接地以启动 ESP8266。然后通过在 Arduino IDE 中设置适当的 COM 端口,可以通过点击上传按钮上传草图。编程完成后,GPIO0 应该悬空,因为 ESP8266 应该以正常模式启动并运行程序。

ESP8266

  图 3. ESP8266-12E 开发板原理图

  连接到接入点

  ESP8266 具有内置 EEPROM,可用于存储数据等应用,以构建安全登录页面。使用 EEPROM 很像其他 Arduino 板,但有一些细微差别。

  一方面,您需要在开始读取或写入之前调用 EEPROM.begin(size)。大小是您要使用的字节数,介于 4 到 4096 字节之间。请注意,EEPROM.write() 不会立即写入闪存。每当您希望将更改保存到闪存时,都必须调用 EEPROM.commit()。

  在这个项目中,我们想要制作一个可配置的 Web 服务器,它可以放置在每个网络中(即,在没有 SSID 和接入点连接密码的新网络中)以与之前的设置进行连接。当连接失败时,ESP8266 将进入接入点模式并等待接收配置设置(SSID 和密码)。

  一开始,我们获取 512 字节的 EEPROM 并检查用户名或密码是否可用。我们还可以为我们的设备选择一个特定的 IP 地址并手动设置,需要存储在 EEPROM 中。当我们需要创建设备数据库以了解其位置和定义时,手动设置设备 IP 很有用。

  在下面的完整代码片段中,我们从 EEPROM 中保留 512 个字节,然后在收集信息后,我们尝试连接到接入点。在完整的代码中,如果 EEPROM 为空,代码将绕过连接阶段。

  EEPROM.begin(512);
IPAddress ipad(192, 168, 1, eip.toInt());
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
WiFi.begin(esid.c_str(), epass.c_str());
WiFi.config(ipad, gateway, subnet);

  上面的代码尝试使用存储在 EEPROM 中的特定 IP 地址连接到网络。使用特定 IP 地址时要记住的一件事是,我们需要知道网关 IP 地址以及网络子网掩码。另一方面,上述项目对于需要 DHCP 服务器的自动 IP 寻址不是必需的。

  可以使用 WiFi.status() 函数检查 Wi-Fi 状态。根据 Arduino 网站,此函数返回以下内容:

  WL_CONNECTED:连接到 Wi-Fi 网络时分配

  WL_NO_SHIELD:在没有 Wi-Fi 屏蔽时分配

  WL_IDLE_STATUS:在调用 WiFi.begin() 时分配的临时状态,并保持活动状态,直到尝试次数到期(导致 WL_CONNECT_FAILED)或建立连接(导致 WL_CONNECTED)

  WL_NO_SSID_AVAIL:当没有可用的 SSID 时分配

  WL_SCAN_COMPLETED:扫描网络完成时分配

  WL_CONNECT_FAILED:在所有尝试连接失败时分配

  WL_CONNECTION_LOST:连接丢失时分配

  WL_DISCONNECTED:从网络断开时分配

  通过使用 WiFi.status() 函数,我们可以检查连接状态,如果不存在,ESP8266 应该转向接入点。

  可以使用 WiFi.mode(WIFI_AP) 进行接入点配置,这需要用户名和密码。可以使用 WiFi.softAP 函数设置用户名和密码。描述每一个 Wi-Fi 功能会使这篇文章变得非常长,并且超出了本项目的范围。但是,热心的人可以在GitHub和Arduino 网站上找到有关 ESP6288 的 Wi-Fi 功能和其他库的非常全面的文档。

  在这个项目中,我们希望将我们的设备连接到现有网络。首先,当我们的设备没有连接网络的SSID和密码时,它会进入接入点模式,然后我们可以对其进行配置。配置完成后,设备可以连接到所需的网络。另一方面,有人可能只想在接入点模式下使用 ESP8266。在这种情况下,我们需要在要传输数据时连接到设备。

  因此,在接入点模式下,ESP8266 将等待一组新的配置。可以使用返回整数的 WiFi.scanNetworks 扫描该区域中可用的无线接入点,以确定现有的接入点。收集可用网络的数量后,以下功能可以为您提供所需的所有信息:

  WiFi.SSID:获取当前网络的SSID

  WiFi.RSSI:获取与路由器连接的信号强度

  WiFi.encryptionType:获取当前网络的加密类型

  图 4 显示了 WiFi.scanNetworks 的输出。数据通过 RS232 通信和名为TeraTerm的程序捕获 。

ESP8266

  图 4.扫描网络

  移动DNS

  使用预建库很容易在 ESP8266 上创建 Web 服务器。此外,可以使用 ESP8266mDNS 库创建一个简单的多播域名系统 (mDNS),将名称链接到网络中的服务器 IP。mDNS 将主机名解析为缺少本地名称服务器的小型网络中的 IP 地址。它使用与单播 DNS 相同的编程接口、数据包格式和操作语义。

  接下来,“mdns.begin(‘esp8266’)”会导致一个 mDNS 服务器被定义为 ESP8266 的名称。如果一切正常,mdns.begin 函数返回 true,我们可以通过 server.begin() 启动服务器。

  读取 GET 请求

  我们可以通过 mdns.update() 更新 mDNS 查询,然后作为客户端读取请求。下面的代码首先更新 mDNS 查询,然后,如果数据包可用,则读取它。

   mdns.update();
  WiFiClient client = server.available();
  if (!client) {
    return(20);
  }
  String req = client.readStringUntil('\r');
  // Wait for data from client to become available
  if(client.connected() && !client.available()){
    return(20);
   } 

  在上面的代码中,ESP8266 检查是否有任何客户端可用。如果客户端可用,它将读取其数据,直到它收到‘\r’,这意味着数据包的结束。从那时起,我们的 Web 服务器可以接收 GET 请求,但无法解释它们或发送答案。

  可以使用 client.print() 函数发送客户端的答案。对于客户端,为了将其视为网页内容(即在 Firefox 等浏览器中查看答案),答案应为 HTML 格式。通过这种方式,我们可以使用我们的 ESP8266 创建一个图形化的 HTML Web 服务器。

  在上面的代码中,我们读取客户端 GET 请求并将其存储在“req”变量中。‘req’ 变量现在有 GET 数据,我们可以简单地解释它。根据客户端的 GET 请求,我们应该创建一个字符串,并使用 client.print() 函数生成客户端答案。下面的代码片段生成一个简单的 HTML 页面,用于回复客户。

  s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n\r\n
 

ALL ABOUT CIRCUITS!"; s += "

"; s += "\r\n\r\n"; client.print(s);

  在片段中,“200”命令已发送到客户端。

  结论

  在这个项目中,我们检查了用于创建简单 Web 服务器的 ESP8266 库。然后,创建了一个可配置的 Web 服务器,该服务器采用 SSID 和所需无线网络的密码。最后,在连接到本地网络后,GET 请求在设备和客户端之间传输。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分