竹壳天气时钟(一)使用数组保存扫描到的WiFi列表信息

一、简介

准备用基于esp8266的nodemcu开发板做一个天气时钟。

一步一步记录代码编写过程。

/*竹壳天气时钟

  Bamboo shell weather clock

  使用基于esp8266的NodeMCU制作。

  计划用竹子做最后成品的外壳,所以才有了这个名称。

  第一阶段任务:

  1.实现WiFi连接;

  2.如果30秒后还没连接成功就开启混合模式,使用webserver进行设置;

  3.页面可以输入ssid和密码连接WiFi;

  4.页面可以手动扫描WiFi网络并显示出扫描到的网络列表;

  5.点击需要连接的WiFi网络后可以输入密码并连接网络;

  6.连接成功后web页面弹出连接成功的提示并显示获取到的IP地址。

  2024年9月19日开始

*/

二、我目前在使用的云服务器推荐

学Linux不搞个云服务器始终感觉不爽!
要稳定性、安全性、不差钱的可以使用阿里、腾讯等大厂的云服务器。
本人穷屌丝一枚,所以我用的是免费的“三丰云”,同时提供"免费虚拟主机"和“免费云服务器”产品,有兴趣的可以试一下。
“三丰云”我已经用了一段时间,感觉还是很不错的,速度快也很稳定。
三丰云 https://www.sanfengyun.com 链接。
大家可以点击前往查看是否需要。

