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

ESP32之OTA固件升级流程,基于VSCode环境下的ESP-IDF开发,基于阿里云物联网平台MQTT-TLS连接通信(附源码)

目录

1.创建产品和设备

2.准备工作

2.1 获取基础工程

2.2 基本知识概述

2.2.1 OTA升级流程

2.2.2 主题和数据格式

(1)设备上报版本号

①请求主题(设备 -> 阿里云):

②响应主题(阿里云->设备):

(2)阿里云推送升级包信息

①请求主题(阿里云 -> 设备):

② 响应主题(设备 -> 阿里云):

(3)设备上报升级进度

①请求主题(设备 -> 阿里云):

②响应主题(阿里云->设备):

3.编写、修改代码

3.1 重新配置分区

(1)配置分区文件

​(2)配置menuconfig文件

3.2 编写OTA cJSCON代码

3.2.1 生成主题

3.2.2 设备上报版本号

(1)调用设备上报版本号函数

(2)编写设备上报版本号函数

①增加上报版本号的固定cJSON对象

②向参数中添加版本号对象

(3)编写获取当前版本号函数

(4)设置版本号

3.2.4 获取升级包信息

(1)订阅主题

(2)解析收到的cJSON格式数据

3.2.3 设备上报升级进度

(1)调用设备上报升级进度函数

(2)编写设备上报升级进度函数

①增加上报版本号的固定cJSON对象

②向参数中添加版本号对象

3.3 编写OTA 任务代码

3.3.1 新建文件文组

3.3.2 编写OTA任务

(1)创建OTA任务

(2)编写OTA任务函数

3.3.3 完整代码

4.验证功能

(1)生成升级文件

(2)烧录初始代码

(3)升级文件上传到阿里云

(4)验证升级包

(5)查看升级结果

5.注意事项

6.参考文档

7.源码下载


1.创建产品和设备

参考ESP32接入阿里云物联网平台(MQTT-TLS连接通信),基于VSCode环境下的ESP-IDF开发(附源码)-CSDN博客

2.准备工作

2.1 获取基础工程

从https://download.csdn.net/download/Freddy_Ssc/90628093?spm=1001.2014.3001.5503下载基础工程。

2.2 基本知识概述

2.2.1 OTA升级流程

(1)设备上报版本号

(2)阿里云推送升级包信息(或设备主动拉取升级包信息,二选一,本实验选择前者)

推送的消息中包含了固件的下载地址"url",获取到下载地址后,调用esp_https_ota函数启动升级,函数使用HTTPS协议下载升级包,自动完成升级。

(3)设备上报升级进度(此处只有成功或失败)

(4)升级完成后重启设备,设备上报版本号(同步骤(1))

2.2.2 主题和数据格式

(1)设备上报版本号
①请求主题(设备 -> 阿里云):

/ota/device/inform/${YourProductKey}/${YourDeviceName}

数据格式示例:

{"id": "123", //每个消息ID在当前设备中具有唯一性"params": {"version": "1.0.1", //OTA模块版本"module": "MCU" //OTA模块名,该参数如果不填,表示默认版本号default}
}
②响应主题(阿里云->设备):

/sys/{productKey}/{deviceName}/thing/ota/firmware/get_reply

(2)阿里云推送升级包信息
①请求主题(阿里云 -> 设备):

/ota/device/upgrade/${YourProductKey}/${YourDeviceName} 

  数据格式示例(通过HTTPS协议单文件下载):

{"id": "123","code": 200,"data": {"size": 93796291,"sign": "f8d85b250d4d787a9f483d89a974***","version": "10.0.1.9.20171112.1432","isDiff": 1,"url": "https://the_firmware_url","signMethod": "MD5","md5": "f8d85b250d4d787a9f48***","module": "MCU","extData":{"key1":"value1","key2":"value2","_package_udi":"{\"ota_notice\":\"升级底层摄像头驱动,解决视频图像模糊的问题。\"}"}}
}
② 响应主题(设备 -> 阿里云):

无。

(3)设备上报升级进度
①请求主题(设备 -> 阿里云):

/ota/device/progress/${YourProductKey}/${YourDeviceName}

数据格式:

  • 升级成功示例:
{"id": "123","params": {"step": "0","desc": "OTA升级成功!","module": "MCU"}
}
  • 升级失败示例:
{"id": "123","params": {"step": "-1","desc": "OTA升级失败,请求不到升级包信息。","module": "MCU"}
}
②响应主题(阿里云->设备):

无。

3.编写、修改代码

3.1 重新配置分区

(1)配置分区文件

