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

ESP32 I2S音频总线学习笔记(二):I2S读取INMP441音频数据

简介

在这个系列的上一篇文章中,我们介绍了ESP32 I2S音频总线的相关知识,简要了解了什么是I2S总线、它的通信格式,以及相关的底层API函数。没有看过上篇文章的可以点击文章进行回顾:

ESP32 I2S音频总线学习笔记(一):初识I2S通信与配置基础

这篇文章将介绍一个小案例——ESP32驱动INMP441读取音频数据,它是关于如何使用I2S读取数据的一个应用,主要是将ESP32读取到的音频数据发送到串口上并实时显示波形,这个我们可以通过串口绘图仪来实现。在这之前先来看一下INMP441这个模块吧

INMP441全向麦克风模块

在这里插入图片描述

NMP441是一款高性能、低功耗、数字输出,带底部端口的全向MEMS麦克风。该完整的INMP441解决方案由一个MEMS传感器、信号调节模块、数字混合滤波器、电源管理和行业标准的24位I²S接口组成。I²S接口允许INMP441直接连接到数字处理器,如DSP和微控制器,无需额外的音频解码器。NMP441具有高信噪比,是一种适用于近场应用的理想选择。

产品特性:

具有高精度24位数据的数字I²S接口
高信噪比为61 dBA
高灵敏度-26 dBFS
从60 Hz到15 kHz的稳定频率响应
低功耗:低电流消耗1.4 mA
高PSR:-75 dBFS

功能框图

INMP441模块使用到的芯片内置ADC,用于将采集到的模拟信号转换成数字信号,上面还有滤波器和硬件控制、电源相关的引脚。
在这里插入图片描述

引脚定义

VDD输入电源,1.8V至3.3V
GND电源地
SCKI²S接口的串行数据时钟
WS用于I²S接口的串行数据字选择
SDI²S接口的串行数据输出
L/R左/右声道选择

其中L/R是 左/右声道选择。设置为低电平时,麦克风在I²S帧的左声道输出信号。设置为高电平时,麦克风在右声道输出信号。

安装I2S驱动

上篇文章我们在介绍I2S底层API函数提到,在使用I2S通信时需要加载I2S驱动,不知道小伙伴们还记不记得。这个加载I2S驱动的函数就是:esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, int queue_size, void *i2s_queue),里面有4个参数需要配置,在上次都有提到每个参数的意义。 其中比较复杂的是i2s_config这个结构体变量,我们需要对结构体的每个参数进行配置,如下:

typedef struct {i2s_mode_t              mode;                       /*< 设置 I2S 的工作模式 */uint32_t                sample_rate;                /*!< 设置音频采样率 */i2s_bits_per_sample_t   bits_per_sample;            /*!< 设置采样位数 */i2s_channel_fmt_t       channel_format;             /*!< 设置数据通道格式.*/i2s_comm_format_t       communication_format;       /*!< 设置I2C数据传输格式 */int                     intr_alloc_flags;           /*!< 设置中断相关标志位*/int                     dma_buf_count;  dma缓存个数,            int                     dma_buf_len;                
} i2s_driver_config_t;typedef i2s_driver_config_t i2s_config_t;

除了后面几个整型变量,每个结构体成员其实是一个枚举类型

I2S工作模式mode

typedef enum {I2S_MODE_MASTER       = (0x1 << 0),       /*!< Master mode*/I2S_MODE_SLAVE        = (0x1 << 1),       /*!< Slave mode*/I2S_MODE_TX           = (0x1 << 2),       /*!< TX mode*/I2S_MODE_RX           = (0x1 << 3),       /*!< RX mode*/
#if SOC_I2S_SUPPORTS_DAC//built-in DAC functions are only supported on I2S0 for ESP32 chip.I2S_MODE_DAC_BUILT_IN = (0x1 << 4),       /*!< Output I2S data to built-in DAC, no matter the data format is 16bit or 32 bit, the DAC module will only take the 8bits from MSB*/
#endif // SOC_I2S_SUPPORTS_DAC
#if SOC_I2S_SUPPORTS_ADCI2S_MODE_ADC_BUILT_IN = (0x1 << 5),       /*!< Input I2S data from built-in ADC, each data can be 12-bit width at most*/
#endif // SOC_I2S_SUPPORTS_ADC// PDM functions are only supported on I2S0 (all chips).I2S_MODE_PDM          = (0x1 << 6),       /*!< I2S PDM mode*/
} i2s_mode_t;

音频采样率bits_per_sample

