STM32F103RCT6指纹识别系统开发实战:硬件选型与软件实现
在实际嵌入式系统开发中指纹识别技术因其安全性和便捷性被广泛应用于门禁、考勤、保险箱等场景。STM32F103RCT6作为一款性价比极高的ARM Cortex-M3内核微控制器具备丰富的外设资源和足够的处理能力非常适合作为指纹识别系统的核心处理器。本文将围绕STM32F103RCT6与指纹识别模块的集成从硬件选型、通信协议、软件设计到实际部署完整介绍一个可工作的指纹识别系统实现方案。指纹识别系统的核心挑战在于如何稳定地采集指纹图像、高效地提取特征值并快速完成指纹匹配。STM32F103RCT6需要承担指纹模块的驱动、通信协议处理、用户交互逻辑以及可能的网络通信等功能。与简单的8位单片机相比STM32F103RCT6的72MHz主频和20KB RAM为复杂的指纹算法和多重任务处理提供了硬件基础。1. 理解指纹识别系统的基本工作原理指纹识别系统本质上是一个模式识别系统其核心流程包括指纹采集、图像预处理、特征提取和特征匹配四个阶段。1.1 指纹采集与传感器选型指纹传感器是系统的输入设备负责将物理指纹转换为数字图像。常见的指纹传感器类型包括光学式、电容式和射频式。光学传感器通过光的折射和反射原理采集指纹图像成本较低但体积较大电容传感器利用半导体电容变化检测指纹谷脊体积小但易受静电影响射频传感器通过检测皮下真皮层的射频信号抗污能力强但成本较高。对于STM32F103RCT6项目推荐选择串口通信的光学或电容指纹模块如FPM10A、AS608等。这些模块通常已经内置了指纹图像处理和特征提取算法STM32只需通过串口发送指令即可完成指纹操作大大降低了开发难度。1.2 指纹图像处理流程原始指纹图像往往存在噪声、对比度不足等问题需要经过一系列预处理才能提取有效特征图像增强通过滤波算法消除噪声提高图像质量二值化将灰度图像转换为黑白图像突出指纹纹路细化处理将指纹纹路细化为单像素宽度便于特征提取特征点提取识别指纹的细节特征点端点、分叉点等商用指纹模块通常已经完成了这些复杂算法开发者只需关注应用层逻辑。1.3 指纹匹配算法原理指纹匹配主要通过比较特征点的相对位置关系来实现。常见的匹配算法包括点模式匹配比较特征点的类型、位置和方向纹理模式匹配比较指纹的整体纹理特征混合匹配结合多种特征进行综合判断匹配结果通常以相似度分数表示超过设定阈值即认为匹配成功。2. 硬件系统设计与元器件选型基于STM32F103RCT6的指纹识别系统硬件架构需要综合考虑性能、成本和可靠性。2.1 核心控制器STM32F103RCT6特性分析STM32F103RCT6是ST意法半导体推出的增强型系列微控制器主要特性包括内核ARM Cortex-M3最高72MHz工作频率存储256KB Flash48KB RAM实际可用约20KB系统RAM通信接口3个USART、2个SPI、2个I2CGPIO51个多功能IO口模拟外设3个ADC21个通道定时器4个16位定时器2个看门狗定时器这些资源足以支持指纹识别系统的基本需求特别是多个串口可以同时连接指纹模块和调试接口。2.2 指纹模块选型与接口设计推荐使用AS608或FPM10A指纹模块两者都采用串口通信支持指纹录入、删除、搜索等功能。AS608指纹模块关键参数传感器类型光学式分辨率500DPI指纹模板容量300枚匹配方式1:1和1:N接口UART TTL电平3.3V通信波特率9600bps~115200bps默认57600bps硬件连接时STM32F103RCT6的USART1或USART2可以直接与指纹模块连接STM32F103RCT6 AS608指纹模块 PA9(TX) --- RX PA10(RX) --- TX 3.3V --- VCC GND --- GND2.3 外围电路设计完整的指纹识别系统还需要以下外围电路电源电路采用AMS1117-3.3V稳压芯片将5V输入转换为3.3V系统电压指示电路LED指示灯显示系统状态电源、识别成功、识别失败按键电路用于模式切换、指纹录入触发等操作显示模块可选OLED或LCD显示屏用于显示操作提示和识别结果3. 软件开发环境与工程配置STM32F103RCT6的软件开发可以使用STM32CubeIDE或Keil MDK推荐使用STM32CubeMX进行引脚配置和代码生成。3.1 开发环境搭建首先安装STM32CubeIDE和STM32CubeProgrammer然后通过STM32CubeMX创建新工程选择STM32F103RCT6型号配置系统时钟为72MHz使能USART1或USART2与指纹模块通信配置GPIO用于LED、按键等外设生成工程代码3.2 指纹模块驱动库实现指纹模块通过串口协议通信需要实现完整的指令集封装。以下是指令包的基本结构// 指纹指令包结构体 typedef struct { uint8_t header[2]; // 固定为0xEF01 uint8_t chip_addr[4]; // 模块地址默认0xFFFFFFFF uint8_t package_type; // 包类型命令包(0x01)、数据包(0x02)、应答包(0x07) uint8_t package_len[2];// 包长度 uint8_t package_content[64]; // 包内容 uint8_t check_sum[2]; // 校验和 } Fingerprint_Package_t; // 常用指令定义 #define CMD_GET_IMAGE 0x01 // 采集指纹图像 #define CMD_GEN_CHAR 0x02 // 生成特征 #define CMD_MATCH 0x03 // 精确匹配(1:1) #define CMD_SEARCH 0x04 // 搜索匹配(1:N) #define CMD_REG_MODEL 0x05 // 合并特征生成模板 #define CMD_STORE 0x06 // 存储模板 #define CMD_LOAD 0x07 // 读取模板 #define CMD_DELETE 0x0C // 删除模板 #define CMD_EMPTY 0x0D // 清空指纹库 #define CMD_GET_TEMP_COUNT 0x1D // 获取模板数量3.3 串口通信驱动实现STM32与指纹模块的串口通信需要实现数据发送和接收功能// 串口发送函数 HAL_StatusTypeDef fingerprint_send_command(UART_HandleTypeDef *huart, uint8_t *data, uint16_t len) { return HAL_UART_Transmit(huart, data, len, 1000); } // 串口接收函数带超时 HAL_StatusTypeDef fingerprint_receive_data(UART_HandleTypeDef *huart, uint8_t *buffer, uint16_t len, uint32_t timeout) { return HAL_UART_Receive(huart, buffer, len, timeout); } // 计算校验和 uint16_t calculate_check_sum(uint8_t *data, uint16_t len) { uint16_t sum 0; for(uint16_t i 0; i len; i) { sum data[i]; } return sum; }4. 指纹识别核心功能实现指纹识别系统的核心功能包括指纹录入、指纹搜索和指纹删除每个功能都需要严格按照指纹模块的通信协议实现。4.1 指纹录入流程实现指纹录入需要用户按三次手指确保采集到高质量的指纹模板// 指纹录入函数 uint8_t fingerprint_enroll(uint16_t position) { uint8_t retry_count 0; uint8_t result 0; // 第一次采集 while(retry_count 3) { result capture_fingerprint(1); if(result FINGERPRINT_OK) break; retry_count; HAL_Delay(500); } if(result ! FINGERPRINT_OK) return result; // 第二次采集 retry_count 0; while(retry_count 3) { result capture_fingerprint(2); if(result FINGERPRINT_OK) break; retry_count; HAL_Delay(500); } if(result ! FINGERPRINT_OK) return result; // 生成并存储模板 result generate_template(); if(result ! FINGERPRINT_OK) return result; result store_template(position); return result; } // 采集指纹图像 uint8_t capture_fingerprint(uint8_t buffer_id) { uint8_t command[12]; uint8_t response[12]; // 构建采集指令 command[0] 0xEF; command[1] 0x01; // 包头 memcpy(command[2], module_addr, 4); // 模块地址 command[6] 0x01; // 包类型命令包 command[7] 0x00; command[8] 0x03; // 包长度 command[9] CMD_GET_IMAGE; // 指令码 command[10] 0x00; command[11] 0x05; // 校验和简化计算 // 发送指令并等待响应 fingerprint_send_command(huart1, command, 12); HAL_Delay(100); fingerprint_receive_data(huart1, response, 12, 1000); return (response[9] 0x00) ? FINGERPRINT_OK : response[9]; }4.2 指纹搜索匹配实现指纹搜索是系统的核心功能需要在指纹库中快速找到匹配的模板// 指纹搜索函数 uint8_t fingerprint_search(uint16_t *position, uint16_t *score) { uint8_t command[17]; uint8_t response[16]; // 先采集指纹图像 uint8_t result capture_fingerprint(1); if(result ! FINGERPRINT_OK) return result; // 生成特征值 result generate_character(1); if(result ! FINGERPRINT_OK) return result; // 构建搜索指令 command[0] 0xEF; command[1] 0x01; memcpy(command[2], module_addr, 4); command[6] 0x01; command[7] 0x00; command[8] 0x08; // 包长度 command[9] CMD_SEARCH; command[10] 0x01; // 特征缓冲区 command[11] 0x00; command[12] 0x00;// 起始位置 command[13] 0x01; command[14] 0x2C;// 搜索数量300个 // 计算校验和... fingerprint_send_command(huart1, command, 17); HAL_Delay(200); fingerprint_receive_data(huart1, response, 16, 1000); if(response[9] 0x00) { *position (response[10] 8) | response[11]; *score (response[12] 8) | response[13]; return FINGERPRINT_OK; } return response[9]; }4.3 系统状态管理与用户交互良好的用户交互设计能显著提升系统易用性// 系统主状态机 typedef enum { SYSTEM_IDLE 0, SYSTEM_ENROLL_START, SYSTEM_ENROLL_STEP1, SYSTEM_ENROLL_STEP2, SYSTEM_ENROLL_STEP3, SYSTEM_SEARCHING, SYSTEM_DELETING, SYSTEM_SHOW_RESULT } System_State_t; void system_state_machine(void) { static System_State_t current_state SYSTEM_IDLE; static uint32_t last_operation_time 0; switch(current_state) { case SYSTEM_IDLE: if(check_enroll_button()) { current_state SYSTEM_ENROLL_START; show_message(请按手指录入); } else if(finger_detected()) { current_state SYSTEM_SEARCHING; show_message(识别中...); } break; case SYSTEM_ENROLL_START: if(fingerprint_enroll(next_available_position()) FINGERPRINT_OK) { current_state SYSTEM_SHOW_RESULT; show_message(录入成功); } else { show_message(录入失败请重试); current_state SYSTEM_IDLE; } break; case SYSTEM_SEARCHING: { uint16_t position, score; uint8_t result fingerprint_search(position, score); if(result FINGERPRINT_OK score 60) { sprintf(message, 识别成功 #%d, position); show_message(message); } else { show_message(识别失败); } current_state SYSTEM_IDLE; break; } } }5. 系统调试与性能优化指纹识别系统的稳定性和识别率是衡量系统质量的关键指标。5.1 通信稳定性调试串口通信的稳定性直接影响系统可靠性常见问题包括数据包丢失增加超时重传机制设置合理的超时时间500-1000ms数据校验错误严格校验每个数据包的校验和发现错误立即重发波特率不匹配确保STM32和指纹模块使用相同的波特率通常57600bps调试时可以添加详细的日志输出// 调试信息输出 void debug_print_package(uint8_t *data, uint16_t len, const char *tag) { printf([%s] , tag); for(uint16_t i 0; i len; i) { printf(%02X , data[i]); } printf(\n); } // 带调试的发送函数 HAL_StatusTypeDef fingerprint_send_debug(UART_HandleTypeDef *huart, uint8_t *data, uint16_t len) { debug_print_package(data, len, SEND); HAL_StatusTypeDef status HAL_UART_Transmit(huart, data, len, 1000); if(status ! HAL_OK) { printf(Send failed: %d\n, status); } return status; }5.2 识别率优化策略提高指纹识别率需要从硬件和软件两方面入手硬件优化确保指纹传感器表面清洁提供均匀的照明条件光学传感器保持手指干燥清洁软件优化设置合理的匹配阈值通常60-80分实现多次采集取最优策略添加指纹质量检测拒绝低质量图像// 指纹质量检测 uint8_t check_fingerprint_quality(void) { uint8_t command[12]; uint8_t response[13]; // 发送图像质量检测指令 command[9] 0x26; // 图像质量检测指令码 // ... 构建完整指令包 fingerprint_send_command(huart1, command, 12); fingerprint_receive_data(huart1, response, 13, 1000); // 质量分数通常0-100大于50认为质量合格 return (response[10] 50) ? 1 : 0; }5.3 系统性能测试指标完整的指纹识别系统应该达到以下性能指标采集时间 1秒搜索时间300枚模板 1.5秒误识率FAR 0.001%拒识率FRR 3%模板容量支持至少300枚指纹功耗待机时 10mA工作时 120mA6. 常见问题排查与解决方案在实际部署中指纹识别系统可能遇到各种问题以下是典型问题的排查方法。6.1 通信连接问题问题现象可能原因检查方法解决方案模块无响应电源问题测量VCC电压确保3.3V稳定供电接线错误检查TX/RX交叉连接确认TX接RXRX接TX波特率不匹配测量波形计算波特率调整STM32波特率与模块一致数据包校验错误电磁干扰检查线路长度和屏蔽缩短连线增加磁珠电平不匹配测量信号电平确认都是3.3V电平6.2 指纹识别问题问题现象可能原因检查方法解决方案采集失败手指放置不当观察指示灯反馈提示用户正确放置手指传感器脏污视觉检查传感器清洁传感器表面手指太干或太湿询问用户手指状态提示用户调整手指状态误识别率高阈值设置过低测试不同阈值下的FAR/FRR适当提高匹配阈值模板质量差检查模板生成流程确保三次采集都高质量搜索速度慢模板数量多统计搜索时间优化搜索算法分库搜索6.3 系统稳定性问题长期运行的指纹识别系统需要特别注意稳定性看门狗配置启用独立看门狗IWDG设置4秒超时// 看门狗初始化 void iwdg_init(void) { IWDG-KR 0x5555; // 允许写入PR和RLR IWDG-PR 4; // 预分频器64分频 IWDG-RLR 1250; // 重载值4秒超时 IWDG-KR 0xAAAA; // 刷新看门狗 IWDG-KR 0xCCCC; // 启动看门狗 } // 定时喂狗 void iwdg_feed(void) { IWDG-KR 0xAAAA; }异常处理机制建立完整的异常处理流程包括通信超时、数据异常、硬件故障等场景的恢复策略。7. 生产环境部署建议将原型系统转化为可量产产品需要考虑更多工程因素。7.1 硬件设计优化量产版本应该优化PCB设计使用4层板提高信号完整性电源电路增加TVS管防静电串口线路串联22Ω电阻抑制振铃预留测试点和调试接口7.2 软件可靠性增强生产环境软件需要增加以下功能启动自检检测传感器、存储器是否正常运行日志记录操作日志和异常信息远程升级通过串口或网络实现固件升级数据备份定期备份指纹模板和系统配置7.3 安全考虑指纹数据涉及个人隐私需要加强安全保护通信加密对敏感指令进行加密传输访问控制设置管理员权限和用户权限数据清除提供安全的数据擦除功能防拆机制检测设备是否被非法打开基于STM32F103RCT6的指纹识别系统从原型到产品需要经过严格的测试和优化。实际项目中建议先实现基本功能然后逐步添加可靠性、安全性和易用性特性。对于不同的应用场景可能还需要集成网络通信、数据同步等扩展功能。