从\Espressif\frameworks\esp-idf-v5.3.2\components\partition_table路径中复制一个partitions_two_ota.csv文件到工程路径,并将factory、ota_0、ota_1三者的size改成合适大小,如下所示:

# Name,     Type,   SubType, Offset,    Size,       Flags
# Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap
nvs,        data,   nvs,        ,       0x4000,
otadata,    data,   ota,        ,       0x2000,
phy_init,   data,   phy,        ,       0x1000,
factory,    app,    factory,    ,       1200K,
ota_0,      app,    ota_0,      ,       1200K,
ota_1,      app,    ota_1,      ,       1200K,

(2)配置menuconfig文件

方式1:通过ESP-IDF配置

①执行命令idf.py menuconfig -> Serial flasher config  -> Flash size  -> 选择 (X) 16MB -> 按s保存;(根据实际情况选择flash大小)

②执行命令idf.py menuconfig -> Partition Table -> Partition Table  -> Custom partition table CSV -> ../ -> (partitions.csv) Custom partition CSV file -> 将名称改为 partitions_two_ota.csv -> 按s保存

方式2:通过VSCode配置

3.2 编写OTA cJSCON代码

3.2.1 生成主题

以宏定义方式生成三个OTA相关的主题:

//OTA Topic
#define ALIOT_OTA_TOPIC_UPLOAD_VERSION      "/ota/device/inform/"ALIOT_PRODUCTKEY"/"ALIOT_DEVICENAME    //上报版本号
#define ALIOT_OTA_TOPIC_GET_PACKAGE         "/ota/device/upgrade/"ALIOT_PRODUCTKEY"/"ALIOT_DEVICENAME   //下发升级包信息
#define ALIOT_OTA_TOPIC_UPLOAD_PROGRESS     "/ota/device/progress/"ALIOT_PRODUCTKEY"/"ALIOT_DEVICENAME  //上报升级进度

3.2.2 设备上报版本号

(1)调用设备上报版本号函数

(2)编写设备上报版本号函数
void aliot_post_ota_version(const char *version)
{//创建物模型描述结构体ALIOT_DM_DES *dm = aliot_malloc_des(ALIOT_OTA_VERSION);//设置物模型结构体里面的属性值aliot_set_ota_version(dm, version);//将生成cJSON的对象转换为字符串aliot_dm_serialize(dm);//发布属性消息ESP_LOGI(TAG, "publish payload:%s", dm->dm_js_str);esp_mqtt_client_publish(mqtt_handle, ALIOT_OTA_TOPIC_UPLOAD_VERSION, dm->dm_js_str, strlen(dm->dm_js_str), 1, 0);//释放物模型描述结构体aliot_dm_free(dm);
}
①增加上报版本号的固定cJSON对象

