Commit Graph
73 Commits
Author SHA1 Message Date
wangfq 01ab739d05 vd960DBN: 修复 mqtt_publish QoS>0 时 packet_id=0 导致 broker 断连
MQTT 规范要求 QoS≥1 的 PUBLISH 必须带非零 packet_id。
net_srv.c 的 mqtt_publish 硬编码 packet_id=0,broker 检测到协议违规后主动断开连接。
修复:QoS>0 时使用递增的 packet_id。
2026-07-10 09:20:14 +08:00
wangfq 11d1a96d24 同步协议 V1.03:双主题发布对齐 + initialize 数据格式修正
vd960DBN:
- heartbeat/sensor/initialize 发布统一走 dld960/{sn}/dev
- dev_initialize_pub 补 model/hard_ver/soft_ver,删 extra_info.version

DBNMQTTool:
- 协议版本号更新至 V1.03
- 协议 Topic 树和模拟页增加 initialize 支持
2026-07-10 08:49:28 +08:00
wangfq 652fc5f938 feat: V1.03 initialize 上线消息 — 固件+工具同步
vd960DBN:
- dev_initialize_pub() 改为 V1.03 格式 (msg_id/cmd/ts/data/extra_info)
- iot_mqtt_srv: 订阅改双主题 dld960/{sn}/srv, 响应 topic 改 dev
- SUBACK 后自动发 initialize 告知服务器上线
- net_srv.h: 加 dev_initialize_pub 声明

DBNMQTTool:
- protocol.py: 加 CMD_INITIALIZE
- device_manager: DeviceInfo 加 extra_info, 加 mark_online()
- main.py: 接收 initialize 消息, 自动标记设备上线
- docs: 协议 V1.03 + devlog V3.1
2026-07-09 21:32:39 +08:00
wangfq c515638032 fix: MQTT协议 V1.02 同步 — 字段名缩短 + 时间单位修正
- docs/DLD960_IoT_MQTT协议.md: 字段缩写 + 时间单位 5ms→50ms
- vd960DBN/iot_mqtt_srv.c: 6字段缩短对齐协议 (level/iscar/freq/diff/sens/cndtn)
- vd960DBN/tcp_json_srv.c: gap_ms5/passtime_ms → gap/passtime
- vd960DBN/loop_uart_proto.h: 注释 5ms→50ms
- DBNMQTTool/main.py: 模拟样本数据字段同步
2026-07-09 10:18:03 +08:00
wangfq 466ce00680 feat(iot_mqtt): 恢复 loop_data 完整字段 + 分批发送(2通道/包)
按 DLD960_TCP_JSON协议.md §5.1 恢复完整字段:
- ch, freq_level, has_car, loop_ok, freq_current, freq_diff,
  sensitivity, condition, misc.type, misc.value

每包发 2 个通道,确保 JSON < 450 字节 (mqttBuf 512 安全范围内)。
4 通道设备每次 SensorReport 发 2 条 loop_data 消息。
2026-07-08 17:21:06 +08:00
wangfq 4c6d23a951 fix(iot_mqtt): 传感数据 topic 改为 V1.01 双主题协议 dld960/{sn}/dev
原 iot_make_topic("dev","data","loop") → dld960/{sn}/dev/data/loop (V1.00)
改为直接用 g_iot_topic.topic_pub → dld960/{sn}/dev (V1.01)
与 report_config 等命令响应共用同一 topic,DBNMQTTool 订阅 dld960/+/dev 可接收到
2026-07-08 16:54:23 +08:00
wangfq 8425b473d3 fix: net_srv.h 添加 mqtt_publish() 声明供 iot_mqtt_srv.c 调用 2026-07-08 16:12:20 +08:00
wangfq 8232ec2c55 fix(iot_mqtt): 改用 net_srv.c mqtt_publish() 发送传感数据
iot_mqtt_publish_sensor() 原先调用 iot_mqtt_publish() →
iot_mqtt_send() → WCHNET_SocketSend() 从主循环发送导致重启。
改为调用 net_srv.c 的 mqtt_publish()(与 report_config 响应
共用同一路径,已验证在中断上下文中稳定工作)。