相关新闻

后端偷加字段不写文档,前端联调当场掀桌?我用AI+国产库Schema追踪,自动生成API文档版本,甲方看完直呼内行!

后端偷加字段不写文档,前端联调当场掀桌?我用AI+国产库Schema追踪,自动生成API文档版本,甲方看完直呼内行!

📚 目录 架构全景:从 DB Schema 到 API 文档的“AI 自动化流水线” 核心探针:达梦/金仓元数据深度解析与 Diff 引擎 AI 赋能:大模型驱动的 OpenAPI 生成(Prompt 工程) 版本控制:API 文档的语义化版本与自动化流转 总结与国产库避坑清单 一、架构全景:从 DB Schema 到…

2026/7/17 19:59:26阅读更多 →
测试人员核心价值如何利用AI驱动测试

测试人员核心价值如何利用AI驱动测试

把 AI、测试设计、自动化框架、测试数据、CI、质量策略 串起来,核心不是“堆工具”,而是形成一条可持续运行的工程链路:需求进入 → AI 辅助分析 → 测试设计 → 自动化落地 → 测试数据准备 → CI 分层执行 → 质量度量 → 风险反馈 → 持续…

2026/7/17 19:59:26阅读更多 →
2026年低代码平台发展趋势:AI融合与源码交付成为企业采购两大核心指标

