# ESP_MIJIE **Repository Path**: JLLAYUN/esp_-mijie ## Basic Information - **Project Name**: ESP_MIJIE - **Description**: 使用esp接入米家 - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-13 - **Last Updated**: 2026-09-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ESP32-C3 通过巴法云接入米家(MQTT) 基于 ESP-IDF + ESP-MQTT,把 ESP32-C3 变成一个可在「米家 App / 小爱同学」里控制的**开关**设备。 设备端只需连巴法云的 MQTT 服务器,米家侧的协议转换由巴法云完成。 | Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-S2 | ESP32-S3 | | ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | ## 一、巴法云平台侧准备 1. 注册/登录 [巴法云控制台](https://cloud.bemfa.com),在「MQTT 设备云」**新建一个主题**。 2. 记下控制台里的**私钥**(后续作为 MQTT 的 Client ID)。 3. 主题名必须**以三位设备类型码结尾**,否则米家识别不到: | 后三位 | 设备类型 | | 后三位 | 设备类型 | | --- | --- | --- | --- | --- | | 001 | 插座 | | 005 | 空调 | | 002 | 灯 | | 006 | **开关**(本工程默认) | | 003 | 风扇 | | 009 | 窗帘 | | 004 | 传感器 | | | | 本工程默认主题 `switch006`(开关)。主题名只能包含字母、数字和下划线。 4. 米家 App →「我的」→「其他平台设备」→「添加」→ 找到「巴法」→ 输入巴法云账号,设备会自动同步进来。 ## 二、服务器与协议要点 - 服务器:`bemfa.com`,端口 `9501`(TCP 明文)/ `9503`(TLS 1.2);新地址 `mqttv2.bemfa.com` 端口 `2023`/`2024`。 - **只支持 MQTT 3.1.1**。原工程是 mqtt5 示例,已改为 `MQTT_PROTOCOL_V_3_1_1`,`sdkconfig.defaults` 中也关闭了 `CONFIG_MQTT_PROTOCOL_5`。 - **只支持 QoS 0/1**,使用 QoS2 会被强制下线,代码里统一用 QoS1。 - **Client ID = 私钥**,用户名/密码留空。私钥填错会连得上但收不到消息。 - 主题后缀语义: - `` :订阅它接收控制指令 - `/up` :只更新云端数据(**上报状态用这个**,避免自发自收) - `/set`:推送给该主题的所有订阅者 - 开关类设备的负载:`{"on":true}` / `{"on":false}`。 ## 二之二、接 SG90 舵机(可选) `menuconfig` → `巴法云 (Bemfa) 配置` → `输出方式` 选 **SG90 舵机(LEDC 50Hz PWM)**,代码会用 LEDC 在配置的 GPIO 上输出 50Hz PWM。 | SG90 线色 | 接法 | | --- | --- | | 棕 / 黑 | GND | | 红 | **5V(必须外部供电,不要从 C3 的 3V3 取)** | | 橙 / 黄 | 信号 → `输出 GPIO`(默认 GPIO8) | **外部 5V 与 ESP32-C3 必须共地。** 相关配置项: | 配置项 | 默认 | 说明 | | --- | --- | --- | | `BEMFA_SERVO_ON_US` | 1150 | 「开」时脉宽,约 0~180° 对应 500~2500us | | `BEMFA_SERVO_OFF_US` | 1950 | 「关」时脉宽 | | `BEMFA_SERVO_HOLD_MS` | 0 | 拨动墙壁开关用:保持该毫秒后自动回到 OFF 位置,0 = 一直保持 | 脉宽偏差大时(舵机抖、角度不对)微调这两个值即可,SG90 个体差异较大。 ## 三、配置与编译 ```bash idf.py set-target esp32c3 idf.py menuconfig ``` 需要配置两处: - `Example Connection Configuration`:Wi-Fi SSID / 密码 - `巴法云 (Bemfa) 配置`: - `BEMFA_BROKER_URI`:默认 `mqtt://bemfa.com:9501` - `BEMFA_PRIVATE_KEY`:**巴法云私钥** - `BEMFA_TOPIC`:默认 `switch006`,须与控制台一致 - `BEMFA_OUTPUT`:输出方式,`GPIO 电平` 或 `SG90 舵机` - `BEMFA_RELAY_GPIO`:输出 GPIO,默认 `8`(C3 开发板板载 LED / 舵机信号线) - `BEMFA_RELAY_ACTIVE_HIGH`:低电平触发的继电器模块取消勾选(仅 GPIO 模式) ```bash idf.py -p PORT flash monitor ``` ## 四、运行流程 1. 连 Wi-Fi → MQTT 3.1.1 连接巴法云(Client ID = 私钥) 2. 订阅 `switch006`,并立即向 `switch006/up` 上报一次当前状态 3. 收到 `{"on":true}` → 拉高/拉低 GPIO → 回传 `{"on":true}` 到 `switch006/up` 4. 断开后 ESP-MQTT 自动重连(5s 重试) 串口日志示例: ``` I (3621) bemfa: 主题: 订阅=switch006 上报=switch006/up I (3621) bemfa: 开关 -> OFF (GPIO8 = 0) I (5119) bemfa: 已连接巴法云 I (5139) bemfa: 上报 switch006/up -> {"on":false} (msg_id=53118) I (5209) bemfa: 订阅成功 msg_id=41391 I (8039) bemfa: 收到 switch006 : {"on":true} I (8049) bemfa: 开关 -> ON (GPIO8 = 1) I (8059) bemfa: 上报 switch006/up -> {"on":true} (msg_id=41392) ``` ## 五、排障 | 现象 | 原因 | | --- | --- | | `Connecting to myssid...` + `disconnected 201` | 没配 Wi-Fi(201 = NO_AP_FOUND)。去 menuconfig 填 SSID/密码;ESP32-C3 只支持 2.4GHz | | 连上就断 / 反复重连 | 开了 MQTT v5 或用了 QoS2;检查 `CONFIG_MQTT_PROTOCOL_5` 为 `n` | | 连得上但收不到指令 | 私钥(Client ID)填错;或订阅的主题名与控制台不一致 | | 米家搜不到设备 | 主题名后三位不是 001/002/003/004/005/006/009 | | 米家状态不刷新 | 设备没有向 `/up` 上报过状态 | | TLS 失败 | 9503 端口需校验证书,本工程用明文 9501,不需要证书 | ## 六、其他说明 - 改成灯(002)只需把主题改成 `xxx002`,并用 `json_get(payload, "bri", &len)` 取出 `bri` / `tv` / `r,g,b`,再用 LEDC 输出 PWM。 - 指令解析用的是内置的 `json_get()`(扁平 JSON 取值),**不依赖 cJSON**,因此 IDF v5.x / v6.x 都能编译(`json` 组件在 IDF v6 已被移除)。 - `main/mosquitto.org.crt` 与 `pytest_mqtt5.py` 是原 mqtt5 示例遗留物,本工程不再使用,可删除。