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

ESP-C3入门8. 连接WiFi并打印信息

ESP-C3入门8. 连接WiFi并打印信息

  • 一、ESP32 连接WiFi的基本操作流程
    • 1. 初始化nvs存储
    • 2. 配置WiFi工作模式
    • 3. 设置WiFi登陆信息
    • 4. 启动WiFi
    • 5. 开启连接
    • 6. 判断是否成功
  • 二、事件处理函数
    • 1. 定义事件处理函数
    • 2. 创建事件组
    • 3. 在事件处理函数中设置事件组位
    • 4. 在其他任务中等待事件组位
    • 5. 注册事件处理函数
    • 6. 如果有必要取消注册
  • 三、事件组的使用
    • 1. 创建事件组
    • 2. 向事件组中设置事件
    • 3. 在其它任务中等待事件
  • 四、实现过程
    • 1. WiFi初始化函数做以下事情
    • 2. WiFi Station模式初始化
    • 3. 事件回调
  • 五、完整代码

在这里插入图片描述

本文示例代码主要来自官方开源仓库:
https://gitee.com/EspressifSystems/book-esp32c3-iot-projects

一、ESP32 连接WiFi的基本操作流程

1. 初始化nvs存储

nvs_flash_init();
tcpip_adapter_init();

2. 配置WiFi工作模式

wifi_init_config_t wifi_init_config = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&wifi_init_config);
esp_wifi_set_storage(WIFI_STORAGE_RAM);
esp_wifi_set_mode(WIFI_MODE_STA);

3. 设置WiFi登陆信息

wifi_config_t wifi_config = {.sta = {.ssid = "your_SSID",.password = "your_password",},
};
esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config);

4. 启动WiFi

esp_wifi_start();

5. 开启连接

esp_wifi_connect();

6. 判断是否成功

wifi_ap_record_t ap_info;
esp_wifi_sta_get_ap_info(&ap_info);
if (ap_info.authmode != WIFI_AUTH_OPEN) {// 连接成功
} else {// 连接失败
}

二、事件处理函数

在 ESP-IDF 中,一些关键的系统任务(比如,Wi-Fi连接、网络传输等)通常都是在事件驱动的模式下实现的,
系统会生成一些事件,然后由事件处理机制来进行处理。事件处理机制是用于接收并处理系统事件的主要机制,通过它,可以实现自定义的动作(比如,记录日志、进行状态更新等)。

在ESP-IDF中使用事件处理函数有以下步骤:

1. 定义事件处理函数

定义一个函数,用于处理特定的事件,如:

void event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data)
{// your code here
}

2. 创建事件组

使用 xEventGroupCreate 函数创建事件组。

3. 在事件处理函数中设置事件组位

在事件处理函数内部,使用 xEventGroupSetBits 函数设置事件组位,以标识事件已经发生。

4. 在其他任务中等待事件组位

使用 xEventGroupWaitBits 函数在其他任务中等待事件组位,以确认事件已经发生。

5. 注册事件处理函数

使用函数(如 esp_event_loop_init)注册事件处理函数,使其生效。

esp_event_handler_register(event_base, event_id, event_handler, arg);

其中:

  • event_base 是事件的基础,通常是一个枚举,它表示事件类别,比如 WIFI_EVENT。
  • event_id 是事件的 ID,通常也是一个枚举,它表示事件类型,比如 WIFI_EVENT_STA_DISCONNECTED。
  • event_handler 是事件处理函数,用来处理事件,从中读取事件数据。
  • arg 是一个用户指定的参数,在事件处理函数中可以读取。

6. 如果有必要取消注册

esp_event_handler_unregister(event_base, event_id, event_handler);

三、事件组的使用

ESP-IDF中的事件组是一种线程间同步机制,允许多个任务同时等待特定的事件发生。
在ESP-IDF中使用事件组的步骤是:

1. 创建事件组

EventGroupHandle_t s_event_group = xEventGroupCreate();

2. 向事件组中设置事件

xEventGroupSetBits(s_event_group, BIT0);