②向参数中添加版本号对象
//设置OTA版本号
void aliot_set_ota_version(ALIOT_DM_DES *dm, const char *version)
{if (dm){cJSON* params_js = cJSON_GetObjectItem(dm->dm_js, "params");//获取对象paramsif (params_js){cJSON_AddStringToObject(params_js, "version", version);//向params对象中添加属性值}}
}
(3)编写获取当前版本号函数
//获取当前应用版本号
const char* get_app_version(void)
{static char app_version[32] = {0};if (app_version[0] == 0){//获取当前分区的基本信息const esp_partition_t* running = esp_ota_get_running_partition();//获取更多的分区信息esp_app_desc_t running_desc;esp_ota_get_partition_description(running, &running_desc);snprintf(app_version, sizeof(app_version), "%s", running_desc.version);}return app_version;
}
(4)设置版本号

在工程根目录的cMakeList.txt中加入set(PROJECT_VER "1.0.1") 设置当前版本号:

3.2.4 获取升级包信息

(1)订阅主题

在MQTT事件回调函数中当设备连接MQTT服务器后,订阅阿里云推送跟新文件信息的主题:

(2)解析收到的cJSON格式数据

在MQTT事件回调函数中当收到MQTT数据事件后,解析cJSON格式数据,如果是阿里云推送的升级包信息,则获取信息中升级包的https下载地址,同时注册升级进度上报函数,并启动OTA升级任务:

3.2.3 设备上报升级进度

(1)调用设备上报升级进度函数

上述3.2.2的步骤(2)中注册了上报升级进度的函数,具体调用时间后面再讲。

(2)编写设备上报升级进度函数
void aliot_post_ota_progress(int code)
{//创建物模型描述结构体ALIOT_DM_DES *dm = aliot_malloc_des(ALIOT_OTA_PROGRESS);//设置物模型结构体里面的属性值aliot_set_ota_progress(dm, code);//将生成cJSON的对象转换为字符串aliot_dm_serialize(dm);//发布消息上报进度ESP_LOGI(TAG, "publish payload:%s", dm->dm_js_str);esp_mqtt_client_publish(mqtt_handle, ALIOT_OTA_TOPIC_UPLOAD_PROGRESS, dm->dm_js_str, strlen(dm->dm_js_str), 1, 0);//释放物模型描述结构体aliot_dm_free(dm);
}
①增加上报版本号的固定cJSON对象

②向参数中添加版本号对象
//设置OTA进度 注意:升级进度只能是0(成功)或-1(失败)
void aliot_set_ota_progress(ALIOT_DM_DES *dm, int progress)
{if (dm){cJSON* params_js = cJSON_GetObjectItem(dm->dm_js, "params");//获取对象paramsif (params_js){char str_progress[10] = {0};snprintf(str_progress, sizeof(str_progress), "%d", progress);cJSON_AddStringToObject(params_js, "step", str_progress);//向params对象中添加属性值if (progress == 0)cJSON_AddStringToObject(params_js, "desc", "OTA升级成功!");else// if(code == -1)cJSON_AddStringToObject(params_js, "desc", "OTA升级失败!请求不到升级信息包。");}}
}

3.3 编写OTA 任务代码

3.3.1 新建文件文组

在工程目录下创建一个components文件夹,再在此文件夹下创建一个ota文件夹,然后创建aliot_ota.c、aliot_ota.h、cMakeList.txt文件,并在cMakeList.txt中添加以下代码,将组件注册到工程中:

#把组件注册到工程中
idf_component_register(SRCS "aliot_ota.c"          #源文件INCLUDE_DIRS     "."         #路径REQUIRES    esp_https_ota   esp_partition   mbedtls   #需要用到的其他组件
)

3.3.2 编写OTA任务

(1)创建OTA任务
esp_err_t aliot_ota_start(void)
{if (is_current_ota) //防止重复启动OTAreturn ESP_FAIL;is_current_ota = true;//创建任务xTaskCreatePinnedToCore(aliot_ota_task, "aliot_ota", 8192, NULL, 4, NULL, 1);return ESP_OK;
}
(2)编写OTA任务函数

核心函数是:esp_err_t esp_https_ota(const esp_https_ota_config_t *ota_config)

调用此函数后,此函数会确认https的连接,从地址里读取镜像数据,完成OTA固件升级。因此需先完成参数ota_config的配置,再调用即可。

3.3.3 完整代码

aliot_ota.h完整代码:

#ifndef _ALIOT_OTA_H_
#define _ALIOT_OTA_H_
#include "esp_err.h"//ota完成回调函数
typedef void (*aliot_ota_finish_callback_t)(int code);//设置阿里云OTA的https下载地址
esp_err_t aliot_ota_config(const char* url, aliot_ota_finish_callback_t f);//启动阿里云OTA
esp_err_t aliot_ota_start(void);#endif //_ALIOT_OTA_H_

aliot_ota.c完整代码:

#include "aliot_ota.h"
#include "esp_log.h"
#include "esp_https_ota.h"
#include <stdio.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_http_client.h"//客户端向服务器请求升级包用
#include "esp_crt_bundle.h"//证书包头文件#define TAG     "ALIOT_OTA"//下载地址
static char aliot_url[256];//回调函数
static aliot_ota_finish_callback_t s_ota_finish_f = NULL;//当前是否处于OTA过程
static bool is_current_ota = false;//任务
void aliot_ota_task(void* param)
{esp_err_t ota_finish_err = ESP_OK;ESP_LOGI(TAG, "ALIOT ota start......");//初始化http客户端esp_http_client_config_t http_config = {.url = aliot_url,.timeout_ms = 10*1000,.crt_bundle_attach = esp_crt_bundle_attach,//签名证书,由于使用阿里云物联网自签名证书在此有问题,因此使用ESP内置的根证书.keep_alive_enable = true,//是否保持连接};//OTA配置初始化esp_https_ota_config_t ota_config = {.http_config = &http_config,};//此函数会确认https的连接,从地址里读取镜像数据,完成OTA固件升级ota_finish_err = esp_https_ota(&ota_config);if (ota_finish_err == ESP_OK){if (s_ota_finish_f)s_ota_finish_f(0); //上报升级进度,升级成功!vTaskDelay(pdMS_TO_TICKS(1500));ESP_LOGI(TAG, "OTA success! Restart......");esp_restart();//重启}else{if (s_ota_finish_f)s_ota_finish_f(-1); //上报升级进度,升级失败!ESP_LOGI(TAG, "OTA fail!");}is_current_ota = false;vTaskDelete(NULL);
}//设置阿里云OTA的https下载地址
esp_err_t aliot_ota_config(const char* url, aliot_ota_finish_callback_t f)
{snprintf(aliot_url, sizeof(aliot_url), "%s", url);s_ota_finish_f = f;return ESP_OK;
}//启动阿里云OTA
esp_err_t aliot_ota_start(void)
{if (is_current_ota) //防止重复启动OTAreturn ESP_FAIL;is_current_ota = true;//创建任务xTaskCreatePinnedToCore(aliot_ota_task, "aliot_ota", 8192, NULL, 4, NULL, 1);return ESP_OK;
}

4.验证功能

(1)生成升级文件

将版本号设置为1.0.1,编译生成bin文件,并将其改名为esp32s3_v1.0.1.bin。

(2)烧录初始代码

将版本号设置为1.0.0,编译并烧录到设备中,打开串口监视工具,等待升级。

(3)升级文件上传到阿里云

(4)验证升级包

(5)查看升级结果

阿里云平台显示升级失败:

查看日志却表明升级成功了:

ESP32S3显示升级成功,但也提示了一些错误信息,大概是连接中断的意思,应该不是大问题:

版本号也是对的,说明确实是升级成功了:

至于为啥阿里云显示升级失败我也不清楚,可能就是升级复位后MQTT断开连接了,我之前用ESP32测试过的,但现在烧录之前那份代码也不行了,有大佬知道怎么解决吗?

5.注意事项

  • 在OTA升级结束后加防止回滚函数:esp_ota_mark_app_valid_cancel_rollback();

6.参考文档

使用TLS加密设备和物联网平台的MQTT通信_物联网平台(IoT)-阿里云帮助中心

MQTT协议接入的物联网设备OTA升级流程_物联网平台(IoT)-阿里云帮助中心

【【2024最新版 ESP32教程(基于ESP-IDF)】ESP32入门级开发课程 更新中 中文字幕】

7.源码下载

https://download.csdn.net/download/Freddy_Ssc/90633389

相关文章:

ESP32之OTA固件升级流程,基于VSCode环境下的ESP-IDF开发,基于阿里云物联网平台MQTT-TLS连接通信(附源码)

目录 1.创建产品和设备 2.准备工作 2.1 获取基础工程 2.2 基本知识概述 2.2.1 OTA升级流程 2.2.2 主题和数据格式 &#xff08;1&#xff09;设备上报版本号 ①请求主题&#xff08;设备 -> 阿里云&#xff09;&#xff1a; ②响应主题&#xff08;阿里云->设备…...

【秣厉科技】LabVIEW工具包——OpenCV 教程(20):拾遗 - imgproc 基础操作(下)

文章目录 前言imgproc 基础操作&#xff08;下&#xff09;8. 霍夫检测9. 滤波与模糊10. 拟合与包围 总结 前言 需要下载安装OpenCV工具包的朋友&#xff0c;请前往 此处 &#xff1b;系统要求&#xff1a;Windows系统&#xff0c;LabVIEW>2018&#xff0c;兼容32位和64位。…...

kafka发送消息,同时支持消息压缩和不压缩

1、生产者配置 nacos中增加配置&#xff0c;和公共spring-kafka配置字段有区分 需要发送压缩消息时&#xff0c;使用该配置类发送即可 import org.apache.kafka.clients.producer.ProducerConfig; import org.springframework.beans.factory.annotation.Autowired; import or…...

AOSP世界时间的更新

在 AOSP&#xff08;Android Open Source Project&#xff09;中&#xff0c;世界时间的更新主要涉及设备时区数据的管理和更新&#xff0c;以确保设备能够正确显示全球各地的时间。AOSP 依赖 IANA 时区数据库&#xff08;也称为 tzdata&#xff09;来提供时区规则和世界时间数…...

Python + 链上数据可视化:让区块链数据“看得懂、用得上”

Python + 链上数据可视化:让区块链数据“看得懂、用得上” 区块链技术的透明性和去中心化特性,使得链上数据成为金融、供应链、NFT 以及 DeFi 领域的关键参考。可是,对于普通用户而言,链上数据往往晦涩难懂,难以直接利用。那么,如何利用 Python 提取、分析并直观展示链上…...

方德桌面操作系统V5.0-G23 vim无法复制粘贴内容

1.修改 Vim 配置文件 rootyuhua-virtualmachine:/etc/docker# sudo vim /usr/share/vim/vim82/defaults.vim 2.在第82行找到set mousea行&#xff0c;将其为set mouse-a。如果文件中没有set mousea&#xff0c;则修改添加set mouse-a。 3.保存文件并退出 Vim&#xff1a; 4…...

[linux] vim 乱码

1. 确保终端支持中文 设置终端编码为 UTF-8,运行: echo $LANG如果不是 UTF-8(如 en_US.UTF-8),你可以设置为: export LANG=zh_CN.UTF-8 export LC_ALL=zh_CN.UTF-8 2. 确保 Vim 使用 UTF-8 编码 打开 .vimrc 或输入以下命令: :set encoding=utf-8 :set fileencodin…...

天洑参加人工智能校企产学研及人才对接活动——走进南京大学人工智能学院

4月15日&#xff0c;人工智能校企产学研及人才对接——走进南京大学人工智能学院活动在南京大学成功举办。此次活动由江苏省人工智能学会、南京大学人工智能学院主办&#xff0c;江苏省工业和信息化厅党组成员、副厅长池宇&#xff0c;南京大学副校长周志华出席。江苏省工业和信…...

33、单元测试实战练习题

以下是三个练习题的具体实现方案&#xff0c;包含完整代码示例和详细说明&#xff1a; 练习题1&#xff1a;TDD实现博客评论功能 步骤1&#xff1a;编写失败测试 # tests/test_blog.py import unittest from blog import BlogPost, Comment, InvalidCommentErrorclass TestBl…...

《AI大模型应知应会100篇》第22篇:系统提示词(System Prompt)设计与优化

第22篇&#xff1a;系统提示词(System Prompt)设计与优化 摘要 在大语言模型&#xff08;LLM&#xff09;应用中&#xff0c;系统提示词&#xff08;System Prompt&#xff09;是控制模型行为的核心工具之一。它不仅定义了模型的身份、角色和行为规范&#xff0c;还直接影响输…...

【KWDB 创作者计划】_深度学习篇---松科AI加速棒

文章目录 前言一、简介二、安装与配置硬件连接驱动安装软件环境配置三、使用步骤初始化设备调用SDK接口检测设备状态:集成到AI项目四、注意事项兼容性散热固件更新安全移除五、硬件架构与技术规格核心芯片专用AI处理器内存配置接口类型物理接口虚拟接口能效比散热设计六、软件…...

【Quest开发】在虚拟世界设置具有遮挡关系的透视窗口

软件&#xff1a;Unity 2022.3.51f1c1、vscode、Meta XR All in One SDK V72 硬件&#xff1a;Meta Quest3 仅针对urp管线 参考了YY老师这篇&#xff0c;可以先看他的再看这个可能更好理解一些&#xff1a;Unity Meta Quest MR 开发&#xff08;七&#xff09;&#xff1a;使…...

Spark on K8s 在vivo大数据平台的混部实战

作者&#xff1a;vivo 互联网大数据团队- Qin Yehai 在离线混部可以提高整体的资源利用率&#xff0c;不过离线Spark任务部署到混部容器集群需要做一定的改造&#xff0c;本文将从在离线混部中的离线任务的角度&#xff0c;讲述离线任务是如何进行容器化、平台上的离线任务如何…...

Mac配置Java的环境变量

刚拿到手的Mac mini M4如何去设置java的环境变量&#xff1f; 第一步&#xff1a; 首先&#xff0c;你先下载好intelliJ IDEA&#xff0c;然后在里面自带的jdk列表里选择你自己想要使用的jdk的版本以及供应商。 下面是我自己使用的jdk版本以及供应商&#xff1a; 第二步&am…...

RPCRT4!OSF_CCONNECTION::OSF_CCONNECTION函数分析之创建一个RPCRT4!OSF_CCALL--RPC源代码分析

RPCRT4!OSF_CCONNECTION::OSF_CCONNECTION函数分析之创建一个RPCRT4!OSF_CCALL 第一部分&#xff1a; 1: kd> p RPCRT4!OSF_CCONNECTION::OSF_CCONNECTION0x167: 001b:77bf6957 393dec35c877 cmp dword ptr [RPCRT4!gfRPCVerifierEnabled (77c835ec)],edi 1: kd> …...

6、事件处理法典:魔杖交互艺术——React 19 交互实现

一、魔杖启灵&#xff1a;交互魔法的本质 "记住&#xff0c;巫师们&#xff01;魔杖的每一次挥动都是与魔法世界的对话&#xff0c;"麦格教授的魔杖在空中划出金色事件流&#xff0c;"React 19的useTransition如同时间转换器&#xff0c;让麻瓜设备也能感知魔杖…...

.net C# 使用Epplus库将Datatable导出到Excel合并首列

最近处理大量数据,需单独导出到首列名称一致的excel,Epplus免费,效率spire高,在Nuget添加Epplus。因为特殊原因,不能使用数据库,只能由数据源导出到excel;最终处理39万行输出到单独的excel文件时间2分钟。 一、EPPlus 基础介绍 ​EPPlus​ 是一个开源的 .NET 库(适用…...

【gpt生成-总览】怎样才算开发了一门编程语言,需要通过什么测试

开发一门真正的编程语言需要经历完整的设计、实现和验证过程&#xff0c;并通过系统的测试体系验证其完备性。以下是分阶段开发标准及测试方法&#xff1a; 一、语言开发核心阶段 1. 语言规范设计&#xff08;ISO/IEC 标准级别&#xff09; ​​语法规范​​&#xff1a;BNF/…...

网络417 路由转发2 防火墙

路由器临时开启路由转发功能 查看节点a网关ip 节点b网关 1.开启路由器路由转发功能。 2.配置到节点a 节点b的网络。 节点a因为和节点b不在同一网段&#xff0c;计划通过网关直达 网关就是中间节点路由器的ip地址 再Ping另一个 计划节点bping节点c ping不通 是因为 修改了…...

HttpSessionAttributeListener 的用法笔记250417

HttpSessionAttributeListener 的用法笔记250417 以下是关于 HttpSessionAttributeListener 的用法详解&#xff0c;涵盖核心方法、应用场景、实现步骤及关键注意事项&#xff0c;帮助您有效监听会话&#xff08;HttpSession&#xff09;中属性的动态变化&#xff1a; 1. 核心功…...

Spring Boot 实现 Excel 导出功能(支持前端下载 + 文件流)

&#x1f9e0; 一、为什么用 EasyExcel&#xff1f; 在 Java 开发中&#xff0c;操作 Excel 的框架主要有&#xff1a; Apache POI&#xff08;经典但慢、内存占用大&#xff09; JXL&#xff08;老旧不维护&#xff09; Alibaba EasyExcel&#xff08;阿里出品&#xff0c;…...

Java动态批量生成logback日志文件

应用场景举个例子&#xff1a; 当我一个服务需要启动n个端口&#xff0c;来监听n个来源的数据&#xff0c;并且处理数据逻辑一致&#xff1b;但是我想要它们的日志分开文件夹来打印&#xff0c;从而更好的分析问题&#xff0c;那么就可以用我下面提供的模版了&#xff1b; 动态…...

从原理到实践:NFS复杂故障处理方法论

#作者&#xff1a;孙德新 文章目录 一、nfs使用概述二、疑难故障现象描述三、原理分析四、解决方案五、优化服务器资源配置&#xff1a;六、故障案例总结七、故障预防建议八、nfs优化方法 一、nfs使用概述 NFS&#xff08;Network File System&#xff09;是一种分布式文件系…...

SAP FI固定资产报错:在折旧范围 30 中的业务与帐面净值规则冲突 - 解决方法

一、问题描述 消息号 AA660 诊断 由于和在区域30中检查的净帐面价值规则相反&#xff0c;不能过帐该凭证。 过程 当输入比例值时会出现此错误。比例值超过过帐金额&#xff0c;如 100 的后续资本化&#xff0c;但该金额的比例折旧为 110。请检查输入项并做需要的更正。 二、…...

Go语言从零构建SQL数据库(8):执行计划的奥秘

从SQL语句到高效查询&#xff1a;执行计划的奥秘 想象你是一位旅行者&#xff0c;想从北京到上海。你告诉导航软件你的目的地&#xff08;类似SQL查询&#xff09;&#xff0c;但导航软件需要为你规划具体路线——是走高速公路还是国道&#xff1f;是选择最短距离还是最省时间…...

UNet 改进(12):UNet with ECA (Efficient Channel Attention) 网络

详解 下面将详细解析这个实现了ECA注意力机制的UNet网络代码。 1. 代码概述 代码实现了一个带有Efficient Channel Attention (ECA)模块的UNet网络架构。 UNet是一种常用于图像分割任务的编码器-解码器结构网络,而ECA模块则是一种轻量级的通道注意力机制,可以增强网络对重…...

关于 AI驱动的智慧家居、智慧城市、智慧交通、智慧医疗和智慧生活 的详细解析,涵盖其定义、核心技术、应用场景、典型案例及未来趋势

以下是关于 AI驱动的智慧家居、智慧城市、智慧交通、智慧医疗和智慧生活 的详细解析&#xff0c;涵盖其定义、核心技术、应用场景、典型案例及未来趋势&#xff1a; 一、AI智慧家居 1. 定义与核心功能 定义&#xff1a;通过AI与物联网&#xff08;IoT&#xff09;技术&#…...

Windows11-24h2的任务栏时间显示秒 笔记250417

Windows11-24h2的任务栏时间显示秒 笔记250417 打开注册表编辑器 WinR输入 regedit 回车。 修改注册表项 定位到路径&#xff1a; HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced右键右侧空白处 → 新建【DWORD (32位)值】→ 命名为 ShowSec…...

机器学习的简单应用

什么是机器学习&#xff1f; 定义&#xff1a; ‌机器学习&#xff08;Machine Learning, ML&#xff09;‌ 是人工智能&#xff08;AI&#xff09;的一个子领域&#xff0c;其核心是 ‌通过算法让计算机从数据中自动学习规律&#xff0c;并基于这些规律对新数据做出预测或决策…...

双 Token 与 单 Token 优缺点

双Token与单Token认证机制对比 在Web应用开发中&#xff0c;身份认证和授权是保障系统安全的核心环节。随着技术演进&#xff0c;基于Token的认证机制逐渐取代传统Session方案&#xff0c;而双Token与单Token架构的选型争议也日益成为开发者关注的焦点。本文将从技术原理、优缺…...

第五章 SQLite数据库:6、SQLite 常用语法1

SQLite Insert 语句 SQLite 的 INSERT INTO 语句用于向数据库的某个表中添加新的数据行。 语法 INSERT INTO 语句有两种基本语法&#xff0c;如下所示&#xff1a; INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)] VALUES (value1, value2, value3,...…...

JVM考古现场(二十二):降维打击·用二向箔优化内存模型

"警报&#xff01;三维堆内存正在经历二维化坍缩&#xff01;" 我腰间的玄铁令突然震动&#xff0c;在蜀山剑派的量子剑阵中投射出诡异的曼德博分形——这是三体文明发动降维打击的铁证&#xff01; 楔子&#xff1a;二向箔奇点降临 昆仑镜监控日志&#xff1a; // …...

eclipse常用快捷键

Eclipse 是一款功能强大的 Java 集成开发环境&#xff08;IDE&#xff09;&#xff0c;熟练掌握其快捷键可以显著提高开发效率。下面是一些常用的 Eclipse 快捷键分类介绍&#xff1a; 编辑相关快捷键 操作快捷键说明内容辅助Alt /调出代码提示和自动补全功能&#xff0c;根…...

TAS(Thin-Agent服务)的先决条件与安装指南

TAS&#xff08;Thin-Agent服务&#xff09;的先决条件与安装指南 2.1 支持的操作系统 TAS支持以下操作系统环境&#xff1a; Windows 服务器 • Windows Server 2008 R2 SP1 • Windows Server 2012 R2 • Windows Server 2016 Linux 发行版 • Red Hat Enterprise Linux (RHE…...

无线uniapp调试设备

创作灵感来自某篇博客 uniapp安卓手机无线真机调试教程_uniapp无线真机调试-CSDN博客...

TAS启动与卸载

3. 启动TAS&#xff08;Thin-Agent服务&#xff09; TAS在安装完成后通常会自动启动&#xff0c;并在系统重启时自启。如需手动启动&#xff0c;请按以下步骤操作&#xff1a; &#xfffc; 3.1 在Windows上启动TAS 1. 打开 Windows服务管理器&#xff1a; ◦ 按下 Win R&…...

Oracle测试题目及笔记(多选)

所有题目来自于互联网搜索 在以下概要文件的陈述中&#xff0c;哪两个是正确的&#xff1f; &#xff08;D 和 E&#xff09; A&#xff0e; 概要文件不能被用来为账户加锁 B&#xff0e; 概要文件不能被用来控制资源使用 C&#xff0e; 数据库管理员可以使用概要文件更改用户密…...

定制化突围:遨游防爆手机的差异化竞争策略

在石油、化工、矿山等危险作业场景中&#xff0c;随着工业智能化与安全生产需求的升级&#xff0c;行业竞争逐渐从单一产品性能的比拼转向场景化解决方案的深度较量。遨游通讯以九重防爆标准为技术底座&#xff0c;融合多模稳控系统与全景前瞻架构&#xff0c;开辟出"千行…...

c#清理释放内存

虽然c#具有内存管理和垃圾回收机制&#xff0c;但是在arcobjects二次开发嵌入到arcgis data reviewet还会报内存错误。需要强制清理某变量内存方法如下: 1设置静态函数ReleaseCom函数 public static void ReleaseCom(object o) { try{System.Runtime.InteropServices.Marsh…...

从入门到精通【MySQL】 JDBC

文章目录 &#x1f4d5;1. 什么是JDBC&#x1f4d5;2. JDBC的使用原理&#x1f4d5;3. 使用JDBC具体步骤✏️3.1 标题获取MySQL驱动包并修改pom.xml文件✏️3.2 建立数据库连接✏️3.3 创建Statement✏️3.4 执行SQL语句✏️3.5 处理返回结果✏️3.6 释放资源和关闭连接 &#…...

Sigfox技术|独特的运营模式 + 超窄带技术 + 非授权频谱

在物联网&#xff08;IoT&#xff09;通信技术的快速发展中&#xff0c;低功耗广域网&#xff08;LPWAN&#xff09;成为了推动智能设备连接的重要基础技术之一。作为LPWAN中的一种专有通信协议&#xff0c;Sigfox以其低功耗和广覆盖的特点脱颖而出&#xff0c;在物联网应用中占…...

【Dify 前端源码解读系列】MDX 让 API 文档焕发生机

什么是 MDX? MDX 是一种强大的文档格式,它允许在 Markdown 内容中使用 JSX。这意味着你可以在 Markdown 的简洁语法中嵌入交互式组件,使文档不再局限于静态内容。MDX 完美地将 Markdown 的简单与 JSX 的灵活性结合在一起,特别适合需要丰富交互体验的文档场景。 MDX 的优势…...

docker能用来干什么的

最近项目像简快部署docker&#xff0c;但是发现源被隔离&#xff0c;暂时先记下&#xff0c;以后有机会再研究。 下面摘抄的网文网址如下&#xff1a;Docker能用来干什么的 ?_超级码客_海量程序员面试题库 | 笔试题库 | 面试求职考试神器 docker能用来干什么的 docker能用来做…...

dispaly: inline-flex 和 display: flex 的区别

display: inline-flex 和 display: flex 都是 CSS 中用于创建弹性盒子布局&#xff08;Flexbox&#xff09;的属性值&#xff0c;但它们之间有一些关键的区别&#xff0c;主要体现在元素如何在页面上被渲染和它们对周围元素的影响。 主要区别 1&#xff0c;块级 vs 行内块级 d…...

AI Agent系列(九) -Data Agent(数据分析智能体)

AI Agent系列【九】 前言一、Data Agent场景二、Data Agent核心因素2.1 数据源2.2 大模型2.3 应用及可视化 三、Data Agent应用场景 前言 Data Agent就是在大模型基础上构建一个数据分析的智能体&#xff0c;是一种基于人工智能技术&#xff0c;特别是大模型技术的数据分析智…...

【工具】视频翻译、配音、语音克隆于一体的一站式视频多语言转换工具~

Krillin AI 是全能型音视频本地化与增强解决工具。这款简约而强大的工具&#xff0c;集音视频翻译、配音、语音克隆于一身&#xff0c;支持横竖屏格式输出&#xff0c;确保在所有主流平台&#xff08;哔哩哔哩&#xff0c;小红书&#xff0c;抖音&#xff0c;视频号&#xff0c…...

api护照查验-GO国内护照查验接口-身份安全卫士

在全球化浪潮汹涌的当下&#xff0c;跨境电子商务蓬勃发展&#xff0c;国际旅游持续升温&#xff0c;留学热潮也未曾减退。在这些跨越国界的活动背后&#xff0c;护照作为国际旅行的关键凭证&#xff0c;其真伪核验的重要性愈发凸显。护照查验接口&#xff0c;宛如一颗璀璨的新…...

在 Tailwind CSS 中优雅地隐藏滚动条

在开发中&#xff0c;我们经常需要隐藏滚动条但保持滚动功能&#xff0c;这在构建现代化的用户界面时很常见。 本文将介绍两种在 Tailwind CSS 项目中实现这一目标的方法&#xff0c;方便同学们记录和查阅。 方法一&#xff1a;使用 tailwind-scrollbar-hide 插件 这是一种更…...

【C++】深入浅出之继承

目录 继承的概念及定义继承的定义继承方式和访问限定符protected与private的区别 默认继承方式继承类模板基类和派生类对象赋值兼容转换继承中的作⽤域(隐藏关系)相关面试题⭐ 派生类的默认成员函数⭐构造函数拷贝构造赋值重载析构函数 继承与友元继承与静态成员继承的方式菱形…...

Linux软件仓库

Linux常见软件包类型&#xff1a; dbdDebian家族及Ubuntu等基于Debian的Linux操作系统所使用的软件包管理格式rpmRed Hat Linux、Fedora、openSUSE、Mandriva和Mageia等使用的标准软件包管理格式源代码软件包一般为“.tar.gz”、“.tar.bz2”等格式的压缩包包含程序的原始代码…...