typedef enum {I2S_BITS_PER_SAMPLE_8BIT    = 8,            /*!< data bit-width: 8 */I2S_BITS_PER_SAMPLE_16BIT   = 16,           /*!< data bit-width: 16 */I2S_BITS_PER_SAMPLE_24BIT   = 24,           /*!< data bit-width: 24 */I2S_BITS_PER_SAMPLE_32BIT   = 32,           /*!< data bit-width: 32 */
} i2s_bits_per_sample_t;

通道格式channel_format

typedef enum {I2S_CHANNEL_FMT_RIGHT_LEFT,         /*!< Separated left and right channel */I2S_CHANNEL_FMT_ALL_RIGHT,          /*!< Load right channel data in both two channels */I2S_CHANNEL_FMT_ALL_LEFT,           /*!< Load left channel data in both two channels */I2S_CHANNEL_FMT_ONLY_RIGHT,         /*!< Only load data in right channel (mono mode) */I2S_CHANNEL_FMT_ONLY_LEFT,          /*!< Only load data in left channel (mono mode) */
#if SOC_I2S_SUPPORTS_TDM// Multiple channels are available with TDM featureI2S_CHANNEL_FMT_MULTIPLE,           /*!< More than two channels are used */
#endif
}  i2s_channel_fmt_t;

通信传输格式communication_format

typedef enum {I2S_COMM_FORMAT_STAND_I2S        = 0X01, /*!< I2S communication I2S Philips standard, data launch at second BCK*/I2S_COMM_FORMAT_STAND_MSB        = 0X02, /*!< I2S communication MSB alignment standard, data launch at first BCK*/I2S_COMM_FORMAT_STAND_PCM_SHORT  = 0x04, /*!< PCM Short standard, also known as DSP mode. The period of synchronization signal (WS) is 1 bck cycle.*/I2S_COMM_FORMAT_STAND_PCM_LONG   = 0x0C, /*!< PCM Long standard. The period of synchronization signal (WS) is channel_bit*bck cycles.*/I2S_COMM_FORMAT_STAND_MAX,               /*!< standard max*///old definition will be removed in the future.I2S_COMM_FORMAT_I2S       __attribute__((deprecated)) = 0x01, /*!< I2S communication format I2S, correspond to `I2S_COMM_FORMAT_STAND_I2S`*/I2S_COMM_FORMAT_I2S_MSB   __attribute__((deprecated)) = 0x01, /*!< I2S format MSB, (I2S_COMM_FORMAT_I2S |I2S_COMM_FORMAT_I2S_MSB) correspond to `I2S_COMM_FORMAT_STAND_I2S`*/I2S_COMM_FORMAT_I2S_LSB   __attribute__((deprecated)) = 0x02, /*!< I2S format LSB, (I2S_COMM_FORMAT_I2S |I2S_COMM_FORMAT_I2S_LSB) correspond to `I2S_COMM_FORMAT_STAND_MSB`*/I2S_COMM_FORMAT_PCM       __attribute__((deprecated)) = 0x04, /*!< I2S communication format PCM, correspond to `I2S_COMM_FORMAT_STAND_PCM_SHORT`*/I2S_COMM_FORMAT_PCM_SHORT __attribute__((deprecated)) = 0x04, /*!< PCM Short, (I2S_COMM_FORMAT_PCM | I2S_COMM_FORMAT_PCM_SHORT) correspond to `I2S_COMM_FORMAT_STAND_PCM_SHORT`*/I2S_COMM_FORMAT_PCM_LONG  __attribute__((deprecated)) = 0x08, /*!< PCM Long, (I2S_COMM_FORMAT_PCM | I2S_COMM_FORMAT_PCM_LONG) correspond to `I2S_COMM_FORMAT_STAND_PCM_LONG`*/
} i2s_comm_format_t;

知道了每个参数的含义以及知道它可以配置哪些参数,就可以调用i2s_driver_install这个函数了。
这里我们举一个安装I2S驱动的例子,就比较容易理解了。同时配置的时候,我们把它放在一个函数里面,起名为i2s_install( )。

 // 安装I2S驱动void i2s_install(){// 配置I2S接收i2s_config_t i2s_config = {.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),.sample_rate = SAMPLE_RATE,.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,  .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,.communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),.intr_alloc_flags = 0,.dma_buf_count = 16,.dma_buf_len = bufferLen,.use_apll = false      };if (ESP_OK != i2s_driver_install(I2S_PORT, &i2s_config, 0, NULL)) {Serial.println("Install I2S driver failed");return;}  
}

