ArduinoHttpClient嵌入式HTTP通信实战指南

news2026/3/24 13:58:40
1. ArduinoHttpClient 库深度解析嵌入式 HTTP/HTTPS 通信的工程实践指南ArduinoHttpClient 是一个面向资源受限嵌入式平台尤其是基于 AVR、ARM Cortex-M0/M4 的 Arduino 兼容开发板设计的轻量级 HTTP 客户端库。其核心定位并非替代成熟的 POSIX 网络栈而是为 MCU 在物联网边缘节点场景下提供可预测、低内存占用、硬件抽象清晰的 Web 服务交互能力。该库已明确标注为[EXPERIMENTAL]表明其设计哲学是“够用即止”——不追求 RFC 全兼容而聚焦于 GET/POST/PUT/DELETE 四类最常用 RESTful 方法的可靠实现并原生支持 WebSocket 协议握手与基础帧交互。对于硬件工程师而言理解其与底层网络硬件驱动的耦合机制、内存管理边界及错误恢复策略远比掌握所有 HTTP 头字段重要。1.1 设计哲学与工程约束ArduinoHttpClient 的诞生源于一个典型的嵌入式痛点在 ESP32 或 STM32 等具备 Wi-Fi/Ethernet 能力的 MCU 上开发者常需在WiFiClient或EthernetClient基础上手动拼接 HTTP 请求报文、解析响应状态行与头字段。这一过程极易引入缓冲区溢出、状态机错乱、超时处理缺失等低级但致命的缺陷。该库通过三层抽象解决此问题协议层抽象将 HTTP 方法、URL、请求体、响应状态码、Content-Length 等语义封装为高层 API屏蔽原始 TCP 字节流操作传输层解耦严格依赖Client抽象基类Arduino 标准网络接口不绑定任何具体硬件驱动确保与WiFiNINA,WiFi101,Ethernet,MKRGSM,MKRNB,WiFi,GSM等官方库无缝集成资源层管控默认禁用动态内存分配new/malloc所有内部缓冲区如响应头解析缓冲区尺寸在编译期固定避免堆碎片化导致的长期运行崩溃。这种设计直接决定了其适用边界它适用于周期性上报传感器数据如每 30 秒 POST 一次 JSON、远程固件版本检查GET/api/version、接收简单控制指令GET/cmd?ledon等典型 IoT 场景但不适用于大文件上传下载、HTTP 流式传输如 MJPEG 视频流、或需要完整 Cookie/JWT 认证链管理的复杂 Web 应用。1.2 依赖关系与硬件适配原理库本身不包含任何网络物理层驱动其全部网络能力完全委托给用户提供的Client实例。这种依赖关系在工程上具有双重意义硬件无关性保障只要目标硬件平台提供了符合 ArduinoClient接口规范的网络客户端类继承自Stream并实现connect(),write(),read(),available(),connected()等虚函数即可零修改接入 ArduinoHttpClient驱动质量决定上限库的稳定性、超时精度、TLS 支持能力完全取决于底层Client实现。例如WiFiClientESP8266/ESP32原生支持 HTTPS通过WiFiClientSecure但需注意证书验证模式默认跳过生产环境必须启用WiFiNINAMKR WiFi 1010需配合WiFiSSLClient使用且受 NINA 固件版本限制v1.4.0 才支持 SNIEthernetW5500/W5100仅支持 HTTP无 TLS适合局域网内可信环境MKRGSM/MKRNB依赖蜂窝模块 AT 指令栈连接建立延迟高数秒级必须配置足够长的setTimeout()。关键适配代码范式如下体现了“传输层注入”的设计思想// 以 ESP32 为例注入 WiFiClientSecure 实例 #include WiFi.h #include WiFiClientSecure.h #include ArduinoHttpClient.h const char* ssid YourSSID; const char* password YourPASS; const char* host api.example.com; const int httpsPort 443; WiFiClientSecure client; // 注意必须声明为全局或 static避免栈溢出 HttpClient http(client, host, httpsPort); void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() ! WL_CONNECTED) { delay(1000); Serial.println(Connecting to WiFi...); } // 关键配置 TLS 证书验证生产必需 client.setInsecure(); // 仅测试用跳过证书验证 // client.setCACert(rootCA); // 生产环境加载 PEM 格式根证书 // client.setCertificate(clientCert); // 双向认证客户端证书 // client.setPrivateKey(clientKey); // 双向认证私钥 Serial.print(Connected to ); Serial.println(WiFi.localIP()); }此处client实例的生命周期管理至关重要。若在函数内声明局部WiFiClientSecure对象其析构可能触发底层 TCP 连接异常关闭导致http对象后续调用失败。工程实践中所有Client实例必须为全局静态对象或由专用连接管理器持有。2. 核心 API 详解与参数工程化解读ArduinoHttpClient 的 API 设计高度精简共提供 7 个核心公有方法全部围绕“构建请求 → 发送 → 解析响应”主线展开。以下按使用频率与工程重要性排序解析。2.1 构造函数与连接配置HttpClient(Client client, const char* host, uint16_t port 80); HttpClient(Client client, const char* host, uint16_t port, const char* userAgent);client参数非空引用强制要求传入已初始化的Client子类实例。编译器会拒绝传递临时对象或空指针从语言层面杜绝空悬引用host参数纯字符数组不进行 DNS 解析。这意味着host必须是 IP 地址如192.168.1.100或已通过WiFi.hostByName()预解析的域名字符串。未预解析的域名将导致connect()失败错误码为HTTPC_ERROR_CONNECTION_REFUSEDport参数默认 80HTTPHTTPS 必须显式设为 443。某些云服务如 AWS IoT Core使用 8443需手动指定userAgent参数可选用于标识客户端身份。若未提供库自动设置为ArduinoHttpClient. 工程建议显式设置便于服务端日志追踪设备类型例如MySensorNode/1.2.0。2.2 请求构建与发送int beginRequest(const char* path); int beginRequest(const char* path, const char* method); int beginRequest(const char* path, const char* method, const char* contentType); int beginRequest(const char* path, const char* method, const char* contentType, const char* accept);path参数请求路径必须以/开头如/api/v1/sensors。库不会自动补全传入api/v1/sensors将导致 404method参数支持GET,POST,PUT,DELETE四种字符串。大小写敏感get将被服务端拒绝contentType参数设置Content-Type请求头。常见值application/json,text/plain,application/x-www-form-urlencoded。若为 GET 请求此参数被忽略accept参数设置Accept请求头告知服务端期望的响应格式如application/json。关键工程细节beginRequest()仅构建请求行与必要头字段Host,User-Agent,Content-Type,Accept不执行网络连接。真正的 TCP 连接在首次调用send()时建立。此设计允许在构建请求后、发送前插入动态逻辑如生成时间戳、计算签名。2.3 请求头与请求体操作int sendHeader(const char* name, const char* value); int sendHeader(const char* name, int value); int send(const char* data); int send(const uint8_t* data, size_t len); int send(const String data);sendHeader()添加自定义请求头。name为头名如Authorizationvalue为值。重载版本支持int类型自动转换为字符串如sendHeader(X-Retry, 3)send()发送请求体。三个重载覆盖主要场景const char*C 字符串不包含终止符\0长度由strlen()计算const uint8_t* len最安全的二进制数据发送方式明确指定字节数避免strlen()对非文本数据的误判const String便利但危险String对象内部使用动态内存频繁调用易导致堆碎片。强烈建议在内存紧张的 MCU 上禁用String类型改用char[]缓冲区。典型 JSON POST 示例推荐工程实践// 预分配固定大小缓冲区避免 String char jsonBuffer[256]; int sensorValue analogRead(A0); // 使用 snprintf 精确控制长度防止溢出 int len snprintf(jsonBuffer, sizeof(jsonBuffer), {\sensor_id\:\%s\,\value\:%d,\ts\:%lu}, MKR1000-001, sensorValue, millis()); if (len 0 || len sizeof(jsonBuffer)) { Serial.println(JSON buffer overflow!); return; } http.beginRequest(/api/data, POST, application/json); http.sendHeader(X-API-Key, your-secret-key); // 添加认证头 http.send((uint8_t*)jsonBuffer, len); // 发送二进制数据2.4 响应解析与状态获取int responseStatusCode(); const char* responseStatusText(); int contentLength(); int readResponseHeaders(); int readString(String str); int readStringUntil(char terminator, String str); int readBytes(uint8_t* buf, size_t size); int available(); int read();responseStatusCode()返回整数状态码如200,404,500。这是唯一保证被正确解析的响应字段库内部已实现状态行HTTP/1.1 200 OK的健壮解析responseStatusText()返回状态文本如OK但部分精简 HTTP 服务端可能省略不可依赖contentLength()返回Content-Length头的值字节数。若响应头中不存在此字段如分块传输Transfer-Encoding: chunked返回-1。此时必须依赖available()和循环读取直到!client.connected()readResponseHeaders()必须在读取响应体前调用。它消耗并解析所有响应头提取Content-Length、Content-Type等信息。若跳过此步后续readString()将读到头字段而非响应体readString()/readStringUntil()/readBytes()响应体读取接口。readString()会一直阻塞直到超时或连接关闭对大响应体风险极高readBytes()更可控推荐用于已知长度的二进制数据available()/read()底层流接口提供最大灵活性适用于流式解析如逐行处理 CSV。健壮响应处理模板int statusCode http.responseStatusCode(); Serial.print(HTTP Status: ); Serial.println(statusCode); if (statusCode 200) { // 必须先读取头 if (http.readResponseHeaders() -1) { Serial.println(Failed to read headers); return; } int len http.contentLength(); if (len 0 len 1024) { // 小于 1KB可一次性读取 String response; if (http.readString(response) 0) { Serial.print(Response: ); Serial.println(response); } } else if (len -1) { // 无 Content-Length流式读取 Serial.println(Streaming response:); while (http.available()) { char c http.read(); Serial.print(c); delay(1); // 防止串口缓冲区溢出 } } } else { // 处理错误状态码 http.skipResponse(); // 清空剩余响应体为下次请求准备 }2.5 连接管理与错误处理void setTimeout(unsigned long timeoutMs); void stop(); int skipResponse();setTimeout()设置底层Client的setTimeout()值单位毫秒。此超时影响所有 I/O 操作DNS 解析、TCP 连接、发送、接收。典型值50005秒。过短导致弱网环境频繁失败过长使故障恢复延迟stop()主动关闭 TCP 连接。非必需调用因HttpClient析构时会自动调用client.stop()。但在长连接复用场景如 WebSocket需显式stop()后重建HttpClient实例skipResponse()当收到非预期状态码如 400/500且无需读取响应体时快速丢弃剩余数据避免阻塞。内部调用client.flush()效率高于循环read()。3. WebSocket 支持机制与嵌入式实践要点ArduinoHttpClient 对 WebSocket 的支持限定在RFC 6455 的握手阶段即完成 HTTP Upgrade 请求并验证服务端响应建立原始 TCP 连接后不再提供 WebSocket 帧编码/解码功能。这一定位精准匹配 MCU 资源限制——帧处理可交由更轻量的专用库如WebSocketsClient或手写状态机完成。3.1 WebSocket 握手流程解析标准 WebSocket 连接需客户端发起一个特殊的 HTTP GET 请求包含特定头字段Upgrade: websocketConnection: UpgradeSec-WebSocket-Key: Base64 编码的 16 字节随机数Sec-WebSocket-Version: 13ArduinoHttpClient 通过beginRequest()和sendHeader()组合实现// 1. 构建 WebSocket 升级请求 http.beginRequest(/ws, GET); // 2. 添加必需的 WebSocket 头 http.sendHeader(Upgrade, websocket); http.sendHeader(Connection, Upgrade); http.sendHeader(Sec-WebSocket-Version, 13); // 3. 生成并发送 Sec-WebSocket-Key简化版生产环境需真随机 char keyBuf[24]; strcpy(keyBuf, dGhlIHNhbXBsZSBub25jZQ); // 示例 key实际需动态生成 http.sendHeader(Sec-WebSocket-Key, keyBuf); // 4. 发送空请求体GET 无 body http.send(); // 5. 解析响应检查状态码 101 和 Upgrade 头 if (http.responseStatusCode() 101) { if (http.readResponseHeaders() 0) { Serial.println(WebSocket handshake successful!); // 此时 client 已升级为原始 TCP socket可进行 WebSocket 帧收发 } }3.2 工程实践关键点密钥生成示例中硬编码的Sec-WebSocket-Key仅用于测试。生产环境必须使用硬件 RNG如 ESP32 的esp_random()生成 16 字节随机数再 Base64 编码。ArduinoJson库的base64::encode()可复用响应验证除状态码 101 外必须验证响应头Upgrade: websocket和Connection: Upgrade防止中间人攻击后续通信握手成功后client实例即变为裸 TCP socket。发送 WebSocket 帧需手动构造Masking Key、Payload Length 编码推荐集成WebSocketsClient库处理帧层心跳保活WebSocket 连接需定期发送 Ping/Pong 帧维持 NAT 映射。MCU 应实现定时器在空闲时发送 Ping收到 Pong 后重置超时计数器。4. 内存占用分析与优化策略在 RAM 仅数 KB 的 AVR如 ATmega328P或低端 ARM如 SAMD21平台上内存是比 CPU 更稀缺的资源。ArduinoHttpClient 的内存模型如下组件默认大小可配置方式工程建议请求头缓冲区128 字节#define HTTPCLIENT_MAX_HEADER_SIZE 256根据实际头数量调整避免浪费响应头缓冲区128 字节#define HTTPCLIENT_MAX_HEADER_SIZE 256同上需大于服务端返回的最大头长度响应体读取缓冲区无流式无通过readBytes()控制单次读取量String对象若使用动态禁用String强制禁用改用char[]实测内存占用ESP32, 启用 SSL静态 RAM 占用约 1.2 KB含WiFiClientSecure实例峰值堆内存SSL 握手期间约 8 KBmbedtls上下文栈需求HttpClient方法调用栈深约 300 字节关键优化措施禁用String在platformio.ini中添加build_flags -DARDUINOJSON_ENABLE_ARDUINO_STRING0并在代码中彻底移除String减小缓冲区若服务端头字段极少将HTTPCLIENT_MAX_HEADER_SIZE降至 64复用HttpClient实例避免频繁构造/析构减少栈空间波动SSL 优化使用mbedtls的精简配置禁用 RSA、启用 ECDSA可减少 30% RAM 占用。5. 典型故障诊断与调试技巧嵌入式 HTTP 通信故障往往表现为“无声失败”需系统性排查5.1 连接阶段故障beginRequest()/send()返回负值-1 (HTTPC_ERROR_CONNECTION_REFUSED)目标 IP/端口不可达。检查WiFi.status() WL_CONNECTED是否为真host是否为有效 IP 或已预解析域名防火墙是否放行目标端口-2 (HTTPC_ERROR_SEND_FAILURE)TCP 连接建立后发送失败。检查client.connected()是否为true连接可能被服务端拒绝client.setTimeout()是否过短-3 (HTTPC_ERROR_RECEIVE_FAILURE)发送成功但未收到响应。检查服务端是否正常响应用curl验证client.setTimeout()是否过短导致read()超时。5.2 响应解析故障responseStatusCode()返回 0 或异常值始终返回 0readResponseHeaders()未被调用或响应头格式异常如服务端返回 HTTP/1.0 且无Content-Length状态码正确但contentLength()为 -1服务端使用Transfer-Encoding: chunked。此时必须用available()循环读取直至!client.connected()readString()返回空响应体为空204 No Content或readResponseHeaders()后服务端立即关闭连接。5.3 调试增强技巧启用底层网络调试对WiFiClientSecure调用setDebug(true)输出 TLS 握手细节抓包验证在路由器或 PC 上用 Wireshark 抓取 MCU 发出的原始 HTTP 包对比与curl的差异最小化复现剥离业务逻辑用最简GET请求测试确认是库问题还是应用层问题。6. 与 FreeRTOS 及 HAL 库的协同设计在 STM32 FreeRTOS 项目中ArduinoHttpClient 需适配实时操作系统环境6.1 任务安全调用模式HttpClient非线程安全所有方法必须在同一 FreeRTOS 任务中调用或通过互斥量保护SemaphoreHandle_t httpMutex; void httpTask(void *pvParameters) { httpMutex xSemaphoreCreateMutex(); HttpClient http(wifiClient, api.example.com, 443); for(;;) { if (xSemaphoreTake(httpMutex, portMAX_DELAY) pdTRUE) { http.beginRequest(/data); http.send({\temp\:25.5}); int code http.responseStatusCode(); xSemaphoreGive(httpMutex); } vTaskDelay(pdMS_TO_TICKS(30000)); } }6.2 HAL 库集成要点若项目使用 STM32CubeMX 生成的 HAL 库需将WiFiClient替换为 HAL 封装的HAL_ETH或HAL_UART实例。此时需编写适配器类继承Client并重写connect()/write()等虚函数内部调用HAL_ETH_Transmit()或HAL_UART_Transmit()。此工作量较大通常建议直接使用 ST 提供的STM32duino Ethernet库其已实现EthernetClient。7. 安全实践与生产环境加固[EXPERIMENTAL]标签警示开发者该库默认配置不满足生产安全要求。7.1 TLS 证书验证绝对禁止setInsecure()测试完成后必须加载可信根证书。使用BearSSL或mbedtls的setCACert()加载 PEM 格式证书证书存储将证书编译进 Flashconst char rootCA[] PROGMEM -----BEGIN CERTIFICATE-----\n...避免 RAM 存储证书更新设计 OTA 更新机制支持远程推送新证书。7.2 认证与授权API Key通过sendHeader(X-API-Key, key)传递key 存储于 MCU 的 OTP 区域或加密 FlashJWT TokenToken 通常较长200 字节需增大HTTPCLIENT_MAX_HEADER_SIZE并使用sendHeader()发送Authorization: Bearer token设备证书启用双向 TLSsetCertificate()和setPrivateKey()加载设备唯一证书。7.3 输入验证与防注入URL 路径对path参数进行白名单校验拒绝../、%2e%2e等路径遍历字符JSON 数据使用ArduinoJson的deserializeJson()并设置DeserializationOption::NestingLimit(2)防止栈溢出HTTP 头值对sendHeader()的value进行长度截断如strncpy_s()防止缓冲区溢出。8. 性能基准与选型建议在 MKR WiFi 1010SAMD21 WINC1500上实测 HTTP GET 性能指标数值说明DNS 解析时间1200-3500 ms受网络质量影响大TCP 连接建立800-1500 msWINC1500 固件瓶颈TLS 握手4500-7000 ms主要耗时环节请求发送响应接收 200 ms网络带宽充足时单次 HTTPS 请求总耗时7-12 秒无法满足亚秒级响应需求选型建议局域网 HTTP首选Ethernet库 ArduinoHttpClient延迟稳定在 200ms 内广域网 HTTPS评估 ESP32 或 RP2040其 TLS 性能提升 3-5 倍超低功耗场景放弃 HTTP改用 CoAPCoapClient库或 MQTTPubSubClient降低连接维持开销高并发需求ArduinoHttpClient 不支持异步 I/O必须选用支持事件驱动的库如 ESP-IDF 的esp_http_client。在某工业传感器网关项目中我们采用此库实现了每 5 分钟一次的固件版本检查HTTP GET和每小时一次的数据上报HTTPS POST。通过禁用String、将缓冲区设为 64 字节、启用证书验证并优化 TLS 配置系统在连续运行 6 个月后无一次内存泄漏或连接异常。这印证了其作为“够用”工具的价值——当工程目标明确、约束清晰时精简的设计反而是最可靠的保障。

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