3. 在其它任务中等待事件

EventBits_t bits = xEventGroupWaitBits(s_event_group, BIT0, pdFALSE, pdFALSE, portMAX_DELAY);

四、实现过程

1. WiFi初始化函数做以下事情

  • 创建一个事件组,用来管理Wi-Fi连接事件。
  • 实始化协议栈
  • 创建默认事件循环
  • WiFi设置为sta模式
  • 注册事件处理器
static void wifi_initialize(void)
{// 创建一个事件组,用于管理Wi-Fi连接事件。s_wifi_event_group = xEventGroupCreate();// 初始化 TCP/IP 协议栈。ESP_ERROR_CHECK(esp_netif_init());// 创建默认事件循环。ESP_ERROR_CHECK(esp_event_loop_create_default());// 创建默认的Wi-Fi网络接口。esp_netif_create_default_wifi_sta();// 设置 Wi-Fi 初始化配置为默认配置wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();ESP_ERROR_CHECK(esp_wifi_init(&cfg));// 注册事件处理器,以处理 Wi-Fi 和 IP 相关事件ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL));ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL));
}

其中事件组的定义是:

static EventGroupHandle_t s_wifi_event_group = NULL;

2. WiFi Station模式初始化

  • 配置WiFi信息
  • WiFi工作模式设置为STA
  • 启动WiFi
  • 等待事件
static void wifi_station_initialize(void)
{// 配置WiFi的配置信息wifi_config_t wifi_config = {.sta = {.ssid = LIGHT_ESP_WIFI_SSID,.password = LIGHT_ESP_WIFI_PASS,// 启用WPA2模式,常用的WiFi连接方式.threshold.authmode = WIFI_AUTH_WPA2_PSK,.pmf_cfg = {.capable = true,.required = false},},};// WiFi工作模式设置为STAESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));// 设置WiFi工作模式ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));// 启动WiFiESP_ERROR_CHECK(esp_wifi_start());ESP_LOGI(TAG, "wifi_station_initialize finished.");// 下面的代码不是必须的,但它演示了程序如何阻塞并等待连接成功/* 等待连接建立(WIFI_CONNECTED_BIT)或连接失败的次数达到最大值(WIFI_FAIL_BIT)。* 这些位通过 event_handler() 设置(详见上面)*/EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group, WIFI_CONNECTED_BIT | WIFI_FAIL_BIT, pdFALSE, pdFALSE, portMAX_DELAY);/* xEventGroupWaitBits() 返回调用前的 bits,因此我们可以测试实际发生了什么事件。 */if (bits & WIFI_CONNECTED_BIT) {ESP_LOGI(TAG, "connected to ap SSID:%s password:%s", LIGHT_ESP_WIFI_SSID, LIGHT_ESP_WIFI_PASS);} else if (bits & WIFI_FAIL_BIT) {ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s", LIGHT_ESP_WIFI_SSID, LIGHT_ESP_WIFI_PASS);} else {ESP_LOGE(TAG, "UNEXPECTED EVENT");}
}

xEventGroupWaitBits 函数在这里不是必须的。 它是一个阻塞函数,将等待一个或多个事件位被设置,直到返回时间结束。
本示例中,它等待 WIFI_CONNECTED_BIT 或 WIFI_FAIL_BIT 中的任何一个事件位被设置,并且等待的最长时间是 portMAX_DELAY。

相关参数:

  • s_wifi_event_group 是事件组变量,用于存储事件位。
  • WIFI_CONNECTED_BIT | WIFI_FAIL_BIT 是要等待的事件位。WIFI_CONNECTED_BIT 表示 Wi-Fi 连接成功的事件,WIFI_FAIL_BIT 表示 Wi-Fi 连接失败的事件。
  • pdFALSE 和 pdTRUE 是宏,分别表示布尔值的 false 和 true,此处代表不需要等待所有事件位(pdFALSE)和不清除事件位(pdFALSE)。
  • portMAX_DELAY 是一个常量,表示无限等待。
  • 返回值(EventBits_t bits)是一个事件位变量,表示返回的事件位。