三、代码
/*竹壳天气时钟Bamboo shell weather clock使用基于esp8266的NodeMCU制作。计划用竹子做最后成品的外壳,所以才有了这个名称。第一阶段任务:1.实现WiFi连接;2.如果30秒后还没连接成功就开启混合模式,使用webserver进行设置;3.页面可以输入ssid和密码连接WiFi;4.页面可以手动扫描WiFi网络并显示出扫描到的网络列表;5.点击需要连接的WiFi网络后可以输入密码并连接网络;6.连接成功后web页面弹出连接成功的提示并显示获取到的IP地址。2024年9月19日开始
*/
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>#ifndef STASSID
#define STASSID "your-ssid"
#define STAPSK "your-password"
#endifconst char* ssid = STASSID;
const char* password = STAPSK;#ifndef APSSID
#define APSSID "ESPap"
#define APPSK "nodemcu-esp8266"
#endifconst char *apssid = APSSID;
const char *appassword = APPSK;
// 自定义数据结构
struct Listwifi {String ssid;int32_t rssi;uint8_t encryptionType;uint8_t *bssid;int32_t channel;bool hidden;
};
// WiFi列表保存数据使用的数组
Listwifi *wifiList;void wsf() {int scanResult;Serial.println(F("开始WiFi扫描..."));scanResult = WiFi.scanNetworks(/*async=*/false, /*hidden=*/true);if (scanResult == 0) {Serial.println(F("找不到WiFi网络"));} else if (scanResult > 0) {Serial.printf(PSTR("%d 扫描出的网络数量:\n"), scanResult);// 打印扫描出的WiFi列表for (int8_t i = 0; i < scanResult; i++) {WiFi.getNetworkInfo(i, wifiList[i].ssid, wifiList[i].encryptionType, wifiList[i].rssi, wifiList[i].bssid, wifiList[i].channel, wifiList[i].hidden);// 获取扩展信息const bss_info *bssInfo = WiFi.getScanInfoByIndex(i);String phyMode;const char *wps = "";if (bssInfo) {phyMode.reserve(12);phyMode = F("802.11");String slash;if (bssInfo->phy_11b) {phyMode += 'b';slash = '/';}if (bssInfo->phy_11g) {phyMode += slash + 'g';slash = '/';}if (bssInfo->phy_11n) {phyMode += slash + 'n';}if (bssInfo->wps) {wps = PSTR("WPS");}}Serial.printf(PSTR("  %02d: [CH %02d] [%02X:%02X:%02X:%02X:%02X:%02X] %ddBm %c %c %-11s %3S %s\n"), i, wifiList[i].channel, wifiList[i].bssid[0], wifiList[i].bssid[1], wifiList[i].bssid[2], wifiList[i].bssid[3], wifiList[i].bssid[4], wifiList[i].bssid[5], wifiList[i].rssi, (wifiList[i].encryptionType == ENC_TYPE_NONE) ? ' ' : '*', wifiList[i].hidden ? 'H' : 'V', phyMode.c_str(), wps, wifiList[i].ssid.c_str());yield();}} else {Serial.printf(PSTR("WiFi扫描出现错误 %d"), scanResult);}
}ESP8266WebServer server(80);void handleRoot() {server.send(200, "text/html", "<h1>You are connected</h1>");
}void configap(){Serial.println();Serial.print("Configuring access point...");// 设置WiFi模式为混合模式WiFi.mode(WIFI_AP_STA);WiFi.softAP(apssid, appassword);IPAddress myIP = WiFi.softAPIP();Serial.print("AP IP address: ");Serial.println(myIP);server.on("/", handleRoot);server.begin();Serial.println("HTTP server started");
}void setup() {// put your setup code here, to run once:// 打印信息Serial.begin(115200);Serial.println();Serial.println();Serial.print("Connecting to ");Serial.println(ssid);// 连接WiFiWiFi.mode(WIFI_STA);WiFi.begin(ssid, password);// 连接过程中打印出读秒的数字int i=0;while (WiFi.status() != WL_CONNECTED) {Serial.print(i);i++;if (i > 30) {configap();return;}delay(1000);}// 连接成功后打印消息和本地IPSerial.println("");Serial.println("WiFi connected");Serial.println("IP address: ");Serial.println(WiFi.localIP());
}void loop() {// put your main code here, to run repeatedly:server.handleClient();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/56181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mariadb设置远程访问

编辑 /etc/mysql/my.cnf文件&#xff0c;添加以下代码 [mysqld] bind-address 0.0.0.0 在mariadb中添加一个用于远程访问的新用户 先进入mariadb mysql -u root -p 创建用户 // 创建用户 create user remote_user% identified by password; // 给远程访问权限 grant all…

MySQL表的基本查询上

1&#xff0c;创建表 前面基础的文章已经讲了很多啦&#xff0c;直接上操作&#xff1a; 非常简单&#xff01;下一个&#xff01; 2&#xff0c;插入数据 1&#xff0c;全列插入 前面也说很多了&#xff0c;直接上操作&#xff1a; 以上插入和全列插入类似&#xff0c;全列…

小红书新ID保持项目StoryMaker,面部特征、服装、发型和身体特征都能保持一致!(已开源)

继之前和大家介绍的小红书在ID保持以及风格转换方面相关的优秀工作&#xff0c;感兴趣的小伙伴可以点击以下链接阅读~ 近期&#xff0c;小红书又新开源了一款文生图身份保持项目&#xff1a;StoryMaker&#xff0c;是一种个性化解决方案&#xff0c;它不仅保留了面部的一致性&…

智能交通与车联网:未来出行的创新变革

随着全球城市化进程的加速和交通需求的不断增加&#xff0c;传统的交通管理方式已经无法满足日益复杂的交通问题。智能交通&#xff08;Intelligent Transportation System, ITS&#xff09;和车联网&#xff08;Internet of Vehicles, IoV&#xff09;作为现代科技与交通行业深…

云手机:社交平台运营的热门工具

随着互联网的飞速发展&#xff0c;社交平台已经成为企业推广和营销的核心渠道。传统的运营方式已经无法满足高效运营的需求&#xff0c;而云手机作为新兴工具&#xff0c;逐渐成为社交平台运营的前沿趋势。本文将深入分析云手机如何优化社交平台的运营流程&#xff0c;助力企业…

outlook 添加企业邮箱账号出现 553 authentication is required 错误解决

系统报错如下 问题原因 发件服务器身份验证设置错误&#xff0c;或者未勾选发送服务器验证的选项。 解决方案 Outlook客户端 本文以Outlook 2016为例&#xff0c;具体操如下&#xff1a; 1、在Outlook客户端的电子邮件设置窗口中&#xff0c;单击其他设置&#xff1b; 2、…

鸿蒙开发(NEXT/API 12)【发送数据到服务器】远场通信场景

场景介绍 客户端请求发送数据到服务器。 开发步骤 导入模块。 import { rcp } from kit.RemoteCommunicationKit; import { BusinessError } from kit.BasicServicesKit;发起请求。"http://www.example.com"请根据实际情况替换为想要请求的URL地址。 const sess…

【ICPC】The 2021 ICPC Asia Shanghai Regional Programming Contest H

Life is a Game #最小生成树 #重构树 #图论 #贪心 题目描述 A good problem should have a concise statement. You are given an array a a a of length n n n, initially filled with zeros, and another array b b b of length n n n. Your goal is to transform arr…

Pandas处理时间序列之光谱分析与聚类

import matplotlib.pylab as plt %matplotlib inline import numpy as np from numpy import fft import pandas as pd 一、光谱分析 • 将时间序列分解为许多正弦或余弦函数的总和 • 这些函数的系数应该具有不相关的值 • 对正弦函数进行回归 光谱分析应用场景 基于光谱的…

集师知识付费小程序:打造培训机构在线教育的金字招牌 集师知识付费系统 集师知识付费小程序 集师知识服务系统 集师线上培训系统 集师线上卖课小程序

在数字化浪潮的推动下&#xff0c;在线教育已成为教育领域的热门话题。而在众多在线教育平台中&#xff0c;集师知识付费小程序凭借其独特的定位和创新的模式&#xff0c;成功为培训机构打造了一张闪亮的在线教育金字招牌。 集师知识付费小程序&#xff0c;是一个集课程展示、…

告别@Value,Spring Boot 3.3更优雅的配置注入方案

在Spring Boot的早期版本中&#xff0c;我们常使用Value注解来注入配置文件中的属性值。然而&#xff0c;这种方式虽然简单直接&#xff0c;却存在一些局限&#xff0c;比如它只能注入基本类型的值&#xff0c;并且需要显式地在每个需要注入的字段上使用注解。随着Spring Boot的…

哪款宠物空气净化器性价比高?希喂、米家和范罗士哪款更好?

这次我真的不是很想抱怨&#xff0c;是我男朋友真的很过分&#xff01;真的很过分&#xff0c;差点让我们两个分道扬镳。先听我说&#xff0c;这不是我和他都嫌家里太安静了吗&#xff0c;每天下班后两个人吃完饭就各玩各的手机&#xff0c;生活太无趣了&#xff0c;加上这几年…

软件功能测试重点和流程有哪些?专业软件测评服务公司推荐

软件功能测试就是对产品的各功能进行验证&#xff0c;根据功能测试用例&#xff0c;逐项测试&#xff0c;检查产品是否达到用户要求的功能。功能测试也叫黑盒测试或数据驱动测试&#xff0c;只需考虑需要测试的各个功能&#xff0c;不需要考虑整个软件的内部结构及代码.一般从软…

windows 安装 ElasticSearch

1、下载安装包 下载地址&#xff1a;https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.14.3-windows-x86_64.zip ElasticSearch 目录结构如下&#xff1a; 2、配置JDK环境 ES比较耗内存&#xff0c;建议虚拟机4G或以上内存&#xff0c;jvm1g以上的内存分…

告别信息过载!NotebookLM:你的AI学习与研究助手

在信息爆炸的时代&#xff0c;我们每天都面临着海量的信息&#xff0c;如何高效地处理和理解这些信息&#xff0c;成为了许多人面临的挑战。 Google 推出的 NotebookLM&#xff0c;或许能成为你的答案。这款结合了大语言模型 (LLM) 与用户笔记的 AI 笔记本&#xff0c;正在重新…

【网络安全】一篇文章带你了解CTF那些事儿

文章目录 一、什么是CTF&#xff1f;二、CTF需要学习那些知识&#xff1f;新书推荐适合新手自学的网络安全基础技能“蓝宝书”&#xff1a;《CTF那些事儿》内容简介读者对象专家推荐三、网络安全学习路线四、网络安全学习资料 一、什么是CTF&#xff1f; CTF&#xff08;Captu…

vue+element的confirm提示消息文字变色和换行

效果: 思路: 可以考虑采用模板字符串的思路实现 代码: this.confirm(您确定要<b style"Color: red">${text}</b>的数据项&#xff1f;<br/>单位名称: ${row.companyName} <br/>属性: ${row.attributeName}).then(() > {console.log(确定…

深入理解Java并发读写锁——ReentrantReadWriteLock

ReentrantReadWriteLock使用场景 ReentrantReadWriteLock 是 Java 的一种读写锁&#xff0c;它允许多个读线程同时访问&#xff0c;但只允许一个写线程访问&#xff08;会阻塞所有的读写线程&#xff09;。这种锁的设计可以提高性能&#xff0c;特别是在读操作的数量远远超过写…

预算不变,数据安全大升级!揭秘TRAID+的神奇之处

假期过后&#xff0c;公司弥漫着一股低沉的气息&#xff0c;公司的CTO&#xff0c;小威&#xff0c;正面对着一个令人头疼的问题——如何在不增加预算的情况下&#xff0c;提高公司的数据安全性。 如今各种勒索病毒层出不穷&#xff0c;或是因为硬盘的损坏或者员工的马虎使数据…

通信工程学习:什么是UART通用异步收发器

UART&#xff1a;通用异步收发器 UART&#xff0c;全称Universal Asynchronous Receiver/Transmitter&#xff0c;即通用异步收发传输器&#xff0c;是一种广泛应用于嵌入式领域的串行、异步、全双工通信协议。以下是关于UART的详细介绍&#xff1a; 一、定义与特点 定义&…