# ESP8266连接Blinker服务数据透传 **Repository Path**: Guard_Byte/esp8266_blinker_demo ## Basic Information - **Project Name**: ESP8266连接Blinker服务数据透传 - **Description**: ESP8266连接Blinker服务数据上云与app透传控制demo - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-10 - **Last Updated**: 2026-05-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ESP8266 Blinker WiFi 串口通信协议 ## 架构概览 ``` ┌──────────┐ 串口(UART 115200) ┌──────────────┐ WiFi/MQTT ┌──────────┐ │ MCU │ ◄────────────────────► │ ESP8266 │ ◄────────────► │ Blinker │ │ (STM32等)│ $key:value\n │ (本项目) │ │ 云平台 │ └──────────┘ └──────────────┘ └──────────┘ ``` ## 串口协议格式 - **统一格式**: `$key:value\n` - **波特率**: 115200 - **解析规则**: 首字符 `$` 为有效行起始,冒号 `:` 分隔键值,换行 `\n` 结束 - **最大行长**: 64 字节(含 `$` 和 `\n`) --- ## 一、Blinker App → ESP8266 → MCU(下行数据) 用户在Blinker App操作控件,ESP8266收到MQTT消息后通过串口转发给MCU。 ### 1.1 按钮控件(BlinkerButton) | Blinker组件 | 串口Key | value范围 | 说明 | |-------------|---------|-----------|------| | Button_1 (B1) | `B1` | `on` / `off` | 支持开关状态,ESP8266控制LED+回传状态 | | Button_2 (B2) | `B2` | `on` / `off` / 其他 | 透传按钮状态 | | Button_3 (B3) | `B3` | `on` / `off` / 其他 | 透传按钮状态 | | Button_4 (B4) | `B4` | `on` / `off` / 其他 | 透传按钮状态 | | Button_5 (B5) | `B5` | `on` / `off` / 其他 | 透传按钮状态 | | Button_6 (B6) | `B6` | `on` / `off` / 其他 | 透传按钮状态 | | Button_7 (B7) | `B7` | `on` / `off` / 其他 | 透传按钮状态 | | Button_8 (B8) | `B8` | `on` / `off` / 其他 | 透传按钮状态 | **示例**: ``` $B1:on\n // 用户按下B1按钮(开) $B3:off\n // 用户按下B3按钮(关) $B5:tap\n // 用户点击B5按钮 ``` ### 1.2 数值控件(BlinkerNumber) | Blinker组件 | 串口Key | value范围 | 说明 | |-------------|---------|-----------|------| | NumberData_1 (N1) | `N1` | 浮点数字符串 | 数值滑块/输入 | | NumberData_2 (N2) | `N2` | 浮点数字符串 | 数值滑块/输入 | | NumberData_3 (N3) | `N3` | 浮点数字符串 | 数值滑块/输入 | | NumberData_4 (N4) | `N4` | 浮点数字符串 | 数值滑块/输入 | | NumberData_5 (N5) | `N5` | 浮点数字符串 | 数值滑块/输入 | | NumberData_6 (N6) | `N6` | 浮点数字符串 | 数值滑块/输入 | | NumberData_7 (N7) | `N7` | 浮点数字符串 | 数值滑块/输入 | | NumberData_8 (N8) | `N8` | 浮点数字符串 | 数值滑块/输入 | | NumberData_9 (N9) | `N9` | 浮点数字符串 | 数值滑块/输入 | | NumberData_A (NA) | `NA` | 浮点数字符串 | 数值滑块/输入 | **示例**: ``` $N1:25.5\n // N1数值设为25.5 $N7:100\n // N7数值设为100 $NA:3.14\n // NA数值设为3.14 ``` ### 1.3 功能按钮 | Blinker组件 | 串口Key | 触发方式 | 说明 | |-------------|---------|----------|------| | Button_refresh (BS) | — | 点击BS按钮 | 请求NTP时间,ESP8266直接输出 `$T:...` | | Button_weather (BW) | — | 点击BW按钮 | 请求天气信息,ESP8266获取后输出 `$W:...` | --- ## 二、MCU → ESP8266 → Blinker App(上行数据) MCU通过串口发送 `$key:value\n`,ESP8266解析后更新对应Blinker组件。 ### 2.1 数值上报 | 串口Key | Blinker组件 | value格式 | 说明 | |---------|-------------|-----------|------| | `N1` | NumberData_1 | 浮点数 | 上报N1数值到App | | `N2` | NumberData_2 | 浮点数 | 上报N2数值到App | | `N3` | NumberData_3 | 浮点数 | 上报N3数值到App | | `N4` | NumberData_4 | 浮点数 | 上报N4数值到App | | `N5` | NumberData_5 | 浮点数 | 上报N5数值到App | | `N6` | NumberData_6 | 浮点数 | 上报N6数值到App | | `N7` | NumberData_7 | 浮点数 | 上报N7数值到App | | `N8` | NumberData_8 | 浮点数 | 上报N8数值到App | | `N9` | NumberData_9 | 浮点数 | 上报N9数值到App | | `NA` | NumberData_A | 浮点数 | 上报NA数值到App | **示例**: ``` $N1:26.3\n // 上报温度26.3到N1 $N5:65\n // 上报湿度65到N5 ``` ### 2.2 按钮状态上报 | 串口Key | Blinker组件 | value格式 | 说明 | |---------|-------------|-----------|------| | `B1` | Button_1 | 字符串 | 更新B1按钮显示状态 | | `B2` | Button_2 | 字符串 | 更新B2按钮显示状态 | | `B3` | Button_3 | 字符串 | 更新B3按钮显示状态 | | `B4` | Button_4 | 字符串 | 更新B4按钮显示状态 | | `B5` | Button_5 | 字符串 | 更新B5按钮显示状态 | | `B6` | Button_6 | 字符串 | 更新B6按钮显示状态 | | `B7` | Button_7 | 字符串 | 更新B7按钮显示状态 | | `B8` | Button_8 | 字符串 | 更新B8按钮显示状态 | **示例**: ``` $B1:on\n // 设置B1为开状态 $B3:off\n // 设置B3为关状态 ``` --- ## 三、ESP8266主动输出(系统数据) ESP8266在特定条件下主动通过串口输出,无需MCU请求。 ### 3.1 NTP时间 - **触发**: 用户点击Blinker App的BS(刷新)按钮 - **格式**: `$T:日,时:分:秒\n` | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | 日 | 整数 | 1-31 | 当月日期 | | 时 | 整数 | 0-23 | 24小时制 | | 分 | 整数 | 0-59 | 分钟 | | 秒 | 整数 | 0-59 | 秒 | **示例**: ``` $T:15,08:30:45\n // 15日 08:30:45 $T:1,14:05:09\n // 1日 14:05:09 ``` ### 3.2 天气数据 - **触发**: 用户点击Blinker App的BW(天气)按钮 - **格式**: `$W:W天气码,T温度,H湿度,P风力\n` | 字段 | 类型 | 说明 | |------|------|------| | W | 整数 | 天气码(见下表) | | T | 浮点数 | 温度(摄氏度) | | H | 浮点数 | 相对湿度(百分比) | | P | 整数 | 蒲福风力等级(0-12) | **天气码对照表**: | 码值 | 天气 | 码值 | 天气 | |------|------|------|------| | 0 | 未知 | 5 | 中雨 | | 1 | 晴 | 6 | 大雨 | | 2 | 多云 | 7 | 暴雨/雷暴 | | 3 | 阴 | 8 | 雪 | | 4 | 小雨 | 9 | 雾/霾 | **蒲福风力等级对照表**: | 等级 | 风速(km/h) | 等级 | 风速(km/h) | |------|-----------|------|-----------| | 0 | <1 | 6 | 50-61 | | 1 | 1-5 | 7 | 62-74 | | 2 | 6-11 | 8 | 75-88 | | 3 | 12-19 | 9 | 89-102 | | 4 | 20-28 | 10 | 103-117 | | 5 | 39-49 | 11-12 | ≥118 | **天气数据来源**: - 配置了经纬度 → 使用 Open-Meteo API(免费,无需Key) - 未配置经纬度 → 使用 Blinker 内置天气(自动定位) **示例**: ``` $W:W1,T25.3,H65,P3\n // 晴,25.3°C,湿度65%,3级风 $W:W4,T18.7,H92,P5\n // 小雨,18.7°C,湿度92%,5级风 $W:W8,T-2.1,H78,P2\n // 雪,-2.1°C,湿度78%,2级风 ``` --- ## 四、数据流总览 ``` Blinker App ESP8266 MCU ─────────── ───────── ───────── 按钮B1-B8点击 ──MQTT──► Button回调 ──串口──► $B1:on\n ──► MCU处理 数值N1-NA输入 ──MQTT──► Number回调 ──串口──► $N3:25.5\n ──► MCU处理 刷新按钮(BS) ──MQTT──► sendNtpTime ──串口──► $T:15,8:30:45\n ──► MCU处理 天气按钮(BW) ──MQTT──► 天气API ───串口──► $W:W1,T25,H65,P3\n ──► MCU处理 MCU ──串口──► $N1:26.3\n ──► sendToBlinker ──MQTT──► App显示N1=26.3 MCU ──串口──► $B2:on\n ──► sendToBlinker ──MQTT──► App显示B2=on ``` --- ## 五、配网流程 1. 首次上电(无WiFi配置)→ ESP8266开启AP热点 `ZNGJ_WiFi_Config` 2. 手机连接该热点,浏览器自动跳转配网页面 3. 填写 Blinker Key、WiFi名称、WiFi密码、经纬度(可选) 4. 点击保存 → ESP8266存储配置到EEPROM → 连接WiFi → 连接Blinker云 5. 后续上电自动读取EEPROM配置连接WiFi 6. WiFi断连3次后自动回到配网模式 ### EEPROM布局 | 地址 | 长度 | 内容 | |------|------|------| | 2500 | 1 | 有效标志(0x57) | | 2501 | 19 | Blinker Auth Key | | 2521 | 31 | WiFi SSID | | 2553 | 63 | WiFi Password | | 2617 | 4 | 天气纬度(float, 0=自动定位) | | 2621 | 4 | 天气经度(float, 0=自动定位) | > 注意: EEPROM地址0-2500被Blinker库占用,自定义配置从2500开始。EEPROM_SIZE必须为4096与Blinker一致。 --- ## 六、STM32 MCU串口解析库 `test/serial_parser_stm32.c` 提供了STM32 HAL库下的完整串口解析实现,MCU开发者可直接集成。 ### 6.1 接口函数 | 函数 | 说明 | |------|------| | `BLK_Init(huart1)` | 初始化,开启串口中断接收 | | `BLK_Process()` | 主循环调用,处理已解析的数据 | | `BLK_UART_RxCplt(huart)` | 串口接收回调,在`HAL_UART_RxCpltCallback`中调用 | ### 6.2 数据读取接口 **按钮状态**: ```c uint8_t BLK_GetBtn(uint8_t idx); // idx: 0-7 对应 B1-B8, 返回 1=on, 0=off ``` **数值**: ```c float BLK_GetNum(uint8_t idx); // idx: 0-8 对应 N1-N9, idx=9 对应 NA ``` **NTP时间**: ```c uint8_t BLK_GetNtpDay(void); // 1-31 uint8_t BLK_GetNtpHour(void); // 0-23 uint8_t BLK_GetNtpMinute(void); // 0-59 uint8_t BLK_GetNtpSecond(void); // 0-59 ``` **天气**: ```c uint8_t BLK_GetWeatherCode(void); // 天气码 0-9(见天气码对照表) float BLK_GetWeatherTemp(void); // 温度(支持负数和小数) float BLK_GetWeatherHumi(void); // 湿度(支持小数) uint8_t BLK_GetWeatherPower(void); // 蒲福风力等级 0-12 ``` ### 6.3 上行发送接口(MCU→ESP8266→Blinker App) ```c // 通用发送 void BLK_Send(UART_HandleTypeDef *huart1, const char *key, const char *value); // 便捷:上传数值 N1-N9(idx:1-9), NA(idx:10) void BLK_SendNum(UART_HandleTypeDef *huart1, uint8_t idx, float val); // 便捷:上传按钮状态 B1-B8(idx:1-8) void BLK_SendBtn(UART_HandleTypeDef *huart1, uint8_t idx, uint8_t on); ``` **上行格式**: `key:value\n`(注意:MCU上行**无** `# ESP8266 Blinker WiFi 串口通信协议 ## 架构概览 ``` ┌──────────┐ 串口(UART 115200) ┌──────────────┐ WiFi/MQTT ┌──────────┐ │ MCU │ ◄────────────────────► │ ESP8266 │ ◄────────────► │ Blinker │ │ (STM32等)│ $key:value\n │ (本项目) │ │ 云平台 │ └──────────┘ └──────────────┘ └──────────┘ ``` ## 串口协议格式 - **统一格式**: `$key:value\n` - **波特率**: 115200 - **解析规则**: 首字符 `$` 为有效行起始,冒号 `:` 分隔键值,换行 `\n` 结束 - **最大行长**: 64 字节(含 `$` 和 `\n`) --- ## 一、Blinker App → ESP8266 → MCU(下行数据) 用户在Blinker App操作控件,ESP8266收到MQTT消息后通过串口转发给MCU。 ### 1.1 按钮控件(BlinkerButton) | Blinker组件 | 串口Key | value范围 | 说明 | |-------------|---------|-----------|------| | Button_1 (B1) | `B1` | `on` / `off` | 支持开关状态,ESP8266控制LED+回传状态 | | Button_2 (B2) | `B2` | `on` / `off` / 其他 | 透传按钮状态 | | Button_3 (B3) | `B3` | `on` / `off` / 其他 | 透传按钮状态 | | Button_4 (B4) | `B4` | `on` / `off` / 其他 | 透传按钮状态 | | Button_5 (B5) | `B5` | `on` / `off` / 其他 | 透传按钮状态 | | Button_6 (B6) | `B6` | `on` / `off` / 其他 | 透传按钮状态 | | Button_7 (B7) | `B7` | `on` / `off` / 其他 | 透传按钮状态 | | Button_8 (B8) | `B8` | `on` / `off` / 其他 | 透传按钮状态 | **示例**: ``` $B1:on\n // 用户按下B1按钮(开) $B3:off\n // 用户按下B3按钮(关) $B5:tap\n // 用户点击B5按钮 ``` ### 1.2 数值控件(BlinkerNumber) | Blinker组件 | 串口Key | value范围 | 说明 | |-------------|---------|-----------|------| | NumberData_1 (N1) | `N1` | 浮点数字符串 | 数值滑块/输入 | | NumberData_2 (N2) | `N2` | 浮点数字符串 | 数值滑块/输入 | | NumberData_3 (N3) | `N3` | 浮点数字符串 | 数值滑块/输入 | | NumberData_4 (N4) | `N4` | 浮点数字符串 | 数值滑块/输入 | | NumberData_5 (N5) | `N5` | 浮点数字符串 | 数值滑块/输入 | | NumberData_6 (N6) | `N6` | 浮点数字符串 | 数值滑块/输入 | | NumberData_7 (N7) | `N7` | 浮点数字符串 | 数值滑块/输入 | | NumberData_8 (N8) | `N8` | 浮点数字符串 | 数值滑块/输入 | | NumberData_9 (N9) | `N9` | 浮点数字符串 | 数值滑块/输入 | | NumberData_A (NA) | `NA` | 浮点数字符串 | 数值滑块/输入 | **示例**: ``` $N1:25.5\n // N1数值设为25.5 $N7:100\n // N7数值设为100 $NA:3.14\n // NA数值设为3.14 ``` ### 1.3 功能按钮 | Blinker组件 | 串口Key | 触发方式 | 说明 | |-------------|---------|----------|------| | Button_refresh (BS) | — | 点击BS按钮 | 请求NTP时间,ESP8266直接输出 `$T:...` | | Button_weather (BW) | — | 点击BW按钮 | 请求天气信息,ESP8266获取后输出 `$W:...` | --- ## 二、MCU → ESP8266 → Blinker App(上行数据) MCU通过串口发送 `$key:value\n`,ESP8266解析后更新对应Blinker组件。 ### 2.1 数值上报 | 串口Key | Blinker组件 | value格式 | 说明 | |---------|-------------|-----------|------| | `N1` | NumberData_1 | 浮点数 | 上报N1数值到App | | `N2` | NumberData_2 | 浮点数 | 上报N2数值到App | | `N3` | NumberData_3 | 浮点数 | 上报N3数值到App | | `N4` | NumberData_4 | 浮点数 | 上报N4数值到App | | `N5` | NumberData_5 | 浮点数 | 上报N5数值到App | | `N6` | NumberData_6 | 浮点数 | 上报N6数值到App | | `N7` | NumberData_7 | 浮点数 | 上报N7数值到App | | `N8` | NumberData_8 | 浮点数 | 上报N8数值到App | | `N9` | NumberData_9 | 浮点数 | 上报N9数值到App | | `NA` | NumberData_A | 浮点数 | 上报NA数值到App | **示例**: ``` $N1:26.3\n // 上报温度26.3到N1 $N5:65\n // 上报湿度65到N5 ``` ### 2.2 按钮状态上报 | 串口Key | Blinker组件 | value格式 | 说明 | |---------|-------------|-----------|------| | `B1` | Button_1 | 字符串 | 更新B1按钮显示状态 | | `B2` | Button_2 | 字符串 | 更新B2按钮显示状态 | | `B3` | Button_3 | 字符串 | 更新B3按钮显示状态 | | `B4` | Button_4 | 字符串 | 更新B4按钮显示状态 | | `B5` | Button_5 | 字符串 | 更新B5按钮显示状态 | | `B6` | Button_6 | 字符串 | 更新B6按钮显示状态 | | `B7` | Button_7 | 字符串 | 更新B7按钮显示状态 | | `B8` | Button_8 | 字符串 | 更新B8按钮显示状态 | **示例**: ``` $B1:on\n // 设置B1为开状态 $B3:off\n // 设置B3为关状态 ``` --- ## 三、ESP8266主动输出(系统数据) ESP8266在特定条件下主动通过串口输出,无需MCU请求。 ### 3.1 NTP时间 - **触发**: 用户点击Blinker App的BS(刷新)按钮 - **格式**: `$T:日,时:分:秒\n` | 字段 | 类型 | 范围 | 说明 | |------|------|------|------| | 日 | 整数 | 1-31 | 当月日期 | | 时 | 整数 | 0-23 | 24小时制 | | 分 | 整数 | 0-59 | 分钟 | | 秒 | 整数 | 0-59 | 秒 | **示例**: ``` $T:15,08:30:45\n // 15日 08:30:45 $T:1,14:05:09\n // 1日 14:05:09 ``` ### 3.2 天气数据 - **触发**: 用户点击Blinker App的BW(天气)按钮 - **格式**: `$W:W天气码,T温度,H湿度,P风力\n` | 字段 | 类型 | 说明 | |------|------|------| | W | 整数 | 天气码(见下表) | | T | 浮点数 | 温度(摄氏度) | | H | 浮点数 | 相对湿度(百分比) | | P | 整数 | 蒲福风力等级(0-12) | **天气码对照表**: | 码值 | 天气 | 码值 | 天气 | |------|------|------|------| | 0 | 未知 | 5 | 中雨 | | 1 | 晴 | 6 | 大雨 | | 2 | 多云 | 7 | 暴雨/雷暴 | | 3 | 阴 | 8 | 雪 | | 4 | 小雨 | 9 | 雾/霾 | **蒲福风力等级对照表**: | 等级 | 风速(km/h) | 等级 | 风速(km/h) | |------|-----------|------|-----------| | 0 | <1 | 6 | 50-61 | | 1 | 1-5 | 7 | 62-74 | | 2 | 6-11 | 8 | 75-88 | | 3 | 12-19 | 9 | 89-102 | | 4 | 20-28 | 10 | 103-117 | | 5 | 39-49 | 11-12 | ≥118 | **天气数据来源**: - 配置了经纬度 → 使用 Open-Meteo API(免费,无需Key) - 未配置经纬度 → 使用 Blinker 内置天气(自动定位) **示例**: ``` $W:W1,T25.3,H65,P3\n // 晴,25.3°C,湿度65%,3级风 $W:W4,T18.7,H92,P5\n // 小雨,18.7°C,湿度92%,5级风 $W:W8,T-2.1,H78,P2\n // 雪,-2.1°C,湿度78%,2级风 ``` --- ## 四、数据流总览 ``` Blinker App ESP8266 MCU ─────────── ───────── ───────── 按钮B1-B8点击 ──MQTT──► Button回调 ──串口──► $B1:on\n ──► MCU处理 数值N1-NA输入 ──MQTT──► Number回调 ──串口──► $N3:25.5\n ──► MCU处理 刷新按钮(BS) ──MQTT──► sendNtpTime ──串口──► $T:15,8:30:45\n ──► MCU处理 天气按钮(BW) ──MQTT──► 天气API ───串口──► $W:W1,T25,H65,P3\n ──► MCU处理 MCU ──串口──► $N1:26.3\n ──► sendToBlinker ──MQTT──► App显示N1=26.3 MCU ──串口──► $B2:on\n ──► sendToBlinker ──MQTT──► App显示B2=on ``` --- ## 五、配网流程 1. 首次上电(无WiFi配置)→ ESP8266开启AP热点 `ZNGJ_WiFi_Config` 2. 手机连接该热点,浏览器自动跳转配网页面 3. 填写 Blinker Key、WiFi名称、WiFi密码、经纬度(可选) 4. 点击保存 → ESP8266存储配置到EEPROM → 连接WiFi → 连接Blinker云 5. 后续上电自动读取EEPROM配置连接WiFi 6. WiFi断连3次后自动回到配网模式 ### EEPROM布局 | 地址 | 长度 | 内容 | |------|------|------| | 2500 | 1 | 有效标志(0x57) | | 2501 | 19 | Blinker Auth Key | | 2521 | 31 | WiFi SSID | | 2553 | 63 | WiFi Password | | 2617 | 4 | 天气纬度(float, 0=自动定位) | | 2621 | 4 | 天气经度(float, 0=自动定位) | 前缀,ESP8266自动识别) ### 6.4 使用步骤 **1. 添加文件**: 将 `serial_parser_stm32.c` 加入STM32工程 **2. 初始化**: 在 `main.c` 中调用 ```c BLK_Init(&huart1); ``` **3. 注册回调**: 在串口中断回调中调用 ```c void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { BLK_UART_RxCplt(huart); } ``` **4. 主循环处理**: 在 `while(1)` 中调用 ```c while (1) { BLK_Process(); // 读取数据示例 if (BLK_GetBtn(0)) { /* B1=on */ } float temp = BLK_GetNum(0); /* N1值 */ } ``` **5. 上报数据到Blinker App**: ```c BLK_SendNum(&huart1, 1, 26.3); // 上报 N1=26.3 BLK_SendBtn(&huart1, 2, 1); // 设置 B2=on BLK_Send(&huart1, "N3", "42.5"); // 通用方式 ``` ### 6.5 数据结构 ```c typedef struct { uint8_t btn[8]; // B1-B8, 1=on 0=off uint8_t btnUpdate[8]; // 按钮更新标志 float num[10]; // N1-N9(0-8), NA(9) uint8_t numUpdate[10]; // 数值更新标志 uint8_t ntpDay, ntpHour, ntpMinute, ntpSecond; // NTP时间 uint8_t ntpUpdate; uint8_t weatherCode; // 天气码 0-9 float weatherTemp; // 温度(含负数/小数) float weatherHumi; // 湿度(含小数) uint8_t weatherPower; // 风力等级 uint8_t weatherUpdate; } BLK_Data_t; ``` ### 6.6 解析流程 ``` 串口字节流 ──HAL中断──► BLK_UART_RxCplt() │ 逐字节存入rxLine[] │ 遇到\n\r触发解析 ▼ parseLine() │ 检查$前缀 → 提取key:value │ B1-B8 → btn[idx] │ N1-N9/NA → num[idx] │ T → ntpDay,Hour,Min,Sec │ W → weatherCode,Temp,Humi,Power ▼ BLK_Process() → handleData() │ 检查各Update标志 │ 用户在handleData()中处理业务逻辑 ▼ BLK_GetXxx() 读取最新值 ```