该代码实现了在等待 Wi-Fi 连接结果的同时不占用 CPU 资源,并在连接成功或失败时记录事件位以作后续处理。

事件组允许每个事件有多个位,前面要定义:

#define WIFI_CONNECTED_BIT BIT0
#define WIFI_FAIL_BIT      BIT1

这里的BIT0 BIT1由开发者自行定义。

3. 事件回调

// 事件回调
static void event_handler(void *arg, esp_event_base_t event_base,int32_t event_id, void *event_data)
{// 如果是Wi-Fi事件,并且事件ID是Wi-Fi事件STA_STARTif (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) {// 如果是Wi-Fi事件,并且事件ID是Wi-Fi事件STA_DISCONNECTED/* 如果重试次数小于最大重试次数 */if (s_retry_num < LIGHT_ESP_MAXIMUM_RETRY) {esp_wifi_connect();s_retry_num++;ESP_LOGI(TAG, "retry to connect to the AP");} else {xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);}ESP_LOGI(TAG, "connect to the AP fail");} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {// 如果是IP事件,并且事件ID是IP事件STA_GOT_IP// 获取事件结果ip_event_got_ip_t *event = (ip_event_got_ip_t *) event_data;ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));// 将重试次数重置为 0;s_retry_num = 0;// 通过调用 xEventGroupSetBits 函数,将 WIFI_CONNECTED_BIT 设置到事件组中,表示成功连接到 APxEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);}
}

五、完整代码

#include <string.h>#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"#define LIGHT_ESP_WIFI_SSID     "你的WIFI账号"
#define LIGHT_ESP_WIFI_PASS     "你的WiFi密码"
#define LIGHT_ESP_MAXIMUM_RETRY 5// 事件组允许每个事件有多个位,这里只使用两个事件:
// 已经连接到AP并获得了IP
// 在最大重试次数后仍未连接
#define WIFI_CONNECTED_BIT BIT0
#define WIFI_FAIL_BIT      BIT1static const char *TAG = "wifi connection";// FreeRTOS事件组,连接成功时发出信号
static EventGroupHandle_t s_wifi_event_group = NULL;
static int s_retry_num = 0;// 事件回调
static void event_handler(void *arg, esp_event_base_t event_base,int32_t event_id, void *event_data)
{// 如果是Wi-Fi事件,并且事件ID是Wi-Fi事件STA_STARTif (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) {// 如果是Wi-Fi事件,并且事件ID是Wi-Fi事件STA_DISCONNECTED/* 如果重试次数小于最大重试次数 */if (s_retry_num < LIGHT_ESP_MAXIMUM_RETRY) {esp_wifi_connect();s_retry_num++;ESP_LOGI(TAG, "retry to connect to the AP");} else {xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);}ESP_LOGI(TAG, "connect to the AP fail");} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {// 如果是IP事件,并且事件ID是IP事件STA_GOT_IP// 获取事件结果ip_event_got_ip_t *event = (ip_event_got_ip_t *) event_data;ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));// 将重试次数重置为 0;s_retry_num = 0;// 通过调用 xEventGroupSetBits 函数,将 WIFI_CONNECTED_BIT 设置到事件组中,表示成功连接到 APxEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);}
}static void wifi_initialize(void)
{// 创建一个事件组,用于管理Wi-Fi连接事件。s_wifi_event_group = xEventGroupCreate();// 初始化 TCP/IP 协议栈。ESP_ERROR_CHECK(esp_netif_init());// 创建默认事件循环。ESP_ERROR_CHECK(esp_event_loop_create_default());// 创建默认的Wi-Fi网络接口。esp_netif_create_default_wifi_sta();// 设置 Wi-Fi 初始化配置为默认配置wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();ESP_ERROR_CHECK(esp_wifi_init(&cfg));// 注册事件处理器,以处理 Wi-Fi 和 IP 相关事件ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL));ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL));
}static void wifi_station_initialize(void)
{// 配置WiFi的配置信息wifi_config_t wifi_config = {.sta = {.ssid = LIGHT_ESP_WIFI_SSID,.password = LIGHT_ESP_WIFI_PASS,// 启用WPA2模式,常用的WiFi连接方式.threshold.authmode = WIFI_AUTH_WPA2_PSK,.pmf_cfg = {.capable = true,.required = false},},};// WiFi工作模式设置为STAESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));// 设置WiFi工作模式ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));// 启动WiFiESP_ERROR_CHECK(esp_wifi_start());ESP_LOGI(TAG, "wifi_station_initialize finished.");/* 等待连接建立(WIFI_CONNECTED_BIT)或连接失败的次数达到最大值(WIFI_FAIL_BIT)。* 这些位通过 event_handler() 设置(详见上面)*/EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group, WIFI_CONNECTED_BIT | WIFI_FAIL_BIT, pdFALSE, pdFALSE, portMAX_DELAY);/* xEventGroupWaitBits() 返回调用前的 bits,因此我们可以测试实际发生了什么事件。 */if (bits & WIFI_CONNECTED_BIT) {ESP_LOGI(TAG, "connected to ap SSID:%s password:%s", LIGHT_ESP_WIFI_SSID, LIGHT_ESP_WIFI_PASS);} else if (bits & WIFI_FAIL_BIT) {ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s", LIGHT_ESP_WIFI_SSID, LIGHT_ESP_WIFI_PASS);} else {ESP_LOGE(TAG, "UNEXPECTED EVENT");}
}void app_main()
{int i = 0;ESP_LOGE(TAG, "app_main");// 初始化NVS存储区ESP_ERROR_CHECK(nvs_flash_init());// Wi-Fi初始化ESP_LOGI(TAG, "Wi-Fi initialization");wifi_initialize();// Wi-Fi Station初始化wifi_station_initialize();while (1) {ESP_LOGI(TAG, "[%02d] Hello world!", i++);vTaskDelay(pdMS_TO_TICKS(5000));}
}