配置I2S引脚

I2S通信最重要的三个信号是位时钟BCK、字时钟WS、数据引脚SD,因此我们需要对其引脚进行配置,设置I2S引脚的函数是
esp_err_t i2s_set_pin(i2s_port_t i2s_num, const i2s_pin_config_t *pin),第一个参数传入I2S端口,填I2S_NUM_0或I2S_NUM_1, 第二个参数是结构体如下:

typedef struct {int mck_io_num;     /*!< MCK in out pin. Note that ESP32 supports setting MCK on GPIO0/GPIO1/GPIO3 only*/int bck_io_num;     /*!< BCK in out pin*/int ws_io_num;      /*!< WS in out pin*/int data_out_num;   /*!< DATA out pin*/int data_in_num;    /*!< DATA in pin*/
} i2s_pin_config_t;

其中mck_io_num; bck_io_num,ws_io_num等都是整型变量,data_out_num如果我们没有用到就传入-1,在driver/i2s.h头文件定义了

#define I2S_PIN_NO_CHANGE (-1) /*!< Use in i2s_pin_config_t for pins which should not be changed */

假设我们要配置的引脚位时钟BCK、字时钟WS、数据引脚SD分别是D13, D12, D14,同样把要配置的参数写入一个函数i2s_setpin()里面,配置I2S引脚示例如下:

// 配置I2S引脚
#define I2S_MIC_WS 12
#define I2S_MIC_SD 14
#define I2S_MIC_BCK 13void i2s_setpin(){i2s_pin_config_t pin_config = {};pin_config.bck_io_num = I2S_MIC_BCK;pin_config.ws_io_num = I2S_MIC_WS;pin_config.data_out_num = I2S_PIN_NO_CHANGE;pin_config.data_in_num = I2S_MIC_SD;if (ESP_OK != i2s_set_pin(I2S_PORT, &pin_config)) {Serial.println("I2S set pin failed");return;}}

安装完I2S驱动和配置好I2S引脚后,我们只要在setup()函数里面调用这两个函数就可以了。

void setup() {Serial.begin(115200);Serial.println("Setup I2S ...");delay(1000);i2s_install();i2s_setpin();delay(500);  
}

读取I2S数据

上面只是对I2S进行了一下初始化,要通过INMP441读取i2s数据,我们只需要调用esp_err_t i2s_read(i2s_port_t i2s_num, void *dest, size_t size, size_t *bytes_read, TickType_t ticks_to_wait);这个函数。因为前面在初始化I2S时的量化位数是16位,所以每个采样点的数据大小为2字节,我们将读取到的数据放入一个缓存区数组sBuffer,将数组长度bufferLen定义为64,确保每次从I2S接口读取时能获得足够的音频数据。 如果读取成功2s_read这个函数会返回一个ESP_OK,成功后就进入数据处理部分。这里我们将读取到的音频数据求均值然后可以用串口绘图仪观察它的数据波形,代码如下:

void loop() {size_t bytesIn = 0;esp_err_t result = i2s_read(I2S_PORT, &sBuffer, bufferLen, &bytesIn, portMAX_DELAY);if (result == ESP_OK){int samples_read = bytesIn / 2;if (samples_read > 0) {float mean = 0;for (int i = 0; i < samples_read; ++i) {mean += (sBuffer[i]);}mean /= samples_read;Serial.println(mean);delay(50);}}
}

完整代码

#include "driver/i2s.h"
#define SAMPLE_RATE (44100)#define I2S_MIC_WS 12
#define I2S_MIC_SD 14
#define I2S_MIC_BCK 13
#define I2S_PORT I2S_NUM_0
#define bufferLen 64int16_t sBuffer[bufferLen];// 安装I2S驱动void i2s_install(){// 配置I2S接收i2s_config_t i2s_config = {.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),.sample_rate = SAMPLE_RATE,.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,  .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,.communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),.intr_alloc_flags = 0,.dma_buf_count = 16,.dma_buf_len = bufferLen,.use_apll = false      };if (ESP_OK != i2s_driver_install(I2S_PORT, &i2s_config, 0, NULL)) {Serial.println("Install I2S driver failed");return;}  
}// 配置I2S引脚void i2s_setpin(){i2s_pin_config_t pin_config = {};pin_config.bck_io_num = I2S_MIC_BCK;pin_config.ws_io_num = I2S_MIC_WS;pin_config.data_out_num = I2S_PIN_NO_CHANGE;pin_config.data_in_num = I2S_MIC_SD;if (ESP_OK != i2s_set_pin(I2S_PORT, &pin_config)) {Serial.println("I2S set pin failed");return;}}void setup() {Serial.begin(115200);Serial.println("Setup I2S ...");delay(1000);i2s_install();i2s_setpin();i2s_start(I2S_PORT);delay(500);  
}void loop() {size_t bytesIn = 0;esp_err_t result = i2s_read(I2S_PORT, &sBuffer, bufferLen, &bytesIn, portMAX_DELAY);if (result == ESP_OK){int samples_read = bytesIn / 2;if (samples_read > 0) {float mean = 0;for (int i = 0; i < samples_read; ++i) {mean += (sBuffer[i]);}mean /= samples_read;Serial.println(mean);delay(50);}}}