同时在 net_srv.h 中声明 mqtt_publish() 供跨文件调用。
2026-07-08 16:11:50 +08:00
wangfq 2175fee742 fix(iot_mqtt): 移除 iot_mqtt_send() hex dump 循环避免栈溢出重启
hex dump 连续 65 次 PRINT 调用消耗大量栈空间,
在 CH32V208 2KB 栈限制下导致溢出重启.
改为仅打印 len 和 ret/status.
2026-07-08 15:52:43 +08:00
wangfq a71adaafdc fix(iot_mqtt): 精简 loop_data JSON 避免 WCHNET_SocketSend 超大包崩溃
问题: 4通道传感器数据 JSON ~700字节 → MQTT Publish 733字节
      超过 WCHNET TCP MSS(576) 和原始 MAX_MQTTBUF_LEN(512) 设计上限
      WCHNET_SocketSend(733) 导致设备重启

修复:
- 移除非必要字段: freq_current, freq_diff, condition
- 展平 misc 嵌套对象 → mt(类型) + mv(数值)
- 缩短 key 名: freq_level→fl, has_car→car, loop_ok→ok, sensitivity→sens
- 每通道 ~70字, 4通道 ~280, 全包 ~400字节
- 加安全检查: payload >450 时跳过并打印警告
2026-07-08 15:09:50 +08:00
wangfq 555cdb741d fix(iot_mqtt): g_iot_socket 未初始化导致 WCHNET_SocketSend(0xFF) 硬故障重启
根因: iot_mqtt_srv.c 中 g_iot_socket 初始化为 0xFF,
仅 iot_connect_broker() 中设为 SocketId_TCP.
但内联 MQTT 模式(iot_mqtt_poll 从未调用)下该赋值永不执行.
iot_mqtt_publish_sensor() 调用 iot_mqtt_send() →
WCHNET_SocketSend(0xFF, ...) → HardFault → 设备重启.

修复: iot_mqtt_init() 中设置 g_iot_socket = SocketId_TCP,
该函数在 net_srv_init() flag==1 时被调用(含首次启动和每次重连).
2026-07-08 09:11:23 +08:00
wangfq 0e116c2d31 fix(net_srv): MQTT 主动上报无数据 + PINGREQ 缺失导致断连
问题1: iot_mqtt_publish_sensor() 检查 g_iot_state != IOT_STATE_READY 直接 return,
但 g_iot_state 从未被 net_srv.c 内联 MQTT 处理器设置为 READY → 无传感数据上报

问题2: poll_mqtt() 依赖 flag_mqtt_ping_send 触发 PINGREQ,
但该标志从未被设为 1 → broker keepalive 超时断连 (~12s)

修复:
- mqtt_data_manage() CONNACK: 设 g_iot_state=IOT_STATE_READY
- WCHNET_HandleSockInt DISCONNECT: 设 g_iot_state=IOT_STATE_DISCONNECTED
- mqtt_data_manage() PINGRESP: 重置 flag_mqtt_ping_err
- poll_mqtt(): g_activ_counter > 9000 自动触发 PINGREQ
2026-07-08 08:55:10 +08:00
wangfq de2e70fd89 feat(vd960DBN): MQTT ssc_net_set / iot_net_set / iot_topic_set 实现
- ssc_net_set: 解析 dev_ip/subnet_mask/route_ip/lssc_ip/dns/port,调用 write_net_config
- iot_net_set: 解析 host/port/client_id/username/password,调用 write_net_config
- iot_topic_set: 解析 client_id_enable/topic_pub/topic_sub,调用 write_net_config
- 三个 SET 命令均写入 flash 并在完成后返回 code=0 success
2026-07-07 21:15:55 +08:00
wangfq 2bbe388738 fix: iot_mqtt_srv.c 添加缺失的 tcp_json_srv.h include 2026-07-07 18:47:05 +08:00
wangfq a7de4dfcde feat(vd960DBN): MQTT/TCP report_config 支持完整7参数配置
- 新增 ReportConfig 结构体 (sensor_type/enable/once/env_eval/interval/ack_required/timeout)
- net_srv.c: MQTT report_config handler — 查询/设置均返回完整配置JSON
- tcp_json_srv.c: TCP JSON handle_report_config 同步升级,兼容旧 active_report
- iot_mqtt_srv.c: g_report_active → g_report_cfg.enable
- g_report_active 全局变量替换为 g_report_cfg 结构体
2026-07-07 18:39:45 +08:00
wangfq 90d723517e feat: manage_mqtt_recv_message 实现 V1.01 协议命令分发
net_srv.c: manage_mqtt_recv_message() 从占位打印升级为完整命令分发器:

已实现(8条):
- dev_info_query: 返回设备信息(序列码/版本/子码)
- ssc_net_query: 返回 SSC 网络配置
- iot_net_query: 返回 IoT 网络配置(MQTT broker)
- iot_topic_query: 返回 topic 配置
- pwd_verify: 验证设备密码
- factory_reset: 出厂初始化+重启
- device_reset: 设备复位

未实现(返回 code=4):
- dev_serial_set, pwd_set, ssc_net_set 等 SET 类命令

所有响应通过 g_iot_topic.topic_pub (dld960/{sn}/dev) 发布
2026-07-07 13:58:27 +08:00
wangfq 3cdc5b6286 fix: MQTT PUBLISH 接收修复 — topic 过滤 + cmd/Method 双格式支持
问题: mqtt_data_manage() 的 PUBLISH 分支直接调用 manage_mqtt_recv_message(),
      跳过了 mqtt_deserialize_publish() 的 topic 过滤, 且只支持旧 Method 格式.

修复:
- mqtt_data_manage: PUBLISH 改为走 mqtt_deserialize_publish 做 topic 匹配
- mqtt_deserialize_publish: topic 过滤已改用 g_iot_topic.topic_sub
- manage_mqtt_recv_message: 优先解析 cmd, 兼容旧 Method 字段
2026-07-07 12:09:07 +08:00
wangfq ab3a4cea0a fix: 出厂默认 topic 使用真实设备序列号 + PRINT 修正
- cfig_flash.c: factory_dev_info() 用 gMacAddr 生成真实主题 dld960/{SN}/srv + dld960/{SN}/dev
- net_srv.h: TOPIC_DEFAULT 加注释标明为格式模板
- net_srv.c: 修复上次提交的 PRINT 宏转义异常
2026-07-07 10:57:20 +08:00
wangfq b707241429 feat: MQTT 双主题同步到 vd960DBN 固件 + DBNMQTTool devlog
vd960DBN 固件改动:
- net_srv.h: 默认 topic 改为 dld960/{sn}/srv + dld960/{sn}/dev
- net_srv.c: dg_subscribe_display_topic() 直接用 topic_sub 订阅(不再追加 client_id/sn 后缀)
- net_srv.c: mqtt_deserialize_publish() topic 过滤改用 g_iot_topic.topic_sub(不再硬编码 TOPIC_DEFAULT_SUBSCRIBE)

DBNMQTTool 文档:
- devlog.md: 清理过期 topic 引用语义
2026-07-07 09:46:54 +08:00
wangfq 220f778117 fix(vd960DBN): 删除重复 poll_mqtt 定义 + 加头文件声明 2026-07-06 17:30:28 +08:00
wangfq c17b67d185 refactor(vd960DBN): MQTT 重构,对标 DBN101GA 参考项目
net_srv.c 改动:
- WCHNET_HandleSockInt IoT 分支:SINT_STAT_CONNECT 直接调 mqtt_connect(),
  SINT_STAT_RECV 调 mqtt_data_manage() — 复用已有的 SocketId_TCP/mqttBuf/mqttData
- 新增 mqtt_data_manage(): 处理 CONNACK/SUBACK/PUBLISH/PINGRESP
- 新增 poll_mqtt(): 心跳 PINGREQ (~9s)

peripheral_main.c 改动:
- IoT 模式下 poll_mqtt() 替代 iot_mqtt_poll()

对标 DBN101GA 的关键差异:
- net_srv.c 已有完整 mqtt_connect/mqtt_publish/MQTT_Subscribe/MQTT_Pingreq
- SocketId_TCP 由 WCHNET_CreateTcpMqttSocket 创建,不再自建 socket
- SINT_STAT_CONNECT 直接发 MQTT CONNECT,不延迟
2026-07-06 17:21:48 +08:00
wangfq 0c8402d726 fix(vd960DBN): MQTT socket 复用 SocketId_TCP,对标官方 WCHNET MQTT 例程
根因分析:iot_connect_broker 自建 socket 与 WCHNET_CreateTcpMqttSocket
创建的 SocketId_TCP 冲突(重复创建),且自建 socket 的 WCHNET_SocketSend
崩溃。官方 MQTT 例程使用统一的 SocketId/SocketId_TCP 模式。