运行结果:
在这里插入图片描述

相关文章:

ESP-C3入门8. 连接WiFi并打印信息

ESP-C3入门8. 连接WiFi并打印信息一、ESP32 连接WiFi的基本操作流程1. 初始化nvs存储2. 配置WiFi工作模式3. 设置WiFi登陆信息4. 启动WiFi5. 开启连接6. 判断是否成功二、事件处理函数1. 定义事件处理函数2. 创建事件组3. 在事件处理函数中设置事件组位4. 在其他任务中等待事件…...

使用python将EXCEL表格中数据转存到数据库

使用Python将excel表格中数据转存到数据库 1. 思路&#xff1a; 1&#xff09; 使用python读取excel表格中数据 2&#xff09;根据数据生成sql语句 3&#xff09;批量运行sql语句 2. 代码&#xff1a; import pandas as pddef readExcel(path, excel_file):return pd.read_e…...

【C++】类和对象(三)

目录 一、构造函数补充 1、初始化列表 1.1、初始化列表概念 1.2、初始化列表性质 2、explicit关键字 二、static成员 1、概念及使用 2、性质总结 三、友元 1、友元函数 2、友元类 四、内部类 五、拷贝对象时的一些编译器优化 一、构造函数补充 在《类和对象&#x…...

vTESTstudio - VT System CAPL Functions - General/Trigger Function

前面文章中我们已经介绍了常用的几种板卡的基本信息&#xff0c;那这些板卡该如何去通过软件调用呢&#xff1f;带着这个问题我们开始新的一块内容 - VT系统相关的自动化控制函数介绍&#xff0c;我会按照不同的板卡来分类&#xff0c;对其可控制的函数进行介绍&#xff0c;方便…...

IDEA 快捷键

ctrlD &#xff1a;复制当前行到下一行 ctrlO : 重写当前类的方法 ctrlshiftu : 大小写转化 Alt 上/下 &#xff1a;跳到上一个、下一个函数 Alt 左/右 : 回到上一个、下一个文件 Alt 回车 &#xff1a; 代码修正 Alt Insert &#xff1a; 插入代码 Ctrl Alt L &#xf…...

