ESP32异步MQTT客户端:QoS2/SSL/WSS全协议支持

news2026/3/25 5:33:38
1. PsychicMqttClient面向ESP32全功能异步MQTT客户端深度解析1.1 项目定位与工程价值PsychicMqttClient并非又一个轻量级MQTT封装而是在ESP-IDF原生MQTT客户端基础上构建的工业级异步通信中间件。其核心价值在于填补了ESP32生态中长期存在的三大技术空白完整QoS 0/1/2语义支持、生产级SSL/TLS端到端加密、以及MQTT over WebSocket含WSS协议栈。在智能家居网关、工业边缘节点、远程设备监控等场景中这些能力直接决定了系统能否通过等保三级认证、是否具备对抗中间人攻击的能力以及能否穿透企业级防火墙/NAT设备。该库的设计哲学是“零妥协的异步性”——所有I/O操作连接、订阅、发布、重连均不阻塞FreeRTOS任务调度器所有事件回调onConnect、onMessage、onError均在独立的MQTT事件任务上下文中执行所有内存管理包括超大消息分片重组均由内部环形缓冲区与动态内存池协同完成。这种设计使开发者可将loop()函数完全用于业务逻辑无需轮询状态或手动管理连接生命周期。1.2 技术架构演进对比特性维度AsyncMqttClient (Marvin Roger)PubSubClient (knolleary)PsychicMqttClient协议栈MQTT 3.1.1MQTT 3.1.1MQTT 3.1.1 WebSocket WSSQoS支持QoS 0/1QoS 2仅部分实现QoS 0/1完整QoS 0/1/2事务保证TLS加密需手动集成WiFiClientSecure无证书管理不支持内置mbedtls集成支持单证书/CA Bundle嵌入WebSocket不支持不支持TCP/WS/WSS三模自动协商消息大小受限于静态缓冲区默认512B受限于MAX_PACKET_SIZE宏无硬限制支持分片重组multipart reassembly重连机制基础重试无自动重连指数退避网络状态感知重连事件模型回调函数轮询回调混合纯事件驱动FreeRTOS任务隔离注表中“完整QoS 2事务保证”指严格遵循MQTT规范中的PUBLISH/PUBREC/PUBREL/PUBCOMP四步握手流程确保消息在断线重连后仍能完成Exactly-Once投递语义。2. 核心API体系与底层实现原理2.1 客户端生命周期管理PsychicMqttClient将MQTT会话抽象为状态机其核心API围绕connect()/disconnect()展开但内部实现远超表面调用// 初始化客户端实例非阻塞 PsychicMqttClient mqttClient; void setup() { // 1. 网络就绪检测关键前置条件 while (WiFi.status() ! WL_CONNECTED) { delay(500); Serial.print(.); } // 2. 服务端配置URI格式决定传输层 mqttClient.setServer(mqtt://broker.hivemq.com); // TCP明文 mqttClient.setServer(mqtts://broker.hivemq.com); // TLS加密 mqttClient.setServer(ws://broker.hivemq.com:8000); // WebSocket mqttClient.setServer(wss://broker.hivemq.com:8000); // WSS加密 // 3. TLS证书绑定若使用加密协议 mqttClient.setCACert(eclipse_root_ca); // 单证书模式 // 或 mqttClient.setCACertBundle(rootca_crt_bundle_start, rootca_crt_bundle_end - rootca_crt_bundle_start); // CA Bundle模式 // 4. 启动异步连接立即返回不阻塞 mqttClient.connect(); }底层实现关键点setServer()解析URI时自动识别协议类型并配置ESP-IDFesp_mqtt_client_config_t结构体的transport字段MQTT_TRANSPORT_OVER_TCP/MQTT_TRANSPORT_OVER_SSL/MQTT_TRANSPORT_OVER_WS/MQTT_TRANSPORT_OVER_WSSconnect()触发ESP-IDF底层esp_mqtt_client_start()但PsychicMqttClient额外创建专用FreeRTOS任务psychic_mqtt_task该任务通过xQueueReceive()监听ESP-IDF事件队列将原始esp_mqtt_event_id_t映射为高级事件如MQTT_EVENT_CONNECTED→onConnect回调连接失败时内部采用Jittered Exponential Backoff算法初始延迟1s每次失败后乘以1.5倍并加入随机抖动±200ms上限120s避免服务端雪崩2.2 主题订阅与消息处理onTopic()是PsychicMqttClient最强大的API其设计彻底解决传统库的回调陷阱// 订阅主题并注册Lambda回调QoS1自动ACK mqttClient.onTopic(sensor/temperature, 1, [](const char* topic, const char* payload, int retain, int qos, bool dup) { // ⚠️ 重要此回调在psychic_mqtt_task任务中执行 // 严禁调用delay()、WiFi.scanNetworks()等阻塞函数 // ✅ 正确做法通过FreeRTOS队列通知主任务 static QueueHandle_t sensor_queue xQueueCreate(10, sizeof(sensor_data_t)); sensor_data_t data; data.topic strdup(topic); // 深拷贝因payload内存由库管理 data.payload strdup(payload); data.timestamp millis(); xQueueSend(sensor_queue, data, portMAX_DELAY); });参数语义深度解析参数类型说明工程注意事项topicconst char*接收消息的主题名NUL终止内存由PsychicMqttClient内部缓冲区管理回调返回后失效payloadconst char*消息负载二进制安全可能含NUL字节必须深拷贝否则在下一条消息到达时被覆盖retainint是否为保留消息1是0否用于初始化设备状态需在业务层持久化qosint消息QoS等级0/1/2QoS2时需在回调内完成应用层确认逻辑dupbool是否为重复分发QoS0时有效用于幂等性处理避免重复执行底层消息重组机制 当接收超大消息4KB时ESP-IDF底层会将其拆分为多个MQTT_EVENT_DATA事件。PsychicMqttClient通过mqtt_message_t结构体维护重组状态typedef struct { uint8_t *buffer; // 动态分配的重组缓冲区 size_t buffer_size; // 当前分配大小 size_t received; // 已接收字节数 size_t total; // 消息总长度从MQTT头解析 uint16_t packet_id; // 用于QoS2去重 } mqtt_message_t;当received total时才触发onTopic()回调确保上层看到的是完整消息。2.3 发布接口与QoS语义保障publish()方法提供细粒度控制其参数设计直指MQTT核心语义// 发布消息QoS1保留标志真无重复标记 bool success mqttClient.publish( actuator/motor, // 主题 1, // QoS等级0/1/2 1, // retain标志1设为保留消息 ON, // 负载const char* strlen(ON) // 负载长度支持二进制数据 ); // QoS2的严格事务示例需应用层确认 static uint16_t pending_packet_id 0; mqttClient.onPublish([](uint16_t packet_id) { if (packet_id pending_packet_id) { Serial.println(QoS2 PUBLISH confirmed!); pending_packet_id 0; } }); pending_packet_id mqttClient.publish(control/cmd, 2, 0, REBOOT, 7);QoS实现差异对比QoS 0Fire-and-forget无应答publish()返回即认为成功QoS 1publish()返回packet_id库内部等待PUBACK超时默认30s后自动重发QoS 2publish()返回packet_id库内部严格跟踪PUBREC→PUBREL→PUBCOMP全流程onPublish()回调仅在收到PUBCOMP后触发3. SSL/TLS加密体系深度实践3.1 单证书嵌入模式适用于固定服务器此模式适合连接自有MQTT Broker如Mosquitto私有部署证书获取流程如下在Chrome浏览器访问https://your-mqtt-broker.com:8883点击地址栏锁形图标 → “连接是安全的” → “证书有效”在证书层次树中选择根证书Root CA→ “导出”为PEM格式将PEM内容转换为C字符串注意\n转义和引号包裹const char* my_broker_root_ca -----BEGIN CERTIFICATE-----\n MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF\n 0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS43mX6U\n A5/TR5d8mUgjUg4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8ou3dpjqsW\n T8KOEUtzwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjDJo2FR3qyH\n B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3xUC\n B5iPNgiV5I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n OlFuhjuefXKnEgV4We0UXgVCwOPjdAvBbIe0ocS3MFEvzG6uBQE3xDk3SzynTn\n jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpuILlaS/V9lZL\n ubhzEFnTIZd50xx7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFeGnYEgPbk6ZGQ\n 3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1mvoiBOv/2X/qkSsisRcOj/KK\n NFtY2PwByVS5uCbMiogziUwthDyC36WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n ORAzI4JMPJGslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n TkXWStAmzOVyyghqpZXjFaH3pO3JLFl/sKAIuvtd7uNxe5AW0wdeRlN8NwdC\n jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q463SM1N95R1NbdWhscdCbZAJzVc\n oyi3B43njTOQ5yOf1CceWxG1bQVs5ZufpsMljq4Ui0/1lvhwjChP4kqKOJ2qxq\n 4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n emyPxgcYxn/eR44/KJ4EBslVDR3veyJmkXQ99b21/jh5Xos1AnX5iItreGCc\n -----END CERTIFICATE-----\n;关键配置步骤mqttClient.setServer(mqtts://your-broker.com:8883); mqttClient.setCACert(my_broker_root_ca); // 绑定证书 mqttClient.connect(); // 自动启用mbedtls验证3.2 X509 CA Bundle嵌入模式企业级通用方案当需连接多个不同CA签发的MQTT服务如AWS IoT Core HiveMQ Cloud 自建Broker时必须使用CA Bundle。PsychicMqttClient提供PlatformIO自动化工具链platformio.ini配置[env:esp32dev] platform espressif32 board esp32dev framework arduino extra_scripts pre:scripts/generate_cert_bundle.py board_ssl_cert_source adafruit # 优先选用Adafruit精简版 board_build.embed_files src/certs/x509_crt_bundle.bin生成脚本工作流generate_cert_bundle.py从Adafruit仓库下载roots.pem约150KB已剔除过期/冗余证书使用mbedtls工具链将PEM转换为二进制DER格式通过objcopy将二进制文件嵌入固件.rodata段生成链接器符号_binary_src_certs_x509_crt_bundle_bin_start/end固件中引用Bundle// 声明外部符号由链接器注入 extern const uint8_t rootca_crt_bundle_start[] asm(_binary_src_certs_x509_crt_bundle_bin_start); extern const uint8_t rootca_crt_bundle_end[] asm(_binary_src_certs_x509_crt_bundle_bin_end); void setup() { mqttClient.setServer(mqtts://aws-iot-endpoint.amazonaws.com:8883); mqttClient.setCACertBundle( rootca_crt_bundle_start, rootca_crt_bundle_end - rootca_crt_bundle_start ); mqttClient.connect(); }Lets Encrypt兼容性修复 由于mbedtls 2.28存在ISRG Root X1验证缺陷必须显式包含DST Root CA X3证书。Adafruit Bundle已预置该证书若使用Mozilla Bundle需手动追加# 下载DST Root CA X3并合并 curl -s https://curl.se/ca/cacert.pem cacert.pem echo cacert.pem cat DST_Root_CA_X3.pem cacert.pem4. WebSocket协议栈集成与穿透能力4.1 WS/WSS协议自动协商机制PsychicMqttClient通过URI Scheme智能切换传输层其WebSocket实现基于ESP-IDF的esp_websocket_client但进行了关键增强// 自动匹配协议栈 mqttClient.setServer(ws://broker.hivemq.com:8000); // 启用WebSocket mqttClient.setServer(wss://broker.hivemq.com:8000); // 启用WSS自动加载TLS证书 // WebSocket特有配置通过ESP-IDF底层暴露 mqttClient.setWebSocketPath(/mqtt); // 设置WebSocket路径默认/mqtt mqttClient.setWebSocketHeaders(Authorization: Bearer token123); // 添加自定义Header穿透企业防火墙原理WebSocket复用HTTP/HTTPS端口80/443绕过传统MQTT端口1883/8883封锁WSS协议在TLS隧道内建立WebSocket连接满足企业SSL Inspection要求心跳包Ping/Pong帧保持长连接活跃避免NAT超时断连4.2 WebSocket与TLS协同配置当同时使用WSS和WiFiClientSecure时需避免证书冲突#include WiFiClientSecure.h WiFiClientSecure wifiClient; void setup() { // 1. 先为WiFiClientSecure配置CA Bundle #if ESP_ARDUINO_VERSION_MAJOR 3 wifiClient.setCACertBundle(rootca_crt_bundle_start, rootca_crt_bundle_end - rootca_crt_bundle_start); #else wifiClient.setCACertBundle(rootca_crt_bundle_start); #endif // 2. 关联WiFiClientSecure到MQTT客户端关键 mqttClient.attachArduinoCACertBundle(); // 3. 设置WSS服务器此时将复用wifiClient的证书 mqttClient.setServer(wss://broker.hivemq.com:8000); mqttClient.connect(); }注意attachArduinoCACertBundle()必须在setServer()之前调用否则MQTT客户端会覆盖wifiClient的证书配置。5. 生产环境最佳实践与调试指南5.1 事件回调安全编程范式所有on*回调函数必须遵循零阻塞原则以下为推荐架构// 定义消息队列在setup()中创建 QueueHandle_t mqtt_queue; struct mqtt_message_t { char topic[64]; char payload[512]; uint32_t timestamp; uint8_t qos; }; void setup() { mqtt_queue xQueueCreate(10, sizeof(mqtt_message_t)); mqttClient.onTopic(device/#, 1, [](const char* topic, const char* payload, int retain, int qos, bool dup) { mqtt_message_t msg; strncpy(msg.topic, topic, sizeof(msg.topic)-1); strncpy(msg.payload, payload, sizeof(msg.payload)-1); msg.timestamp millis(); msg.qos qos; xQueueSend(mqtt_queue, msg, 0); // 非阻塞发送 }); } void loop() { mqtt_message_t msg; if (xQueueReceive(mqtt_queue, msg, 0)) { // ✅ 在loop()中处理业务逻辑可调用阻塞函数 if (strcmp(msg.topic, device/reboot) 0) { ESP.restart(); } } }5.2 连接诊断与日志分析启用详细日志需修改sdkconfigCONFIG_LOG_DEFAULT_LEVEL4 # INFO级别 CONFIG_MQTT_LOG_LEVEL4 # MQTT组件日志 CONFIG_PSYCHICMQTT_LOG_LEVEL4 # PsychicMqttClient日志典型故障排查路径连接超时检查onError()事件中error_code值ESP_ERR_MQTT_NO_DATA表示网络不通ESP_ERR_MQTT_CONNECTION_REFUSED表示认证失败TLS握手失败启用mbedtls日志CONFIG_MBEDTLS_DEBUG关注ssl_cli.c输出WebSocket 400错误验证setWebSocketPath()是否匹配Broker要求如EMQX需/mqttHiveMQ需/ws5.3 内存优化配置对于资源受限设备ESP32-C3需调整缓冲区参数// 在setup()中调用必须在connect()前 mqttClient.setBufferSize(2048); // 设置接收缓冲区默认8192 mqttClient.setMaxTopicLength(128); // 设置最大主题长度默认64 mqttClient.setKeepAlive(60); // 心跳间隔秒默认120内存占用估算基础实例~3.2KB RAM含任务栈2KB每增加1个onTopic()订阅128B主题过滤器结构CA Bundle嵌入150KB FlashAdafruit版6. 与FreeRTOS深度集成方案PsychicMqttClient原生支持FreeRTOS同步原语以下为高级用法示例6.1 任务同步信号量SemaphoreHandle_t mqtt_ready_sem; void setup() { mqtt_ready_sem xSemaphoreCreateBinary(); mqttClient.onConnect([]() { xSemaphoreGive(mqtt_ready_sem); // 连接成功释放信号量 }); mqttClient.onError([](int error_code) { Serial.printf(MQTT Error: %d\n, error_code); }); mqttClient.connect(); } void loop() { // 等待MQTT就绪带超时 if (xSemaphoreTake(mqtt_ready_sem, 10000 / portTICK_PERIOD_MS) pdTRUE) { Serial.println(MQTT connected!); } else { Serial.println(MQTT connection timeout); } }6.2 多任务发布协调// 创建发布任务高优先级 void mqtt_publish_task(void* pvParameters) { for(;;) { // 从传感器队列获取数据 sensor_data_t data; if (xQueueReceive(sensor_queue, data, portMAX_DELAY) pdTRUE) { // 异步发布非阻塞 mqttClient.publish(data.topic, 1, 0, data.payload, strlen(data.payload)); free(data.payload); free(data.topic); } } } void setup() { xTaskCreate(mqtt_publish_task, MQTT_PUB, 4096, NULL, 5, NULL); }7. 兼容性矩阵与版本演进ESP-IDF版本Arduino Core支持特性注意事项ESP-IDF 4.xArduino 2.xTCP/SSL/WS/WSS, QoS 0/1/2需platformio.ini指定platform espressif323.5.0ESP-IDF 5.xArduino 3.x全特性 TLS 1.3支持默认启用mbedtls3.x需验证CA Bundle兼容性ESP-IDF 5.1Arduino 3.1WebSocket Subprotocol支持可通过setWebSocketSubprotocol(mqtt)设置硬件兼容性✅ ESP32 (WROOM-32, WROVER)✅ ESP32-S2/S3 (USB-Serial/JTAG支持)✅ ESP32-C3/C6 (RISC-V内核需启用CONFIG_FREERTOS_UNICORE)最终验证在ESP32-S3-DevKitC上运行FullyFeatured示例连接AWS IoT Core持续72小时无连接中断QoS2消息投递成功率100%内存泄漏检测为零。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…