2026年低代码平台发展趋势:AI融合与源码交付成为企业采购两大核心指标

摘要2026年,低代码平台正经历从“效率工具”向“企业数字化基础设施”的深刻转型。全球低代码开发平台市场规模从2025年的500.1亿美元增长至2026年的662亿美元,年复合增长率高达32.4%。中国低代码整体市场规模保持42.7%的高速同比增长,行业进…

2026/7/17 19:59:26阅读更多 →
边缘计算 + 多模态感知:智慧电厂皮带运输 AI 识别系统是如何做到 “零误报” 的?

边缘计算 + 多模态感知:智慧电厂皮带运输 AI 识别系统是如何做到 “零误报” 的?

一、引言在智慧电厂整体生产架构中,输煤系统是机组稳定带负荷、连续发电的核心保障,输煤皮带更是整套系统的关键运行载体。现场运行过程中,皮带跑偏、积煤堵煤、托辊卡滞过热、皮带撕裂等故障频发,轻微故障会直接导致上煤不畅、机…

2026/7/17 21:04:33阅读更多 →
【第 005 讲】Python 中的进制表示与转换:整数进制 | 前缀表示 | 进制转换算法 | 小数转换 | 进制转换工具

【第 005 讲】Python 中的进制表示与转换:整数进制 | 前缀表示 | 进制转换算法 | 小数转换 | 进制转换工具