2023新华为OD机试题 - 入栈出栈(JavaScript) | 刷完必过

入栈出栈 题目 向一个空栈中依次存入正整数 假设入栈元素N(1 <= N <= 2^31-1) 按顺序依次为Nx ... N4、N3、N2、N1, 当元素入栈时,如果N1=N2+...Ny (y的范围[2,x],1 <= x <= 1000) 则N1到Ny全部元素出栈,重新入栈新元素M(M=2*N1) 如依次向栈存储6、1、2、3,当存…...

微信公众号扫码授权登录思路

引言 上学期研究了一下微信登录相关内容&#xff0c;也写了两三篇笔记&#xff0c;但是最后实际登录流程没有写&#xff0c;主要因为感觉功能完成有所欠缺&#xff0c;一直也没有好的思路&#xff1b;这两天我又看了看官方文档&#xff0c;重新构思了一下微信公众号登录相关的…...

数据结构与算法基础-学习-10-线性表之顺序栈的清理、销毁、压栈、弹栈

一、函数实现顺序栈的其他函数实现&#xff0c;请看之前的博客链接《数据结构与算法基础-学习-09-线性表之栈的理解、初始化顺序栈、判断顺序栈空、获取顺序栈长度的实现》。1、ClearSqStack&#xff08;1&#xff09;用途清理栈的空间。只需要栈顶指针和栈底指针相等&#xff…...

Hazel游戏引擎(005)

本人菜鸟&#xff0c;文中若有代码、术语等错误&#xff0c;欢迎指正 我写的项目地址&#xff1a;https://github.com/liujianjie/GameEngineLightWeight&#xff08;中文的注释适合中国人的你&#xff09; 文章目录前言关键操作代码文件关键代码代码流程代码文件关键代码exter…...

牛客网Python篇数据分析习题(四)

1.现有一个Nowcoder.csv文件&#xff0c;它记录了牛客网的部分用户数据&#xff0c;包含如下字段&#xff08;字段与字段之间以逗号间隔&#xff09;&#xff1a; Nowcoder_ID&#xff1a;用户ID Level&#xff1a;等级 Achievement_value&#xff1a;成就值 Num_of_exercise&a…...

盲盒如何创业?

所谓的“盲盒”&#xff0c;受众群体大部分是那些爱碰运气的人&#xff0c;顾客买的是那种在打开盲盒时一刹那的惊喜感和神秘感&#xff0c;在打开盲盒之前&#xff0c;谁也不知道自己会得到什么&#xff0c;这也是为什么消费者更愿意购买的原因。网上的盲盒&#xff0c;主要是…...

第1集丨Java中面向对象相关概念汇总

目录一、基本概念1.1 类1.2 属性1.3 方法1.4 静态1.5 包1.6 import二、高级概念2.1 构造方法2.2 继承2.3 super & this2.4 多态2.5 方法重载2.6 方法重写2.7 访问权限2.8 内部类2.9 final2.10 抽象2.11 接口2.12 匿名类面向对象的编程思想力图使计算机语言中对事物的描述与…...

高性能(二)

三、读写分离和分库分表 1.读写分离 1.1 概述 将数据库的读写操作分散到不同的数据库节点上 通常一主多从一台主数据库负责写&#xff0c;多台从数据库负责读。 主库和从库之间会进行数据同步&#xff0c;以保证从库中数据的准确性。 1.2 问题及解决 1.2.1 问题 主从同…...

Allegro如何实现同一个屏幕界面分屏显示操作指导

Allegro如何实现同一个屏幕界面分屏显示操作指导 在做PCB设计的时候,会需要分屏显示,比如一边是放大的视图,另外一边是缩小的视图,Allegro支持同一个屏幕界面下进行分屏显示,如下图 而且会实时同步起来 如何分屏,具体操作如下 点击View...