接线图

写完代码后就可以开始接线了,接线图如下图所示:供电这里接3.3V,L/R接地。
在这里插入图片描述

实验效果

一开始接收到的是外界的声音,波形是杂乱无章的。后面用嘴吹气,波形会跟着吹气变化,不吹气波形是平缓不变的,后面大概吹了几次,可以看到波形变化,如下图:

在这里插入图片描述

总结

本篇文章介绍了通过ESP32的I2S通信实时读取INMP441麦克风模块的音频数据,并通过串口绘图仪显示音频数据波形。后面我们还会介绍使用INMP441采集音频并实时播放音频,感兴趣的可以先关注收藏一下!

相关文章:

ESP32 I2S音频总线学习笔记(二):I2S读取INMP441音频数据

简介 在这个系列的上一篇文章中&#xff0c;我们介绍了ESP32 I2S音频总线的相关知识&#xff0c;简要了解了什么是I2S总线、它的通信格式&#xff0c;以及相关的底层API函数。没有看过上篇文章的可以点击文章进行回顾&#xff1a; ESP32 I2S音频总线学习笔记&#xff08;一&a…...

本地大模型编程实战(03)语义检索(2)

文章目录 准备按批次嵌入加载csv文件&#xff0c;分割文档并嵌入测试嵌入效果总结代码 上一篇文章&#xff1a; 本地大模型编程实战(02)语义检索(1) 详细介绍了如何使用 langchain 实现语义检索&#xff0c;为了演示方便&#xff0c;使用的是 langchain 提供的内存数据库。 在实…...

LabVIEW橡胶动态特性测试系统

本文介绍了一个利用LabVIEW软件和NI高速数据采集设备构建的橡胶动态特性测试系统。该系统实现了橡胶材料动态性能的精确测量&#xff0c;并通过虚拟仪器技术&#xff0c;提高了测试数据的处理效率和准确性。系统支持实时数据处理和多种信号的动态分析&#xff0c;适用于工业和科…...

SpringBoot开发(二)Spring Boot项目构建、Bootstrap基础知识

1. Spring Boot项目构建 1.1. 简介 基于官方网站https://start.spring.io进行项目的创建. 1.1.1. 简介 Spring Boot是基于Spring4框架开发的全新框架&#xff0c;设计目的是简化搭建及开发过程&#xff0c;并不是对Spring功能上的增强&#xff0c;而是提供了一种快速使用Spr…...

使用 Vue 3 的 watchEffect 和 watch 进行响应式监视

Vue 3 的 Composition API 引入了 <script setup> 语法&#xff0c;这是一种更简洁、更直观的方式来编写组件逻辑。结合 watchEffect 和 watch&#xff0c;我们可以轻松地监视响应式数据的变化。本文将介绍如何使用 <script setup> 语法结合 watchEffect 和 watch&…...

Vue.js 高级组件开发

Vue.js 高级组件开发&#xff1a;构建一个智能动态表单生成器 ——从可复用架构到性能优化的全链路实践 引言&#xff1a;为什么需要高级组件&#xff1f; 在现代前端开发中&#xff0c;组件不仅是UI的封装&#xff0c;更是业务逻辑的载体。一个“高级”Vue组件应当具备&…...

React应用深度优化与调试实战指南

一、渲染性能优化进阶 1.1 精细化渲染控制 typescript 复制 // components/HeavyComponent.tsx import React, { memo, useMemo } from react;interface Item {id: string;complexData: {// 复杂嵌套结构}; }const HeavyComponent memo(({ items }: { items: Item[] }) &g…...

Linux 内核学习(4) --- devfreq 动态调频框架