改动:
- peripheral_main.c: 恢复 WCHNET_CreateTcpMqttSocket() 调用
- iot_connect_broker: 不再创建新 socket,直接复用 SocketId_TCP
- 全链路(SocketSend/HandleSockInt/poll)通过 g_iot_socket=SocketId_TCP 统一
2026-07-06 16:09:22 +08:00
wangfq 46091639cd fix(vd960DBN): iot_connect_broker 加 SourPort + iot_mqtt_send 加 hex dump
- SourPort 参考 WCHNET_CreateTcpMqttSocket 设为 port_dev_udp+1
- iot_mqtt_send 打印前64字节 hex 内容
2026-07-06 15:44:22 +08:00
wangfq 88526158d0 fix(vd960DBN): MQTT CONNECT 改为 poll 内延迟发送,避免中断内 WCHNET_SocketSend 崩溃
1. 参考 net_srv.c mqtt_connect 模式重写 iot_mqtt_send_connect:
   - clientID 用 g_dev_number_str(全局),不用 g_iot_dev_serial
   - username/password 直接赋值,不用 strlen 检查
   - memset 手动初始化,不用 brace-initializer 赋值

2. SINT_STAT_CONNECT 中断内不再调 iot_mqtt_send_connect,
   改为标记 TCP_CONNECTED,由 iot_mqtt_poll 下一轮发送 —
   参考 tcp_json_handle_sock_int 不立即发送数据的模式
2026-07-06 15:16:24 +08:00
wangfq 884a622cab refactor(vd960DBN): 缓冲区 2048→1024,单次交互不超 1KB
- IOT_MQTT_RECV_BUF_LEN: 2048 → 1024
- IOT_MQTT_SEND_BUF_LEN: 2048 → 1024
- data_json 改用宏
- iot_handle_publish 的 json[] 改 static 防栈溢出
2026-07-06 13:47:10 +08:00
wangfq 7459c0fa80 fix(vd960DBN): iot_mqtt_publish_sensor 栈溢出 — data_json[2KB] + payload[2KB] = 4KB 远超 2KB 栈
每次主循环调 iot_mqtt_publish_sensor 都分配 4KB 栈变量,
直接栈溢出踩烂全局变量(含 g_iot_dev_serial→clientId=空),
最终在 iot_mqtt_send_connect→WCHNET_SocketSend 时 hard fault。
改为 static 彻底消除栈压力。
另加 iot_mqtt_send 调试日志。
2026-07-06 13:40:25 +08:00
wangfq de3a7c197e fix(vd960DBN): MQTTPacket_connectData_initializer 不能用于赋值,用临时变量中转 2026-07-06 11:31:12 +08:00
wangfq dfadc26717 fix(vd960DBN): MQTT buffer 从栈改为 static,防止栈溢出 (栈仅 2KB)
iot_mqtt_send_connect:  opts(~85B) + buf[256]  → static (~340B 省)
iot_mqtt_send_subscribe: buf[256]              → static (256B 省)
iot_mqtt_publish:        buf[2048]             → static (2KB 省)
调用链 WCHNET_HandleGlobalInt → iot_mqtt_handle_sock_int
→ iot_mqtt_send_connect 会叠加 WCHNET 协议栈内部开销,
2048B 栈极易溢出导致 hard fault(现象:乱码+truncated日志+重启)
2026-07-06 11:27:08 +08:00
wangfq c0220c1d37 fix(vd960DBN): IoT socket 重复创建 + broker IP 解析错误
- iot_connect_broker: 删除 memcpy,get_ipstr_to_array 已正确解析 IP
  之前 memcpy 把原始 ASCII 字节覆写到 broker_ip,导致 IP 变成 49.50.49.46
- peripheral_main.c: IoT 模式下跳过 WCHNET_CreateTcpMqttSocket,
  由 iot_connect_broker() 统一管理 socket 生命周期,避免重复创建
2026-07-06 10:46:51 +08:00
wangfq e6dbdb5296 fix(vd960DBN): 修复无法设置 IoT 模式的 bug 2026-07-06 10:24:15 +08:00
wangfq 39bda6067f fix(vd960DBN): add missing closing brace for case PUBLISH block in iot_process_recv
case PUBLISH: { ... } was missing its closing }, causing ARMCC to think
iot_send_heartbeat and iot_connect_broker were declared inside a function body.
2026-07-03 18:28:40 +08:00
wangfq 122c36bb9d fix(vd960DBN): iot_make_topic missing 5th arg for "srv"/"ctrl" topic 2026-07-03 18:18:38 +08:00
wangfq 6f5effae8c fix(vd960DBN): iot_mqtt_srv compilation errors
- Add extern g_report_active (from tcp_json_srv.h)
- Fix iot_make_topic call: 4-arg -> 5-arg (add NULL for 'status' sub)
- Fix SOCK_INF field names: DestPort->DesPort, DestAddr->IPAddr
- Fix struct _WCHNET_IPAddr -> uint8_t broker_ip[4] (type not available)
2026-07-03 18:12:55 +08:00
wangfq 5333fe40de refactor(vd960DBN): replace compile-time NET_SSC/NET_JSON/NET_IOT macros with runtime g_sub_code_enable.iot_enable
- Remove NET_SSC_ENABLE, NET_JSON_ENABLE, NET_IOT_ENABLE from net_config.h
- Socket config always allocates max: 1 UDP + 2 TCP + 1 TCP_LISTEN
- All #if guards in net_srv.c/h and peripheral_main.c replaced with
  runtime g_sub_code_enable.iot_enable checks