前后端一些下载与配置(第二篇 第10天过后)nuxt banner redis 短信服务

NUXT 应该是不用怎么装&#xff1f; 有现成的 axios 还需要在npm吗 好像已经有现成的了 banner banner 笔记汇总P396 Redis Linux安装redis tar -xzvf redis-6.2.6.tar.gz cd redis-6.2.6 照着他做 然后 cd /usr/local/redis/bin ./redis-server /usr/local/redis…...

OSG三维渲染引擎编程学习之四十八:“第五章:OSG场景渲染” 之 “5.6 多重纹理映射”

目录 第五章 OSG场景渲染 5.6 多重纹理映射 5.6.1 多重纹理映射介绍 5.6.2 多重纹理映射示例...

对Node.js 的理解?优缺点?应用场景?

一、是什么 Node.js 是一个开源与跨平台的 JavaScript 运行时环境 在浏览器外运行 V8 JavaScript 引擎&#xff08;Google Chrome 的内核&#xff09;&#xff0c;利用事件驱动、非阻塞和异步输入输出模型等技术提高性能 可以理解为 Node.js 就是一个服务器端的、非阻塞式I/…...

Bean的生命周期

所谓的生命周期指的是一个对象从诞生到销毁的整个生命过程&#xff0c;我们把这个过程就叫做一个对象的生命周期~~ Bean的生命周期分为以下五大部分&#xff1a; 实例化&#xff08;为 Bean 分配内存空间&#xff09; 设置属性&#xff08;Bean对象注入/装配&#xff09; 初…...

Python学习-----函数2.0(函数对象,名称空间,作用域-->全局变量与局部变量)

目录 前言&#xff1a; 1.函数对象 &#xff08;1&#xff09;函数对象的引用 &#xff08;2&#xff09;函数可以放到序列里面 &#xff08;3&#xff09;函数可以作为参数 &#xff0c; 传递给另一个函数 2.名称空间 3.作用域 &#xff08;1&#xff09;作用域的理解 …...

Java中Json字符串和Java对象的互转

JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式。诞生于 2002 年。易于人阅读和编写。同时也易于机器解析和生成。JSON 是目前主流的前后端数据传输方式。 JSON 采用完全独立于语言的文本格式&#xff0c;但是也使用了类似于 C 语言家族的…...

代码随想录NO42 | 动态规划_Leetcode70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数

动态规划_Leetcode70. 爬楼梯 &#xff08;进阶&#xff09; 322. 零钱兑换 279.完全平方数70. 爬楼梯 &#xff08;进阶&#xff09; 在原题基础上&#xff0c;改为&#xff1a;一步一个台阶&#xff0c;两个台阶&#xff0c;三个台阶&#xff0c;…&#xff0c;直到 m个台阶…...

【C++从入门到放弃】初识C++(基础知识入门详解)

&#x1f9d1;‍&#x1f4bb;作者&#xff1a; 情话0.0 &#x1f4dd;专栏&#xff1a;《C从入门到放弃》 &#x1f466;个人简介&#xff1a;一名双非编程菜鸟&#xff0c;在这里分享自己的编程学习笔记&#xff0c;欢迎大家的指正与点赞&#xff0c;谢谢&#xff01; C基础…...

企业工程项目管理系统源码+spring cloud 系统管理+java 系统设置+二次开发

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…...

【GPLT 三阶题目集】L3-016 二叉搜索树的结构

二叉搜索树或者是一棵空树&#xff0c;或者是具有下列性质的二叉树&#xff1a; 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值&#xff1b;若它的右子树不空&#xff0c;则右子树上所有结点的值均大于它的根结点的值&#xff1b;它的左、右子树也分…...

核心交换机安全多业务高性能万兆交换机

RG-S5750-24SFP/12GT交换机是锐捷网络推出的融合了高性能、高安全、多业务的新一代三层交换机。RG-S5750-24SFP/12GT 交换机能够提供灵活的介质接口&#xff0c;满足网络建设中不同介质的连接需要。全千兆的端口形态&#xff0c;加上可扩展的高密度万兆端口&#xff0c;提供1&a…...