目录 Linux devfreq 简介核心数据结构devfreq_dev_profile 结构体devfreq_governor 结构体devfreq 结构体 工作流程devFreq framework 初始化governor 初始化devfreq Device 注册动态变频的实现device_unregister 流程 用户空间节点参考文章 Linux devfreq 简介 现在的 Soc 由…...

Spring Boot 无缝集成SpringAI的函数调用模块

这是一个 完整的 Spring AI 函数调用实例&#xff0c;涵盖从函数定义、注册到实际调用的全流程&#xff0c;以「天气查询」功能为例&#xff0c;结合代码详细说明&#xff1a; 1. 环境准备 1.1 添加依赖 <!-- Spring AI OpenAI --> <dependency><groupId>o…...

Ansible自动化运维实战--yaml的使用和配置(7/8)

文章目录 一、YAML 基本语法1.1. 缩进1.2. 注释1.3. 列表1.4. 字典 二、Ansible 中 YAML 的应用2.1. Ansible 剧本&#xff08;Playbooks&#xff09;2.2. 变量定义2.3. 角色&#xff08;Roles&#xff09;2.4. Inventory 文件2.5. 数据类型2.6. 引用变量 在 Ansible 里&#x…...

kamailio-5.8.4-centos9编译

安装必要的依赖包 在开始编译之前&#xff0c;你需要安装编译 Kamailio 所需的一些基础依赖包&#xff1a; dnf install -y make gcc gcc-c flex bison libxml2-devel openssl-devel sqlite-devel mysql-devel pcre-devel libcurl-devel下载并解压 Kamailio 源码包 假设你已经…...

单例模式 - 单例模式的实现与应用

引言 单例模式&#xff08;Singleton Pattern&#xff09;是设计模式中最简单且最常用的模式之一。它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例。单例模式常用于需要全局唯一对象的场景&#xff0c;如配置管理、日志记录、线程池等。 本文将详细介…...

hadoop==docker desktop搭建hadoop

hdfs map readuce yarn https://medium.com/guillermovc/setting-up-hadoop-with-docker-and-using-mapreduce-framework-c1cd125d4f7b 清理资源 docker-compose down docker system prune -f...

zookeeper的介绍和简单使用

1 zookerper介绍 zookeeper是一个开源的分布式协调服务&#xff0c;由Apache软件基金会提供&#xff0c;主要用于解决分布式应用中的数据管理、状态同步和集群协调等问题。通过提供一个高性能、高可用的协调服务&#xff0c;帮助构建可靠的分布式系统。 Zookeeper的特点和功能…...

DiffuEraser: 一种基于扩散模型的视频修复技术

视频修复算法结合了基于流的像素传播与基于Transformer的生成方法&#xff0c;利用光流信息和相邻帧的信息来恢复纹理和对象&#xff0c;同时通过视觉Transformer完成被遮挡区域的修复。然而&#xff0c;这些方法在处理大范围遮挡时常常会遇到模糊和时序不一致的问题&#xff0…...

CentOS/Linux Python 2.7 离线安装 Requests 库解决离线安装问题。

root@mwcollector1 externalscripts]# cat /etc/os-release NAME=“Kylin Linux Advanced Server” VERSION=“V10 (Sword)” ID=“kylin” VERSION_ID=“V10” PRETTY_NAME=“Kylin Linux Advanced Server V10 (Sword)” ANSI_COLOR=“0;31” 这是我系统的版本,由于是公司内网…...

World of Warcraft [CLASSIC] Jewelcrafting Gemstone 2

World of Warcraft [CLASSIC] Jewelcrafting & Gemstone 2 珠宝加工与常用宝石列表&#xff08;紫色史诗级&#xff09;&#xff1a; World of Warcraft [CLASSIC] Jewelcrafting & Gemstone_wlk宝石属性一览表-CSDN博客...

AI刷题-最小化团建熟悉程度和

目录 问题描述 输入格式 输出格式 解题思路&#xff1a; 状态表示 状态转移 动态规划数组 预处理 实现&#xff1a; 1.初始化&#xff1a; 2.动态规划部分&#xff1a; &#xff08;1&#xff09;对于已分组状态的&#xff0c;跳过&#xff1a; &#xff08;2&…...

一文详解Filter类源码和应用

背景 在日常开发中&#xff0c;经常会有需要统一对请求做一些处理&#xff0c;常见的比如记录日志、权限安全控制、响应处理等。此时&#xff0c;ServletApi中的Filter类&#xff0c;就可以很方便的实现上述效果。 Filter类 是一个接口&#xff0c;属于 Java Servlet API 的一部…...