- iot_enable=0 -> SSC mode (UDP + TCP client + JSON server)
- iot_enable=1 -> IoT MQTT mode (MQTT client via iot_mqtt_srv)
2026-07-03 18:07:32 +08:00
wangfq 9629729dc9 feat: IoT MQTT 客户端实现 — NET_SSC_ENABLE=0 时启用
新增文件:
- iot_mqtt_srv.h/c: MQTT 客户端 (TCP→CONNECT→SUBSCRIBE→READY)
  支持: dev_info_query, pwd_verify (其他命令框架预留)
  上报: loop_data (传感器), heartbeat (心跳 60s)
  断线重连: 指数退避 5s~60s
  协议: DLD960 IoT MQTT V1.00 (dld960/{sn}/...)

修改:
- net_config.h: 新增 NET_IOT_ENABLE = !NET_SSC_ENABLE,
  IoT 模式分配 1 TCP socket (MQTT client)
- net_srv.c: IoT 初始化 + socket 中断路由
- peripheral_main.c: IoT poll + sensor publish 调用

模式:
  NET_SSC_ENABLE=1 → SCC + TCP JSON Server (原有行为)
  NET_SSC_ENABLE=0 → IoT MQTT Client (新增)
2026-07-03 17:36:22 +08:00
wangfq acb999a881 fix: 放弃 close+recreate listen socket, 改为只关数据socket
根因: WCHNET ERR_ISCONN(0x1D), listen socket 关闭后端口5960仍被占用,
      无法在同端口立即重建. WCHNET_MainTask 循环也未能释放.

新方案: tcp_json_restart 只关数据 socket(N+1) 断开客户端,
        listen socket(N) 保持不动, 仅重置应用层状态.
        新客户端连接时 CONNECT 事件照常触发.
2026-07-03 16:10:52 +08:00
wangfq c181839694 fix: SocketCreat 0x1D — close后先跑WCHNET回收资源再creat
根因: WCHNET_SocketClose 异步, 资源在 WCHNET_MainTask 中释放.
      tcp_json_restart() close后立刻creat, 旧socket未回收→0x1D.
修复: close后循环5次 WCHNET_MainTask+HandleGlobalInt+Delay(10ms)
      确保资源释放后再 WCHNET_SocketCreat
2026-07-03 15:51:16 +08:00
wangfq b97afe22d5 refactor: 去掉 60s Auth timeout, 改为 3次失败即重启
- 删除 tcp_json_poll 中的 Auth timeout 60s 超时检查
- Auth 失败逻辑已在 handle_pwd_verify: 3次失败→tcp_json_restart()
- 连接后无交互场景由 5min 空闲检查覆盖
2026-07-03 15:28:00 +08:00
wangfq fe69855dc9 fix: Auth timeout 耗尽重启限额导致冷却期阻断连接
根因: auth timeout(60s) 走 do_restart 计数, 上电后 4 分钟就耗尽 3 次限额,
      进入 10min 冷却期, 客户端无法连接.

修复: auth timeout 直接调 tcp_json_restart() 绕开 do_restart,
      不消耗重启计数器. 只保留 5min 空闲/无连接作为限额保护目标.
2026-07-03 15:18:54 +08:00
wangfq 1ce2e783ae fix: Auth timeout 死循环打印 — 改用 do_restart 而非手工 close
根因: WCHNET_SocketClose 后 g_json_socket_listen 未归 0xFF,
      g_json_auth_timer 未重置, 下次 poll 条件仍满足 → 无限打印.