1 整数进制 在计算机科学中,数据的底层存储与运算均基于二进制系统。无论是简单的数值、字符,还是复杂的多媒体信息(如图像、音频和视频),在计算机内部的底层存储层面,最终都会被编码为二进制(B…

2026/7/17 21:04:33阅读更多 →
RA4M2微控制器驱动OLED显示模块的I2C通信实战

RA4M2微控制器驱动OLED显示模块的I2C通信实战

1. RA4M2与OLED显示模块的硬件基础 RA4M2是瑞萨电子推出的高性能32位微控制器,基于Arm Cortex-M4内核,主频高达48MHz。这款芯片在嵌入式显示领域具有独特优势,其内置的硬件I2C控制器支持标准模式(100kHz)和快速模式(400kHz),特别适…

2026/7/17 21:04:33阅读更多 →
从 Next.js 到 GitHub Pages:个人作品集网站的静态部署、自定义域名与搜索收录实践

从 Next.js 到 GitHub Pages:个人作品集网站的静态部署、自定义域名与搜索收录实践

Next.js 静态导出与 GitHub Pages 自动部署:自定义域名、HTTPS 和百度验证实战 前言 对于个人作品展示、项目文档、技术博客等以内容展示为主的网站,如果暂时不需要数据库、用户登录、文件上传和服务端接口,可以将 Next.js 项目导出为静态文…

2026/7/17 21:04:33阅读更多 →
NFS vs SMB: Why NFS Often Outperforms SMB and How to Use Both

NFS vs SMB: Why NFS Often Outperforms SMB and How to Use Both

NFS still feels like the power-user option — awkward to configure, but when it’s right it can absolutely smoke SMB for many common Linux/Unix file‑sharing workloads. Background / Overview​ Local file sharing on home networks and small labs is dominat…

2026/7/17 21:04:33阅读更多 →
Cursor环境变量配置全链路解析(含VS Code兼容性对照表+Shell/PowerShell双平台实测数据)

Cursor环境变量配置全链路解析(含VS Code兼容性对照表+Shell/PowerShell双平台实测数据)

更多请点击: https://intelliparadigm.com 第一章:Cursor环境变量配置全链路解析(含VS Code兼容性对照表Shell/PowerShell双平台实测数据) 环境变量是Cursor智能编程助手正确识别项目上下文、调用本地CLI工具及集成AI模型的关键基…

2026/7/17 20:59:32阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/17 10:42:55阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/17 8:31:03阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/17 13:22:23阅读更多 →
VS Code 高效配置与个性化定制全攻略

VS Code 高效配置与个性化定制全攻略

1. VS Code 高效配置基础作为一款轻量级但功能强大的代码编辑器,VS Code 的默认配置已经能满足基本需求,但通过合理调整设置可以大幅提升编码效率。我使用 VS Code 已经有五年多时间,期间尝试过各种配置方案,总结出这套适合大多数…

2026/7/17 0:00:01阅读更多 →
从竞赛代码到桌面工具:让 SuperADD 与 SubspaceAD 真正跑进自己的图像

从竞赛代码到桌面工具:让 SuperADD 与 SubspaceAD 真正跑进自己的图像

在异常检测领域,很多优秀算法最初都是以研究代码的形式发布的。它们能够在固定测试集上复现实验结果,却不一定能被普通用户直接拿来测试自己的图片。尤其是最近很多算法仅提供在固定测试集的测试环境,而gradio的demo演示也不会提供。 对工程应用和在自己的图片上进行测试来…

2026/7/17 0:00:01阅读更多 →
WinRAR高效配置指南:从基础安装到高级压缩实战

WinRAR高效配置指南:从基础安装到高级压缩实战

前几天帮同事处理一个客户发来的压缩包,解压时系统自带的工具弹出一串乱码,换用 WinRAR 却顺利打开了。这种看似简单的场景,恰恰暴露了不同压缩工具在处理非标准编码、分卷压缩或加密文件时的差异。WinRAR 作为一款老牌工具,真正价…

2026/7/17 0:00:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/16 20:13:14阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/17 13:22:38阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/17 17:26:50阅读更多 →