应用层协议 HTTP 讲解实战:从0实现HTTP 服务器

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; HTTP 协议 &#x1f98b; 认识 URL&#x1f98b; urlencode 和 urldecode 二&#xff1a;&#x1f525; HTTP 协议请求与响应格式 &#x1f98b; HTTP 请求…...

用Python+OpenCV手把手实现Prewitt边缘检测(附完整代码与效果对比图)

用PythonOpenCV手把手实现Prewitt边缘检测&#xff08;附完整代码与效果对比图&#xff09; 边缘检测是计算机视觉中最基础也最关键的预处理步骤之一。想象一下&#xff0c;当你需要让计算机"看清"一张照片中的物体轮廓时&#xff0c;边缘检测算法就是它的"视觉…...

Office RibbonX Editor:让Office界面定制变得像搭积木一样简单

Office RibbonX Editor&#xff1a;让Office界面定制变得像搭积木一样简单 【免费下载链接】office-ribbonx-editor An overhauled fork of the original Custom UI Editor for Microsoft Office, built with WPF 项目地址: https://gitcode.com/gh_mirrors/of/office-ribbon…...

Vue3 图片标框功能实现方案

基于 Vue3 组合式 API 的图片标框&#xff08;画框、标注、选框&#xff09;完整实现&#xff0c;核心逻辑封装在 GetBoxes 组件里&#xff0c;复制就能用 一、功能说明 ✅ 在图片上鼠标拖拽画矩形框 ✅ 实时显示框坐标&#xff08;x, y, width, height&#xff09; ✅ 支持多…...

告别FTP龟速:用NTFS-3G在CentOS7上直连移动硬盘拷贝200G大文件

告别FTP龟速&#xff1a;用NTFS-3G在CentOS7上直连移动硬盘拷贝200G大文件当面对数百GB的设计素材、日志文件或数据库备份需要迁移时&#xff0c;传统的FTP传输往往会成为效率瓶颈。我曾在一个视频处理项目中&#xff0c;需要将230GB的4K原始素材从移动硬盘导入服务器&#xff…...

政企数据安全:危机与出路

随着数字化转型的浪潮席卷全球&#xff0c;公共部门积累的数据量呈爆炸式增长。从公民个人信息到公共服务记录&#xff0c;从财政预算到基础设施管理数据——这些宝贵资源在提升政府治理效率的同时&#xff0c;也悄然成为网络犯罪分子的“新猎物”。当公共数据逐渐成为数字时代…...

量子软件测试的挑战与优化策略

1. 量子软件测试的挑战与机遇量子计算正在从实验室走向实际应用&#xff0c;随之而来的是对可靠量子软件的需求激增。与传统软件不同&#xff0c;量子程序面临三大独特挑战&#xff1a;首先&#xff0c;量子态的叠加性和纠缠性使得测试变得异常复杂。一个n量子比特系统可以同时…...

中兴光猫终极管理指南:解锁工厂模式与Telnet权限的实战教程

中兴光猫终极管理指南&#xff1a;解锁工厂模式与Telnet权限的实战教程 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 掌握中兴光猫的设备管理和权限获取能力是网络管理员和技术爱好者…...

保姆级教程:Windows系统下Arcgis 10.2从下载、安装到汉化一次搞定(附常见License启动失败解决方案)

Windows系统下Arcgis 10.2完整安装与汉化实战指南第一次接触Arcgis的新手往往会被复杂的安装流程和神秘的License Manager搞得晕头转向。作为一款功能强大的地理信息系统软件&#xff0c;Arcgis在科研、城市规划、环境监测等领域有着广泛应用&#xff0c;但它的安装过程确实会让…...

告别元素变动导致的报错:探索自动化测试脚本的 AI“自愈”能力

前言:一个所有测试人都经历过的噩梦 周三晚上十一点,CI/CD流水线再次亮起红灯。 你打开日志,满屏的NoSuchElementException扑面而来。仔细一看——前端团队在昨天的版本中重构了登录页面的DOM结构,原本的#login-btn变成了#signin-button-v2,30个测试用例因此全军覆没。 …...

AI圈内火热的Agent、MCP、Skill、CLI是啥?用装修房子讲透,看完秒懂

本文用装修房子的比喻&#xff0c;详细解释了AI领域的四个核心概念&#xff1a;Agent如同会自主规划任务的私人助理&#xff1b;MCP是AI与外部工具数据的统一接口&#xff0c;类似USB-C&#xff1b;Skill是指导AI按标准操作执行的手册&#xff1b;CLI则是不依赖图形界面的命令行…...