修复: auth timeout 直接 goto do_restart, 走完整的 close→recreate 流程
2026-07-03 13:49:10 +08:00
wangfq 5966eb8657 feat: TCP Server 自动重启机制 — 3种超时条件
触发条件(任一满足即重启):
1. 5分钟无任何连接 (从未连或上次连接后超时)
2. 5分钟无数据交互 (已连接但静默)
3. Auth 密码错误3次

重启流程: 关闭socket→清状态→重新SocketCreat+SocketListen
保护机制: 最多连续重启3次, 超限后进入10分钟冷却期

其他改动:
- tcp_json_srv_init 去掉 _init_done 限制, 支持重新初始化
- 新增 tcp_json_restart() 函数
- 新增 g_json_last_comm_ts / g_json_last_connect_ts 追踪
- CONNECT 时清零 restart_count (正常连接重置计数器)
2026-07-03 11:46:17 +08:00
wangfq d9059fac92 rename: passtime_ms5 → passtime_ms 2026-07-03 11:08:53 +08:00
wangfq 9bab650c27 feat: 0xC0 时间量根据 car_state 区分通过时间/车间距
car_state=0(无车) → passtime_ms5 (通过时间)
car_state=1(有车) → gap_ms5 (车间距)
2026-07-02 17:48:05 +08:00
wangfq 2163b89d28 feat: 协议 V1.04 — 主动上报增加继电器输出次数 (misc_type=3)
- loop_uart_proto.h: LUP_CoilSensor.misc 联合体新增 relay_count
- tcp_json_srv.c: format_sensor_json 处理 misc_type=3 → relay_count
- docs: 更新协议文档至 V1.04
2026-07-02 16:50:06 +08:00
wangfq 43d815a4fe fix: WCHNET_SocketSend 使用数据 socket (listen+1) 而非 listen socket
诊断日志确认: g_json_socket_listen=0, 数据中断走 sock=1
WCHNET TCP 模式下 listen=N, 收发数据必须走 socket N+1

修改: json_sensor_callback + tcp_json_push_sensor 两处
2026-07-02 14:40:31 +08:00
wangfq ff17bbbc88 fix: 回调注册前置到 socket 操作之前 + 入口诊断日志
- lup_set_sensor_callback 移到 SocketCreat/SocketListen 之前
  避免 socket 失败 return 导致回调漏注册
- json_sensor_callback 入口打印 socket/auth/report 三状态
  各检查点分别打印 skip 原因
2026-07-02 14:35:56 +08:00
wangfq c4a2b50ca5 fix: tcp_json_srv_init 加一次性守卫 + callback NULL 诊断
问题: NET_SSC_ENABLE 时 g_net_state.flag 保持 1, net_srv_init 反复调用
      tcp_json_srv_init 第二次因 socket 已存在失败 → 过早 return
      → lup_set_sensor_callback 未执行 → 0xC0 回调永远 NULL

修复:
- tcp_json_srv_init: 加 static _init_done 守卫,防止重复执行
- lup_set_sensor_callback: 打印注册/清除日志
- lup_process_frame: 回调为 NULL 时打印诊断信息
2026-07-02 14:29:23 +08:00
wangfq d559294359 fix: 添加 format_sensor_json 前置声明,修复 implicit declaration 编译错误 2026-07-02 14:21:06 +08:00
wangfq 6acd788d13 fix: 0xC0 帧通过回调直接驱动网络上报
loop_uart_proto:
- 新增 lup_sensor_cb_t 回调类型 + lup_set_sensor_callback
- lup_process_frame 收到 0xC0 → 调用注册的回调推送数据

tcp_json_srv:
- json_sensor_callback: 检查 g_report_active → 解析 → TCP 发送
- tcp_json_srv_init: 注册回调

usart_biz:
- uart_srv: 0xC0 由回调直接 TCP 推送,BLE 连接时也转发 BLE
- 移除旧的 _report_flag 轮询路径

数据流: ISR → lup_process_frame(校验) → json_sensor_callback → WCHNET_SocketSend
2026-07-02 14:15:28 +08:00
wangfq 7c2927d836 fix: 0xC0 帧必须经 lup_process_frame 校验后再分流
修改前: 0xC0 帧绕过 lup_process_frame,校验未执行
修改后: 所有 0x7F 帧先统一校验,0xC0 由校验后的数据分流处理

流程: ISR→lup_feed_byte→uart_srv→lup_process_frame(校验)→
      0xC0→_report_flag→tcp_json_push_sensor→TCP推送
2026-07-02 13:56:45 +08:00