Azure IoT Hub嵌入式MQTT传输层深度解析

news2026/3/24 13:04:49
1. Azure IoT Hub MQTT 传输层深度解析嵌入式设备直连云平台的底层实现1.1 项目定位与工程价值iothub_mqtt_transport是 Microsoft Azure IoT SDK for Embedded C 中的核心传输模块专为资源受限的嵌入式设备如 STM32、nRF52、ESP32、RISC-V MCU设计提供符合 Azure IoT Hub 设备端协议规范的轻量级 MQTT 协议栈封装。它并非独立的 MQTT 客户端库而是面向 IoT Hub 服务特性的协议适配层——在标准 MQTT v3.1.1 基础上严格实现 Azure 要求的连接认证机制、主题命名空间、QoS 策略、消息属性编码及双向通信信道管理。该模块的工程价值体现在三个关键维度安全可信的连接建立强制使用 TLS 1.2 加密通道集成 X.509 证书链验证与 SAS Token 签名机制杜绝明文凭证传输低开销的协议语义映射将 IoT Hub 抽象的“设备孪生”“直接方法”“C2D 消息”等概念精准映射为 MQTT 的PUBLISH/SUBSCRIBE/UNSUBSCRIBE原语避免协议翻译层引入额外内存与 CPU 开销可裁剪的嵌入式友好架构采用纯 C 编写无 STL/RTTI/异常所有内存分配通过用户可重定向的malloc/free接口完成支持裸机Bare-metal、FreeRTOS、Zephyr 等多种 RTOS 环境且可关闭非必需功能如 MQTT 会话保持、遗嘱消息以节省 RAM。对于硬件工程师而言理解此模块即掌握嵌入式设备接入 Azure 生态的最短路径——无需自行实现复杂的 SAS Token 生成逻辑、主题拼接规则或属性序列化格式所有与云平台交互的“方言”均由该层统一处理。2. 核心协议机制IoT Hub 专属 MQTT 语义详解2.1 连接认证SAS Token 与 X.509 双轨制Azure IoT Hub 不接受原始 MQTTCONNECT报文中的用户名/密码字段而是要求在username字段中嵌入一个时效性签名令牌Shared Access Signature, SAS Token其格式为{iothub_hostname}/{device_id}/?api-version2021-04-12sr{uri_encoded_resource_uri}sig{uri_encoded_signature}se{expiry_epoch_time}skn{policy_name}iothub_mqtt_transport提供IoTHubTransport_MQTT_GetSasToken()函数接收以下参数并生成完整 Token参数类型说明resource_uriconst char*设备资源 URI格式为{hostname}/devices/{device_id}用于签名计算keyconst unsigned char*设备对称密钥Base64 解码后或私钥指针X.509 模式key_sizesize_t密钥字节数对称密钥或 0X.509 模式expiry_timeuint64_tUnix 时间戳秒级建议设为当前时间 3600 秒1 小时sas_token_bufferchar*输出缓冲区最小长度需 ≥ 512 字节sas_token_sizesize_t*输入为缓冲区大小输出为实际写入长度工程实践要点对称密钥模式下key必须是 Base64 解码后的原始二进制密钥32 字节 AES-256 密钥X.509 模式下key指向 PEM 格式私钥字符串首地址key_size设为 0模块内部调用 OpenSSL 或 mbedTLS 进行签名resource_uri必须严格匹配 IoT Hub 控制台中注册设备的 Hostname 与 Device ID任何字符差异如大小写、斜杠均导致 401 Unauthorized。2.2 主题命名空间设备端通信的“地址簿”IoT Hub 为每类通信定义了固定的主题前缀iothub_mqtt_transport封装了所有主题字符串的生成逻辑开发者无需手动拼接。关键主题如下表所示通信类型方向MQTT 主题模板说明QoS设备到云D2C消息上行devices/{device_id}/messages/events基础遥测数据通道1设备到云D2C消息带属性上行devices/{device_id}/messages/events/{property_bag}property_bag为 URL 编码的键值对如$.ctapplication%2Fjson1设备孪生Twin同步双向devices/{device_id}/twin订阅此主题接收 Twin 更新通知0设备孪生Twin查询上行devices/{device_id}/twin/GET/?$rid{request_id}发送 GET 请求获取当前 Twin0设备孪生Twin更新上行devices/{device_id}/twin/PATCH/properties/reported/?$rid{request_id}上报设备状态属性0直接方法Direct Method下行devices/{device_id}/methods/POST/{method_name}/?$rid{request_id}云平台调用设备方法的入口0C2D 消息Cloud-to-Device下行devices/{device_id}/messages/devicebound云平台下发的点对点消息1关键约束所有主题中的{device_id}必须与注册设备 ID 完全一致区分大小写$ridRequest ID为 1~128 字符的 ASCII 字符串推荐使用snprintf(buf, sizeof(buf), %lu, (unsigned long)tick_count)生成单调递增 ID属性Properties必须进行严格的 URL 编码空格→%20/→%2F→%3Diothub_mqtt_transport提供IoTHubTransport_MQTT_EncodeProperty()辅助函数。2.3 消息属性编码超越 Payload 的元数据通道IoT Hub 允许为每条 D2C 消息附加结构化属性Properties这些属性不进入 Payload而是作为 MQTTPUBLISH报文的User PropertyMQTT v5或Topic查询参数MQTT v3.1.1传递。iothub_mqtt_transport通过IOTHUB_MESSAGE_HANDLE结构体管理属性// 创建带属性的消息句柄 IOTHUB_MESSAGE_HANDLE message IoTHubMessage_CreateFromByteArray(payload, payload_size); if (message ! NULL) { // 添加系统属性自动编码 IoTHubMessage_SetContentType(message, application/json); IoTHubMessage_SetContentEncoding(message, utf-8); // 添加自定义属性键值对 IoTHubMessage_SetProperty(message, sensor_id, temp_001); IoTHubMessage_SetProperty(message, firmware_version, v2.1.0); // 发送内部自动拼接 topic 并编码属性 IoTHubTransport_MQTT_SendMessage(transport_handle, message, on_send_complete, context); }底层实现中IoTHubTransport_MQTT_SendMessage()会调用IoTHubMessage_GetPropertyCount()获取属性数量遍历所有属性调用IoTHubMessage_GetPropertyNameByIndex()和IoTHubMessage_GetPropertyValueByIndex()提取键值对每个键值执行 URL 编码拼接为key1value1key2value2格式将编码后字符串追加至基础主题devices/{id}/messages/events/后形成最终PUBLISH主题。此设计使属性成为轻量级元数据载体避免将 JSON Schema 信息混入业务 Payload提升消息解析效率。3. API 接口体系从初始化到消息收发的全流程控制3.1 传输句柄生命周期管理整个 MQTT 传输会话由IOTHUB_TRANSPORT_HANDLE句柄统一管理其创建与销毁遵循 RAII 原则// 1. 初始化传输配置 IOTHUB_TRANSPORT_CONFIG transport_config {0}; transport_config.hostname your-iot-hub.azure-devices.net; transport_config.device_id my-stm32-device; transport_config.protocol MQTT_PROTOCOL; // 固定为 MQTT transport_config.xio_handle xio_handle; // 底层网络 I/O 句柄见 3.2 // 2. 创建传输实例内部完成 TLS 初始化、内存池分配 IOTHUB_TRANSPORT_HANDLE transport_handle IoTHubTransport_MQTT_Create(transport_config); // 3. 启动连接异步触发 on_connection_status callback IoTHubTransport_MQTT_Start(transport_handle, on_connection_status, user_context); // 4. 使用完毕后释放资源自动断开连接、清理 TLS 上下文、释放内存 IoTHubTransport_MQTT_Destroy(transport_handle);IoTHubTransport_MQTT_Create()的关键输入xio_handle是一个抽象网络 I/O 接口由用户根据硬件平台实现其函数指针结构体定义如下typedef struct XIO_INSTANCE_TAG { int (*xio_open)(void* handle, ON_IO_OPEN_COMPLETE on_io_open_complete, void* on_io_open_complete_context); int (*xio_close)(void* handle, ON_IO_CLOSE_COMPLETE on_io_close_complete, void* on_io_close_complete_context); int (*xio_send)(void* handle, const void* buffer, size_t size, ON_SEND_COMPLETE on_send_complete, void* on_send_complete_context); int (*xio_dowork)(void* handle); // 必须周期性调用驱动 TLS 握手、心跳、重传 } XIO_INSTANCE;典型实现示例STM32 FreeRTOS LwIPxio_open→ 调用netconn_new(NETCONN_TCP)创建连接启动 TLS 握手mbedTLSssl_handshake()xio_send→ 将 buffer 写入netconn_write()设置NETCONN_COPY标志xio_dowork→ 在 FreeRTOSvApplicationTickHook()或独立任务中调用检查 TLS 状态、发送 MQTT PINGREQ、处理接收缓冲区。3.2 消息收发核心 API上行消息发送D2C// 异步发送回调通知结果 int result IoTHubTransport_MQTT_SendMessage( transport_handle, message_handle, // IOTHUB_MESSAGE_HANDLE on_send_complete, // void(*on_send_complete)(void* context, IOTHUB_CLIENT_RESULT result) user_context // 透传给回调的上下文指针 );result返回值IOTHUB_CLIENT_OK入队成功、IOTHUB_CLIENT_INVALID_ARG参数错误、IOTHUB_CLIENT_ERROR内部错误实际网络发送在xio_dowork()中异步完成on_send_complete在发送完成或失败时被调用若网络中断模块自动启用内存中消息队列可配置最大长度待重连后重发。下行消息接收C2D Direct Method下行消息通过注册回调函数接收// 注册 C2D 消息接收回调 IoTHubTransport_MQTT_SetMessageCallback( transport_handle, on_c2d_message_received, // void(*on_c2d_message_received)(IOTHUB_MESSAGE_HANDLE message, void* user_context) user_context ); // 注册直接方法回调需先调用 SetMethodCallbackEnabled(true) IoTHubTransport_MQTT_SetMethodCallback( transport_handle, on_direct_method_received, // METHOD_RETURN(*on_direct_method_received)(const char* method_name, const unsigned char* paylaod, size_t size, unsigned char** response_payload, size_t* response_size) user_context );on_c2d_message_received回调中可通过以下 API 提取消息元数据const char* topic IoTHubMessage_GetTopicName(message_handle); // 获取原始 MQTT 主题 const char* correlation_id IoTHubMessage_GetCorrelationId(message_handle); // C2D 消息的唯一 ID const char* lock_token IoTHubMessage_GetLockToken(message_handle); // 用于完成/放弃消息的令牌重要机制C2D 消息采用“锁-处理-完成”三阶段模型。设备必须在收到消息后 1 分钟内调用IoTHubTransport_MQTT_CompleteC2DMessage()或IoTHubTransport_MQTT_AbandonC2DMessage()否则 IoT Hub 将自动重新投递。此设计保障消息至少一次At-Least-Once投递语义。3.3 设备孪生Device Twin操作 API设备孪生是 IoT Hub 的核心功能iothub_mqtt_transport提供同步与异步两种操作模式// 1. 订阅 Twin 更新通知自动订阅 devices/{id}/twin IoTHubTransport_MQTT_SetTwinCallback( transport_handle, on_twin_update_received, // void(*on_twin_update_received)(const char* json_payload, size_t payload_size, void* user_context) user_context ); // 2. 主动获取当前 Twin发送 GET 请求 IoTHubTransport_MQTT_GetTwinAsync( transport_handle, on_twin_get_complete, // void(*on_twin_get_complete)(IOTHUB_CLIENT_RESULT result, const char* json_payload, size_t payload_size, void* user_context) user_context ); // 3. 上报设备状态属性PATCH IOTHUB_MESSAGE_HANDLE twin_report IoTHubMessage_CreateFromString({\properties\:{\reported\:{\temperature\:25.3,\uptime\:3600}}}); IoTHubTransport_MQTT_SendTwinReport( transport_handle, twin_report, on_twin_report_complete, user_context );on_twin_update_received回调接收的json_payload是完整的 Twin 文档包含desired与reported两个顶级对象。设备需解析 JSON提取desired中的指令如{fan_speed: 80}执行后将结果写入reported并调用SendTwinReport()上报。4. 嵌入式平台集成实战STM32H7 FreeRTOS mbedTLS 配置指南4.1 内存与线程配置iothub_mqtt_transport默认使用malloc/free在裸机或 RTOS 环境中必须重定向// 在 STM32CubeIDE 中于 main.c 定义 #include stdlib.h #include FreeRTOS.h #include semphr.h static StaticSemaphore_t malloc_mutex_buffer; static SemaphoreHandle_t malloc_mutex; void vApplicationMallocFailedHook(void) { configASSERT(0); } void *pvPortMalloc(size_t xWantedSize) { if (malloc_mutex NULL) { malloc_mutex xSemaphoreCreateMutexStatic(malloc_mutex_buffer); } if (xSemaphoreTake(malloc_mutex, portMAX_DELAY) pdTRUE) { void *ptr pvPortMallocRaw(xWantedSize); xSemaphoreGive(malloc_mutex); return ptr; } return NULL; } void vPortFree(void *pv) { if (xSemaphoreTake(malloc_mutex, portMAX_DELAY) pdTRUE) { vPortFreeRaw(pv); xSemaphoreGive(malloc_mutex); } }4.2 TLS 与网络栈对接mbedTLS 配置关键点// 初始化 SSL 上下文 mbedtls_ssl_init(ssl_ctx); mbedtls_ssl_config_init(ssl_conf); mbedtls_ctr_drbg_init(ctr_drbg); mbedtls_entropy_init(entropy); // 设置随机数种子 mbedtls_ctr_drbg_seed(ctr_drbg, mbedtls_entropy_func, entropy, NULL, 0); // 加载根证书Azure Global Root CA mbedtls_x509_crt_init(cacert); mbedtls_x509_crt_parse(cacert, (const unsigned char*)azure_root_ca_pem, strlen(azure_root_ca_pem)); // 配置 SSL mbedtls_ssl_config_defaults(ssl_conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT); mbedtls_ssl_conf_authmode(ssl_conf, MBEDTLS_SSL_VERIFY_REQUIRED); mbedtls_ssl_conf_ca_chain(ssl_conf, cacert, NULL); mbedtls_ssl_conf_rng(ssl_conf, mbedtls_ctr_drbg_random, ctr_drbg); mbedtls_ssl_setup(ssl_ctx, ssl_conf);4.3 FreeRTOS 任务调度设计推荐创建两个高优先级任务协同工作// 任务 1网络 I/O 驱动高优先级确保及时响应 void mqtt_io_task(void *pvParameters) { while (1) { // 驱动底层 xio_handle 工作 IoTHubTransport_MQTT_DoWork(transport_handle); // 检查连接状态触发重连逻辑 if (connection_state DISCONNECTED) { IoTHubTransport_MQTT_Start(transport_handle, ...); } vTaskDelay(pdMS_TO_TICKS(10)); // 10ms 周期 } } // 任务 2应用逻辑中优先级 void application_task(void *pvParameters) { static uint32_t last_send_ms 0; while (1) { if (xTaskGetTickCount() - last_send_ms pdMS_TO_TICKS(5000)) { // 构造遥测消息并发送 send_telemetry(); last_send_ms xTaskGetTickCount(); } vTaskDelay(pdMS_TO_TICKS(100)); } }IoTHubTransport_MQTT_DoWork()是模块的“心脏”必须被高频、稳定地调用建议 ≥ 10Hz。它负责TLS 握手状态机推进MQTT Keep-Alive 心跳包发送与超时检测接收缓冲区解析SUBACK,PUBACK,PUBLISH重传未确认的 QoS1 消息触发用户注册的各类回调。5. 故障诊断与性能调优5.1 常见连接失败原因分析现象根本原因解决方案on_connection_status返回IOTHUB_CLIENT_CONNECTION_UNAUTHENTICATEDSAS Token 签名错误或过期检查resource_uri拼写、密钥是否 Base64 解码、expiry_time是否已过期连接后立即断开IOTHUB_CLIENT_CONNECTION_NO_NETWORKTLS 握手失败验证根证书是否正确加载、设备时间是否准确TLS 依赖系统时间、防火墙是否放行 8883 端口on_send_complete返回IOTHUB_CLIENT_ERROR消息主题格式错误或属性编码非法使用IoTHubTransport_MQTT_EncodeProperty()处理属性避免手动拼接 URLC2D 消息重复接收未在 1 分钟内调用CompleteC2DMessage()在on_c2d_message_received中立即启动处理并在完成后显式调用完成 API5.2 内存占用优化策略禁用会话保持在IoTHubTransport_MQTT_Create()前设置transport_config.clean_session true避免存储SUBSCRIBE状态限制消息队列通过IoTHubTransport_MQTT_SetOption(transport_handle, OPTION_MAX_PENDING_MESSAGES, max_count)将待发消息队列限制为 5~10 条复用消息句柄对周期性遥测创建一个IOTHUB_MESSAGE_HANDLE并反复调用IoTHubMessage_SetByteArray()更新 Payload避免频繁malloc/free关闭日志定义NO_LOGGING宏移除所有LogError()调用节省 Flash 与 RAM。5.3 实时性保障措施心跳间隔调整默认 Keep-Alive 为 240 秒可缩短至 60 秒以更快发现网络中断IoTHubTransport_MQTT_SetOption(transport_handle, OPTION_KEEP_ALIVE, keep_alive_sec)QoS 策略选择对温度传感器等容忍丢失的数据使用 QoS0IoTHubMessage_SetOutputType(message, IOTHUBMESSAGE_OUTPUT_TYPE_QOS0)降低开销对固件升级指令等关键消息坚持 QoS1中断级发送若使用 DMA 网络接口可在xio_send中触发 DMA 传输on_send_complete在 DMA 中断服务程序中调用实现零拷贝。6. 与主流嵌入式生态的协同开发模式6.1 与 STM32CubeMX HAL 库集成在MX_I2C1_Init()后添加 TLS 初始化代码利用 HAL 提供的HAL_GetTick()替代裸机 SysTickuint32_t HAL_GetTick(void) { return xTaskGetTickCount(); // FreeRTOS 环境下 }6.2 与 Zephyr RTOS 的适配要点Zephyr 用户需实现zsock_connect()/zsock_send()封装的XIO_INSTANCE并注意使用k_work_submit(mqtt_work)替代裸机循环调用DoWork()通过CONFIG_MBEDTLS_TLS_C和CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA启用必要 mbedTLS 功能利用 Zephyr 的settings子系统持久化设备密钥与 Twin 状态。6.3 与 ESP-IDF 的 Wi-Fi 管理协同在wifi_event_handler_t中监听SYSTEM_EVENT_STA_GOT_IP事件此时调用IoTHubTransport_MQTT_Start()启动连接避免在 Wi-Fi 尚未就绪时发起 TLS 握手。7. 安全加固实践从开发到量产的全链路防护密钥存储绝不将对称密钥硬编码在 Flash 中。STM32H7 可利用 OTFDECOn-The-Fly Decryption模块加密存储密钥ESP32 推荐使用 eFuse 存储密钥哈希运行时通过 Secure Boot 验证固件签名所有 OTA 固件包必须由 Azure Key Vault 签名设备端使用mbedtls_pk_verify()验证签名后再烧录TLS 证书轮换通过设备孪生desired属性下发新根证书 PEM设备解析后动态调用mbedtls_x509_crt_parse()更新信任链防重放攻击SAS Token 的seexpiry字段必须基于设备 RTC 时间RTC 需由 NTP 服务器定期校准通过 Azure Time Series Insights 服务获取可信时间。当最后一行代码在 STM32H7 的main()函数中执行IoTHubTransport_MQTT_Start()LED 灯亮起的瞬间这颗微控制器便不再是孤立的硅片——它已获得 Azure IoT Hub 颁发的数字身份在全球物联网网络中拥有了自己的坐标与话语权。这种连接不是简单的数据管道而是嵌入式系统与云智能之间建立的、可验证、可审计、可演进的信任契约。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2443969.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;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…