---
type: study
status: active
created: 2026-09-10
updated: 2026-09-10
sensitivity: private
tags: [study, embedded, c, esp32, cores3]
sources:
  - "https://docs.espressif.com/projects/esp-idf/en/v5.5.1/esp32s3/api-guides/wifi.html"
  - "https://docs.espressif.com/projects/esp-idf/en/v5.5.1/esp32s3/api-reference/protocols/esp_http_client.html"
  - "https://docs.espressif.com/projects/esp-idf/en/v5.5.1/esp32s3/get-started/index.html"
---
# 从 Wi-Fi 到 HTTPS：一步一步判断联网状态

## 协议层次先摆正

```text
业务：采样上报、配置读取、设备命令
应用协议：HTTPS / MQTT / WebSocket（按场景选择）
安全与传输：TLS（需要时） / TCP（本路线所用方式）
网络：IP
接入：Wi-Fi
```

这张图限定本课程常用的 TCP 通信方式，不描述所有 HTTP 或物联网传输变体。BLE 通常从广播、连接、GATT 服务和特征值学习，是独立分支；不能把 BLE 当成 MQTT 必须经过的一层。ESP32-S3 的蓝牙方向是 BLE，不能假定支持经典蓝牙 SPP。[ESP32-S3 入门能力说明](https://docs.espressif.com/projects/esp-idf/en/v5.5.1/esp32s3/get-started/index.html)

## “已联网”要拆成多个状态

| 状态 | 证据 | 此时不能推断什么 |
| --- | --- | --- |
| 正在连 Wi-Fi | 发起连接 | 尚未与 AP 建链 |
| Wi-Fi 已连接 | `WIFI_EVENT_STA_CONNECTED` | 不代表已经拿到 IP |
| IP 就绪 | `IP_EVENT_STA_GOT_IP` | 不代表域名解析和服务可达 |
| HTTPS 交互成功 | TLS 校验、HTTP 状态与响应完整 | 不代表业务一定接受了请求 |
| 业务成功 | 校验业务响应字段 | 才可按约定更新设备业务状态 |

Wi-Fi 事件与获得 IP 的处理顺序见 [ESP-IDF Wi-Fi Driver](https://docs.espressif.com/projects/esp-idf/en/v5.5.1/esp32s3/api-guides/wifi.html)。表中的服务和业务状态是本学习项目进一步拆分的设计。

## 第一个 Java 接口只做一件事

先设计一个**尚未实现的练习接口** `POST /api/lab/devices/{deviceId}/telemetry`，接收一条人工采样，返回是否接受及服务端接收时间。正式集成前再与实际后端契约对齐。

设备端工作顺序：等待网络就绪，构造有大小上限的 JSON，发请求，检查状态码，按长度读取响应，最后释放请求资源。TLS 校验应信任正确 CA 并校验主机名；证书有效期检查还依赖合理的设备时间。[ESP HTTP Client](https://docs.espressif.com/projects/esp-idf/en/v5.5.1/esp32s3/api-reference/protocols/esp_http_client.html)

`localhost` 在设备上指设备自己。访问 Mac 上的服务，要使用设备能够路由到的地址，并检查服务监听地址、同网段/路由和防火墙。

## 错误恢复是应用状态机

本项目建议把错误分成：无网络、DNS/TLS 失败、超时、服务拒绝、响应不合法。每类给出可观察状态，避免统一显示“请求失败”。

临时连接失败可用带抖动和上限的退避重试；认证失败先修正凭据或配置，不能高速无限重连。断线后清理失效会话，拿到新 IP 后按状态重建连接。事件回调只推进状态或投递工作，不在其中等待长 HTTP 请求。

重复上报使用应用层唯一键去重，例如本课程草案中的 `deviceId + bootId + sequence`。网络超时只表示没有收到确定结果，不能推断服务器没处理。

## 数据字段先定义单位与有效性

练习 JSON 建议包含 `schemaVersion`、`bootId`、`sequence`、`uptimeMs`、`value`、`valid`。`value` 的测量单位由具体传感器契约定义；失败时允许缺省/空值，并保持 `valid=false`，不要虚构读数。

`uptimeMs` 是开机经过时长，不是世界时间。没有校准时钟时，服务端记录接收时间；不能把开机秒数当 Unix 时间写进数据库。

## 验收场景

- 正常请求：设备与服务端能对应同一次上报。
- Wi-Fi 断开、恢复：显示断线状态，恢复后再上报，UI 继续响应。
- 服务超时或返回 500：重试有上限/退避，内存没有持续下降。
- 返回 401、错误 JSON、超长响应：分类处理，不进入成功状态。
- 相同请求重发：服务端去重结果明确。

这些都是待执行实验；本文没有建立服务器或连接任何实际云服务。

---

[[Study/embedded-cores3/CoreS3学习入口|返回学习入口]] · [[Study/embedded-cores3/CoreS3资料来源与版本|来源与版本]]
