当前位置: 首页 > news >正文

ESP使用webserver实现本地控制

因为使用云服务有时候不可靠,那么离线控制就很重要。本文使用webserver实现本地网页控制。这样不需要再单独开发APP,有浏览器就可以控制。本文所有测试是靠ESP32。8266未测试。使用USE_8266控制。

核心代码如下:

html.h

#pragma onceconst char *AutoConfigHTML = u8R"esp_html(<!DOCTYPE html>
<html><head><meta charset="UTF8"><title>智能控制台</title>
</head><body style="font-size: 30px"><style>.inputText {height: 38px;font-size: 30px;line-height: 30px;padding-left: 15px;border-radius: 10px;background-color: #dff1f7;border: 2;}.inputText:focus {outline: none;background-color: #d6e4eb;}.buttonText {height: 38px;font-size: 30px;line-height: 30px;padding-left: 15px;border-radius: 10px;background-color: #FE5E08;border: none;}.buttonText:focus {outline: none;background-color: #FE5E08;}.buttonText:disabled {background-color: #c9c7c6;}</style><center><form><input id="btn_test" type="button" class="buttonText" value="点我测试" onclick="config(this)"/><br/><label id="recvtxt"/></form></center><script language="javascript">function config(sender) {var xmlhttp = new XMLHttpRequest();xmlhttp.onreadystatechange = function () {if (xmlhttp.readyState == 4) {if (xmlhttp.status == 200) {document.getElementById("recvtxt").innerText = "设置成功";                        }else {document.getElementById("recvtxt").innerText = "设置失败";document.getElementById("btnsendconfig").disabled = false;}}}xmlhttp.ontimeout = function () {window.location.href = "about:blank";window.close();}xmlhttp.open("GET", "/Ctrl?btn_name=" + sender.id, true);xmlhttp.timeout = 5000;xmlhttp.send();document.getElementById("btnsendconfig").disabled = true;}</script>
</body></html>
)esp_html";

webctrl.h


#include <atomic>
#include <thread>
#include <functional>
#include "html.h"#ifndef AUTOCFGSSID
#define AUTOCFGSSID "ESP_WIFI"
#endif
#ifndef AUTOCFGPSW
#define AUTOCFGPSW "12345678"
#endif#ifdef USE_8266
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
using TagWebSERVER = ESP8266WebServer;
#else
#include <WiFi.h>
#include <WebServer.h>
using TagWebSERVER = WebServer;
#endifusing FunWebServerCallback = std::function<bool(const char *)>;class CWebControl
{protected:void HandleHtmlRoot(){m_ControlWebServer.send(200, "text/html", AutoConfigHTML);}void HandleHtmlContrl(){if (m_WebServerCallback){bool bRet=m_WebServerCallback(m_ControlWebServer.arg("btn_name").c_str());m_ControlWebServer.send(bRet?200:500, "text/html", m_ControlWebServer.arg("btn_name").c_str());}}public:CWebControl() : m_bRun(false){}void Init(){WiFi.mode(WIFI_AP_STA); // 双模式WiFi.setAutoReconnect(true);IPAddress ip, gateway, subnet;ip.fromString("192.168.2.1");gateway.fromString("192.168.2.1");subnet.fromString("255.255.255.0");WiFi.softAPConfig(ip, gateway, subnet);WiFi.softAP(AUTOCFGSSID, AUTOCFGPSW);m_ControlWebServer.on("/", std::bind(&CWebControl::HandleHtmlRoot, this));m_ControlWebServer.on("/Ctrl", HTTP_GET, std::bind(&CWebControl::HandleHtmlContrl, this));}~CWebControl(){Stop();}void Stop(){m_bRun = false;m_ControlWebServer.close();if (m_LoopThread.joinable()){m_LoopThread.join();}}void SetCallBack(FunWebServerCallback callback){m_WebServerCallback = callback;}void Run(){Stop();m_bRun = true;m_ControlWebServer.begin(80);m_LoopThread = std::thread(std::bind([&]{while (m_bRun){m_ControlWebServer.handleClient();} }));}private:std::thread m_LoopThread;TagWebSERVER m_ControlWebServer;std::atomic_bool m_bRun;FunWebServerCallback m_WebServerCallback;
};

调用方法如下

// 这里定义热点名和密码,定义一定要在#include "webCtrl.h"前面
//连接如下热点 在浏览器访问 192.168.2.1 即可打开控制页面。当然IP地址可以在webCtrl.h修改成你想要的。
//#define AUTOCFGSSID "ESP_WIFI"
//#define AUTOCFGPSW "12345678"// 如果使用8266取消下行注释
// #define USE_8266
#include "webCtrl.h"// 我这里使用的是ESP32 s3.当然其它型号也是代码通用。因为这里我的板子有一颗RGB。使用它测试。请根据需要修改
#ifndef USE_8266
#include "RGB.h"
RGB rgb(1, 48);//注意我买的板子是48脚。你的板子未必是
#endifCWebControl g_WebControl;bool WebCtrlCallBack(const char *name)
{// btn_test这里需要修改HTML对应ID。我这里使用btn_test。添加按钮根据ID区分即可。if (strcmp(name, "btn_test") == 0){
#ifndef USE_8266static bool trunOn = false;rgb.showRGB(trunOn = !trunOn, 0, 255, 100);
#endif}return true;
}void setup()
{// put your setup code here, to run once:g_WebControl.Init();g_WebControl.SetCallBack(std::bind(WebCtrlCallBack, std::placeholders::_1));g_WebControl.Run();#ifndef USE_8266rgb.begin(50);
#endif
}void loop()
{// put your main code here, to run repeatedly:
}

工程代码下载:

【免费】esp32使用网页实现本地控制资源-CSDN文库

http://www.lryc.cn/news/222170.html

相关文章:

  • 小红书热点是什么,怎么找到热点话题!
  • mysql之子表查询、视图、连接查询
  • 001、Nvidia Jetson Nano Developer KIT(b01)-环境配置
  • Lua中如何使用continue,goto continue(模拟C++ C#的continue)
  • Single-cell 10x Cell Ranger analysis
  • 华为分享---手机往电脑发送失败的处理
  • 提升ChatGPT答案质量和准确性的方法Prompt专家
  • lightdb UPDATE INDEXES自动分区转换支持全大写索引名
  • Vue路由重定向
  • MTK_ISP模块调试总结
  • Kotlin基本语法
  • macos端串口调试推荐 serial直装激活 for mac
  • MapReduce WordCount程序实践(IDEA版)
  • go程序获取工作目录及可执行程序存放目录的方法-linux
  • 数据中台之数据建模工程实操
  • 三国志14信息查询小程序(历史武将信息一览)制作更新过程06-复现小程序
  • 《研发效能(DevOps)工程师》课程简介(五)丨IDCF
  • Jupyter Notebook快速上手
  • 三款软件录制电脑屏幕视频
  • react fiber架构【详细讲解,看这一篇就够了】
  • 竞赛 深度学习疲劳检测 驾驶行为检测 - python opencv cnn
  • 国风数字人:数字时代的传统戏剧文化代言人
  • 腾讯广告RACE曝光归因模型
  • 使用python将word转pdf
  • Python装饰器的艺术
  • [答疑]校长出轨主任流程的业务建模
  • 【网络管理——操作系统与安全】
  • 62、使用python进行rk3588开发板进行推流亚马逊云服务上,进行实时播放
  • Microsoft Dynamics 365 CE 扩展定制 - 7. 安全
  • Linux - 进程程序替换 - C/C++ 如何实现与各个语言之间的相互调用 - 替换环境变量