Android APK 签名打包原理分析(三)【静默安装的实现方案】

背景 小编目前从事的系统定制类工作,有客户提出了,需要后台“静默安装”他们的app,也就是悄无声息的安装,而且特别强调,不可以跳出任何安装引导页面,他们的app下载完成之后,后台调用公开的android install代码,系统就后台完成安装,安装完成之后,重新打开应用就可以。…...

mulesoft MCIA 破釜沉舟备考 2023.02.14.05

mulesoft MCIA 破釜沉舟备考 2023.02.14.05 1. Refer to the exhibit.2. A Kubernetes controller automatically adds another pod replica to the resource pool in response to increased application load.3. An XA transaction Is being configured that involves a JMS c…...

结构体的三种定义方法、结构体类型名(可选标志符)什么时候可以省略

结构体的三种定义方法 一、单独定义&#xff1a; 先定义结构体类型&#xff0c;再定义变量   定义结构体的格式如下&#xff1a;    struct 结构体名 {    若干数据项&#xff1b;    } &#xff1b;   其中&#xff0c;struct为关键字&#xff1b; 结构体名是用户定…...

cgo静态编译不能用glibc,用musl

Golang 的一个动态链接依赖问题 upx 是一个压缩二进制的工具&#xff0c;如上图&#xff0c;经过压缩之后&#xff0c;这些 binary 的体积都减少了 46%。 静态链接 CGO 的依赖 如果使用 glibc 的是&#xff0c;是不能静态链接的&#xff1a; rootf88271a666f9:/workspace# g…...

​力扣解法汇总1124. 表现良好的最长时间段

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 给你一份工作时间表 hours&#xff0c;上面记录着某一位员工每天的工作小时数。…...

街道办的网站由谁做的/重庆网站到首页排名

交换机口令设置:switch>enable ;进入特权模式switch#config terminal ;进入全局配置模式switch(config)#hostname ;设置交换机主机名switch(config)#enable secret xxx ;设置特权加密口令为xxxswitch(config)#enable password xxx ;设置特权非密口令为xxxswitch(config)#lin…...

武汉市品牌网站建设/关键词分布中对seo有危害的

volatile关键字&#xff1a; 保证线程间的可见性禁止指令的重排序不能保证原子性&#xff0c;所以不是线程安全的 线程间可见性 import java.util.concurrent.TimeUnit;public class test extends Thread {volatile int x 0;//此处可以将volatile去除 或者 替换为 static&a…...

如何做网站背景/网站seo优化外包顾问

本文首发于深入浅出区块链社区原文链接:IPFS 使用入门 前段时间一个以太坊游戏应用&#xff1a;Fomo3D异常火爆&#xff0c;在短短的几天内就吸引了几万的以太币投入游戏&#xff0c;第一轮游戏一个“***”用了一个非常巧妙的利用以太坊规则成为了最终赢家&#xff0c;拿走了1万…...

什么样的公司愿意做网站/爱战网关键词查询网站

以 点击打开链接 这个贴子为例&#xff1a; USE tempdb GO --1. 按行分割表值函数 IF OBJECT_ID(dbo.Fun_SplitByLine) IS NOT NULL DROP FUNCTION dbo.Fun_SplitByLine GO -- -- Author: yenange -- Create date: 2017-04-26 -- Description: 按行分割表值函…...

深圳求做网站/品牌运营

1. 使用原生input的标签,type为file <template><form><inputrefupload_sheetplaceholder"请输入内容"type"file"accept"*"id"sheet_form"click"resetValue"change"temUpload($event)"/></f…...

减少网站跳出率/站长统计官网

一、为什么要挂载windows分区 随着linux越来越普及&#xff0c;很多linux FANS正在或者已经从windows系统过度到linux系统上了。在这个过度时期&#xff0c;大部分FANS在自己的机器上都是至少装了两套系统——windows和linux。这样&#xff0c;问题就出现了&#xff0c;当FANS们…...