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

浏览器控制的无线开关

esp32-c3  作为HTTP server  控制led 灯。服务器注册两个uri  。一个"/open" 控制开,一个"/close"控制关。下一步再用一片c3作为客户端,运行http client 发送/open.  /Close  模拟浏览器,控制led. 其实只要用手机或pc或平板浏览器输入ip/open就能开灯,ip/close就能关led,只是不能回显服务器回传的灯信息。

573ab744221542e6902515556208e7a9.jpg

 

http server 代码:


#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/event_groups.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_http_server.h"
#include "esp_timer.h"
#include "driver/gpio.h"
// WiFi 
#define WIFI_SSID "ChinaNet-AETP5V"
#define WIFI_PASS "wf123456"int state=1; static EventGroupHandle_t s_wifi_event_group;
static const int WIFI_CONNECTED_BIT = BIT0;
static const char *TAG = "WiFi_HTTP";//----------------------
#define GPIO_out  0            //led 引脚void lignt(){                     //led 间隔1秒闪烁gpio_set_level(GPIO_out,1);vTaskDelay(1000/portTICK_PERIOD_MS);gpio_set_level(GPIO_out,0);vTaskDelay(1000/portTICK_PERIOD_MS);	}static void event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) {if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {esp_wifi_connect();  // } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {esp_wifi_connect();  // ESP_LOGI(TAG, "...");} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;ESP_LOGI(TAG, "IP: " IPSTR, IP2STR(&event->ip_info.ip));xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);  // 锟斤拷}
}// WiFi 
void wifi_init_sta(void) {s_wifi_event_group = xEventGroupCreate();  // //  NVSesp_err_t ret = nvs_flash_init();if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {ESP_ERROR_CHECK(nvs_flash_erase());ret = nvs_flash_init();}ESP_ERROR_CHECK(ret);//  WiFiESP_ERROR_CHECK(esp_netif_init());ESP_ERROR_CHECK(esp_event_loop_create_default());esp_netif_create_default_wifi_sta();wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();ESP_ERROR_CHECK(esp_wifi_init(&cfg));ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL, NULL));ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL, NULL));//  WiFi wifi_config_t wifi_config = {.sta = {.ssid = WIFI_SSID,.password = WIFI_PASS,},};ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));  // ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));ESP_ERROR_CHECK(esp_wifi_start());  //  WiFiESP_LOGI(TAG, "WiFi ");
}// http GET "/open" 处理函数
esp_err_t open_handler(httpd_req_t *req) {//   ESP_LOGI(TAG, "Requested URI: %s", req->uri);    //   ESP_LOGI(TAG, "Requested Method: %s", http_method_str(req->method));//   ESP_LOGI(TAG, "Requested URI: %d", req->content_len);char resp_str[21]="led open"; //httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");httpd_resp_set_type(req, "text/plain");httpd_resp_send(req, resp_str, HTTPD_RESP_USE_STRLEN);     state=0;       //led  开return ESP_OK;
}
//http GET "/close"处理函数
esp_err_t close_handler(httpd_req_t *req){char resp_str[21]="led close";httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); httpd_resp_set_type(req, "text/plain");httpd_resp_send(req, resp_str, HTTPD_RESP_USE_STRLEN);   state=1;	    //led 关return ESP_OK;
}//  HTTP server  注册两个uri  
static httpd_handle_t start_webserver(void) {httpd_config_t config = HTTPD_DEFAULT_CONFIG();httpd_handle_t server = NULL;if (httpd_start(&server, &config) == ESP_OK) {httpd_uri_t open_uri = {.uri      = "/open",.method   = HTTP_GET,.handler  = open_handler,.user_ctx = NULL};httpd_register_uri_handler(server, &open_uri);  //	 }httpd_uri_t close_uri = {.uri      = "/close",.method   = HTTP_GET,.handler  = close_handler,.user_ctx = NULL};httpd_register_uri_handler(server, &close_uri);return server;
}void app_main(void) {//gpio 0 脚注册gpio_config_t io_conf = {};      io_conf.intr_type = GPIO_INTR_DISABLE;io_conf.mode = GPIO_MODE_OUTPUT;io_conf.pin_bit_mask = 1ULL<<GPIO_out;  io_conf.pull_down_en = 0;io_conf.pull_up_en = 0;gpio_config(&io_conf);wifi_init_sta();EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdTRUE, portMAX_DELAY);if (bits & WIFI_CONNECTED_BIT) {ESP_LOGI(TAG, "WiFi ok");//  HTTP start_webserver();} else {ESP_LOGI(TAG, "WiFi no");}while(1){if(state==1){ESP_LOGI("GPIO", "GPIO_input=1");vTaskDelay(1000/portTICK_PERIOD_MS);	}else{lignt();	}}}

2. 浏览器开

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ESP32 Time</title><script>function fetchTime() {fetch('http://192.168.101.41/open') // 替换为你的服务器地址.then(response => response.text()).then(data => {document.getElementById('wz').innerText = data;}).catch(error => console.error('Error fetching time:', error));}// 每1秒调用 fetchTime 函数setInterval(fetchTime, 1000);</script>
</head>
<body><h1> ESP32 开led:</h1><div id="wz">Waiting ...</div>
</body>
</html>

3 浏览器关

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ESP32 Time</title><script>function fetchTime() {fetch('http://192.168.101.41/close') // 替换为你的服务器地址.then(response => response.text()).then(data => {document.getElementById('wz').innerText = data;}).catch(error => console.error('Error fetching time:', error));}// 每1秒调用 fetchTime 函数setInterval(fetchTime, 1000);</script>
</head>
<body><h1> ESP32 关led:</h1><div id="wz">Waiting ...</div>
</body>
</html>

 

 

 

 

 

相关文章:

浏览器控制的无线开关

esp32-c3 作为HTTP server 控制led 灯。服务器注册两个uri 。一个"/open" 控制开&#xff0c;一个"/close"控制关。下一步再用一片c3作为客户端&#xff0c;运行http client 发送/open. /Close 模拟浏览器&#xff0c;控制led. 其实只要用手机或pc或平…...

Docker部署SSM项目及避坑指南

#又踩坑了&#xff0c;这里记录一下&#xff0c;以免日后忘记 前言&#xff1a;本来以为用docker部署个项目很轻松&#xff0c;嗯结果&#xff0c;又踩坑了&#xff0c;这里记录一个完整版。话不多说&#xff0c;开整。 第一步&#xff1a; 用docker拉取MySQL和Tomcat&#…...

多线程代码案例:单例模式/阻塞队列/线程池/定时器

案例一.单例模式 单例模式是一种设计模式;类似于棋谱,有固定套路,针对一些特定场景可以给出一些比较好的解决方案; 只要按照设计模式来写代码,就可以保证代码不会太差,保证了代码的下限; --------------------------------------------------------------------------------…...

Ruby CGI Cookie

Ruby CGI Cookie 在Web开发中,Cookie是一种常用的技术,用于在用户浏览器和服务器之间存储和传递信息。Ruby作为一种流行的编程语言,提供了CGI(Common Gateway Interface)库来处理Cookie。本文将详细介绍如何在Ruby中使用CGI库来创建、读取、修改和删除Cookie。 Cookie的…...

linux中取消anaconda默认使用base环境

在linux新安装anaconda之后&#xff0c;每次打开终端&#xff0c;总是显示正在使用默认anaconda中的base环境&#xff0c;如下如所示&#xff1a; 取消该默认设置&#xff0c;打开home目录下的.condarc文件&#xff0c;在末尾添加如下命令&#xff1a; auto_activate_base: fa…...

江门中微子到底是做什么的?

江门中微子实验是一项重要的大科学装置实验。以下是关于它的一些详细信息&#xff1a; 实验位置与建设深度&#xff1a;位于广东江门地下 700 米处。这样的深度可以有效屏蔽宇宙射线等外界干扰&#xff0c;为探测中微子提供较为纯净的实验环境。探测器特点&#xff1a; 拥有世界…...

React源码03 - React 中的更新

03 - React 中的更新 React 中创建更新的方式&#xff1a; 初次渲染&#xff1a;ReactDOM.render、ReactDOM.hydrate 后续更新&#xff1a;setState、forceUpdate 1. ReactDOM.render() 先创建 ReactRoot 顶点对象然后创建 FiberRoot 和 RootFiber创建更新&#xff0c;使应用进…...

【Hive实战】Hive MetaStore升级调研(Mysql)

Hive MetaStore升级调研&#xff08;Mysql库&#xff09; 文章目录 Hive MetaStore升级调研&#xff08;Mysql库&#xff09;升级步骤脚本说明原文 MetaStore升级的主要部分是对存储媒介mysql进行schema进行升级。 升级步骤 关闭MetaStore实例并限制对MetaStore MySQL数据库的访…...

优化漏洞扫描流程以保障企业数字化业务安全

漏洞扫描技术历经二十余年发展&#xff0c;已从人工搜索演进至开源及商业扫描平台&#xff0c;其应用紧随IT环境与数字业务变迁而不断革新。为有效提升漏洞检测效果&#xff0c;确保企业数字化业务安全运行&#xff0c;安全专家建议遵循以下关键步骤实施漏洞扫描&#xff1a; …...

【大数据算法】一文掌握大数据算法之:大数据算法分析技术。

大数据算法分析技术 1、引言2、 大数据分析技术2.1 时间/空间复杂度2.2 I/O 复杂度2.3 结果质量2.4 通信复杂度 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;最近更文有些不频繁了哈。 小鱼&#xff1a;这一个月不见&#xff0c;你这说话方式也变了。 小屌丝&#xff…...

使用AITemplate和AMD GPU的高效图像生成:结合Stable Diffusion模型

Efficient image generation with Stable Diffusion models and AITemplate using AMD GPUs 2024年1月24日&#xff0c;作者是[Douglas Jia] Stable Diffusion 已成为图像生成领域的突破性进展&#xff0c;帮助用户将文本描述转化为引人入胜的视觉输出。 Stable Diffusion 的…...

基于yolov10的驾驶员抽烟打电话安全带检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv10的驾驶员抽烟、打电话、安全带检测系统是一种先进的驾驶行为监测系统。该系统利用YOLOv10算法的高效性和准确性&#xff0c;实现对驾驶员行为的实时检测与识别。 YOLOv10是一种最新的实时物体检测模型&#xff0c;其通过深度学习技术&#xff0c;如卷…...

虚拟机网络设置为桥接模式

1、打开VMware Workstation Pro&#xff0c;点击“虚拟机—设置”&#xff0c;进入虚拟机设置页面 2、点击“网络适配器”&#xff0c;网络连接选择桥接模式 3、点击“编辑—虚拟网络编辑器”&#xff0c;进入虚拟网络编辑器页面 4、选择桥接模式&#xff0c;并选择要桥接到的…...

Numpy基础02

目录 1.数组操作 1.1改变维度 1.2遍历数组 1.2.1nditer(array,order) 1.2.1.1flags 参数 1.2.1.2op_flags 参数 1.3平展数组 1.3.1flatten(orderC) 1.3.2ravel() 1.4数组转置 1.4.1transpose() 1.4.2T 1.5分割数组 1.5.1hsplit(arr,indices_or_section) 1.5.2vsp…...

Elasticsearch是做什么的?

初识elasticsearch 官方网站&#xff1a;Elasticsearch&#xff1a;官方分布式搜索和分析引擎 | Elastic Elasticsearch是做什么的&#xff1f; Elasticsearch 是一个分布式搜索和分析引擎&#xff0c;专门用于处理大规模数据的实时搜索、分析和存储。它基于 Apache Lucene …...

Java中消息队列

MQ是Message Queue的缩写&#xff0c;也就是消息队列的意思&#xff0c;它是一种应用程序对应用程序的通信方法&#xff0c;使得应用程序能够通过读写出入列队的消息来进行通信&#xff0c;而无需要使用专用的连接来链接它们。消息队列中间件是分布式系统中重要的组件&#xff…...

高频面试手撕

手撕高频结构 前言 以下内容&#xff0c;都是博主在秋招面试中&#xff0c;遇到的面试手撕代码题目&#xff0c;不同于算法题目&#xff0c;更多考察的是基础知识&#xff0c;包含常见的数据结构比如线性表、哈希表、优先级队列等&#xff0c;还有多线程以及数据库连接池等内…...

Spring Boot 3.3 【八】整合实现高可用 Redis 集群

一、引言 在当今快速发展的软件开发领域&#xff0c;系统的性能和可靠性至关重要。Springboot 3 整合 Redis 7 集群具有多方面的重大意义。 首先&#xff0c;随着业务的不断发展&#xff0c;数据量呈爆炸式增长&#xff0c;单个 Redis 服务器往往难以满足存储和处理需求。Red…...

循环控制结构穷举 同构数

说明 同构数是会出现在它的平方的右边的数。例如&#xff0c;5就是1个同构数。5的平方是25&#xff0c;25最右边的这个数是5自己。25也是一个同构数&#xff0c;比如25的平方是625&#xff0c;而625右边的数是25. 请编程输出1000以内正整数中所有的同构数。每行一个答案。 输…...

主机本地IP与公网IP以及虚拟机的适配器和WSL发行版的IP

在局域网内&#xff0c;如果你想要连接到同一网络中的另一台设备&#xff0c;建议使用 本地 IP 地址&#xff08;也称为局域网 IP 地址&#xff09;。这是因为本地 IP 地址是在局域网内分配给设备的&#xff0c;用于在同一网络中的设备之间进行通信。 使用本地 IP 地址的好处 …...

从手动压枪到智能辅助:探索罗技鼠标宏在PUBG中的进化之路

从手动压枪到智能辅助&#xff1a;探索罗技鼠标宏在PUBG中的进化之路 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 当你在绝地求生的激烈对枪中…...

Mongo(2): MongoDB权限认证实战——从零配置用户角色与访问控制

1. MongoDB权限认证的必要性 第一次接触MongoDB时&#xff0c;很多人都会被它"开箱即用"的特性吸引——安装完成后不需要任何配置就能直接操作数据库。这种便利性在开发测试阶段确实很友好&#xff0c;但一旦进入生产环境&#xff0c;就相当于把自家大门敞开给所有人…...

Z-Image-Turbo-辉夜巫女数据预处理实战:模拟VLOOKUP实现提示词与风格模板匹配

Z-Image-Turbo-辉夜巫女数据预处理实战&#xff1a;模拟VLOOKUP实现提示词与风格模板匹配 你有没有遇到过这样的烦恼&#xff1f;每次用AI画图&#xff0c;想生成一个“赛博朋克”风格的图片&#xff0c;都得重新回忆或者翻找之前写好的那一长串复杂的提示词。或者团队里每个人…...

Cursor Pro免费激活终极指南:3种方法永久解锁AI编程助手

Cursor Pro免费激活终极指南&#xff1a;3种方法永久解锁AI编程助手 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your t…...

科研人必备:用浏览器插件给IEEEXplore做个‘小手术’,告别20秒加载

科研效率革命&#xff1a;用浏览器插件精准优化IEEEXplore访问体验 每次打开IEEEXplore文献库&#xff0c;那个转不停的加载图标是否让你焦躁不安&#xff1f;作为每天要与学术数据库打交道的科研工作者&#xff0c;20秒的等待时间足以打断思考流&#xff0c;降低工作效率。这背…...

OneMore插件终极指南:160+功能免费解锁OneNote完整生产力

OneMore插件终极指南&#xff1a;160功能免费解锁OneNote完整生产力 【免费下载链接】OneMore A OneNote add-in with simple, yet powerful and useful features 项目地址: https://gitcode.com/gh_mirrors/on/OneMore OneMore是一款功能强大的OneNote免费开源插件&…...

BG3ModManager模组管理工具完全指南

BG3ModManager模组管理工具完全指南 【免费下载链接】BG3ModManager A mod manager for Baldurs Gate 3. 项目地址: https://gitcode.com/gh_mirrors/bg/BG3ModManager 一、初识BG3ModManager BG3ModManager作为《博德之门3》的专用模组管理工具&#xff0c;为玩家提供…...

Umi-OCR:重新定义本地化文字识别的工作流范式

Umi-OCR&#xff1a;重新定义本地化文字识别的工作流范式 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片&#xff0c;PDF文档识别&#xff0c;排除水印/页眉页脚&#xff0c;扫描/生成二维码。内置多国语言库。 …...

从零玩转GitHub:避坑指南与进阶技巧——2026年还不懂的天塌了

好的&#xff0c;今天这篇&#xff0c;咱不聊风花雪月&#xff0c;不扯行业趋势&#xff0c;就唠一个程序员安身立命的硬通货——GitHub。 对&#xff0c;就是那个绿油油的头像、一片Contributions的小方格&#xff0c;被无数简历写成“熟悉版本控制工具”&#xff0c;但可能连…...

如何用baidupankey解决百度网盘提取码获取难题

如何用baidupankey解决百度网盘提取码获取难题 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 引言&#xff1a;被提取码困住的日常 "又要找提取码&#xff1f;"小张盯着电脑屏幕上的百度网盘分享链接&#xff0c;…...