XuJiacheng 86a1e79153 feat: 初始化后端服务基础架构与核心组件
- 添加项目基础结构,包括 .gitignore、package.json、Docker 配置和环境变量示例
- 实现核心模块:Kafka 消费者、PostgreSQL 数据库管理器、Redis 客户端与错误队列
- 添加工具类:日志记录器、指标收集器、UUID 生成器
- 实现数据处理器,支持 0x36 上报和 0x0F 命令的解析与存储
- 添加数据库初始化脚本和分区管理,支持按时间范围分区
- 引入 Zod 数据验证和 Vitest 单元测试框架
- 提供完整的项目文档,包括数据库设计、Kafka 格式规范和 Redis 集成协议
2026-01-30 11:05:00 +08:00

BLS RCU Action Server 开发文档

1. 项目概述

本项目旨在构建一个后端服务,负责从 Kafka 接收 RCU客房控制单元的通讯日志解析数据结构并将其持久化存储到 PostgreSQL 数据库中。

核心目标是将不同类型的通讯协议数据0x36 上报、0x0F 下发、ACK统一存储并针对不定长数据结构采用 JSON 格式进行灵活保存。

2. 系统架构

数据流向: MCU/Server (产生数据) -> Kafka (消息队列) -> Action Server (消费 & 解析) -> PostgreSQL (存储)

  • Kafka Topic: blwlog4Nodejs-rcu-action-topic (分区数: 6)
  • 数据库: PostgreSQL

3. 数据库设计

数据库名:bls_rcu_action 模式名: rcu_action

3.1 表结构设计

表名: rcu_action_events

字段名 类型 说明 备注
guid VARCHAR(32) 主键 (Key2) 32位无符号UUID
ts_ms BIGINT 日志产生时间 (Key1) 必填 (L49)
write_ts_ms BIGINT 入库时间 必填 (L50)
hotel_id INTEGER 酒店ID 必填 (L51) Index
room_id VARCHAR(32) 房间ID 必填 (L52) Index
device_id VARCHAR(32) 设备ID 必填 (新增) Index
direction VARCHAR(10) 数据方向 必填 (L53) "上报"/"下发" Index
cmd_word VARCHAR(10) 命令字 必填 (L54) 如 "0x36", "0x0F" Index
frame_id INTEGER 通讯帧号 必填 (L55) 用于串联命令与状态
udp_raw TEXT UDP消息原文 必填 (L56) Hex字符串
action_type VARCHAR(20) 记录行为类型 必填 (L57) Index
sys_lock_status SMALLINT 系统锁状态 (L59) 可空
report_count SMALLINT 本次上报数量 (L60) 可空
dev_type SMALLINT 设备类型 (L61) 可空 (统一字段)
dev_addr SMALLINT 设备地址 (L62) 可空 (统一字段)
dev_loop INTEGER 设备回路 (L63) 可空 (统一字段)
dev_data INTEGER 设备状态 (L64) 可空 (0x36状态)
fault_count SMALLINT 本次故障数量 (L65) 可空
error_type SMALLINT 故障类型 (L69) 可空 (0x36故障)
error_data SMALLINT 故障内容 (L70) 可空 (0x36故障)
type_l SMALLINT 执行方式 可空 (0x0F下发)
type_h SMALLINT 执行内容 可空 (0x0F下发)
details JSONB 业务详情数据 存储不定长设备列表、故障信息等
extra JSONB 扩展信息 存储通讯原文等扩展数据

主键定义: (ts_ms, guid) 索引定义: 备注带index的字段为需要索引的字段用于提高查询效率。

3.2 字典定义

Action Type (记录行为类型):

  • "0FACK": ACK (应答)
  • "0F下发": 下发控制 (0x0F 下发)
  • "36上报": 设备回路状态 (0x36 上报)

Direction (方向):

  • "上报": Upload
  • "下发": Download

4. 数据解析与存储映射

4.1 0x36 上报数据 (设备状态/故障)

  • 命令字: "0x36"
  • 拆分逻辑: 根据 project.md 说明,一条 UDP 可能包含多个设备状态,需拆分为多条记录入库,每条记录填充 dev_type 等字段。同时将完整的不定长列表存入 details 以便追溯。
  • Action Type: 4 (设备回路状态)

Mapping:

  • sys_lock_status -> P0
  • report_count -> P7
  • dev_type, dev_addr... -> 从 P8~P13 循环解析,每组生成一条 DB 记录
  • details: { "all_devices": [...], "all_faults": [...] }
  • extra: { "raw_hex": "..." }

4.2 0x0F 下发数据 (控制指令)

  • 命令字: "0x0F"
  • Action Type: 2 (下发控制)
  • 存储逻辑: 主要是控制指令,通常作为单条记录存储。若包含多个设备控制,可选择存第一条到字段,或仅存入 JSON。根据 "0x0F不定长存为JSON" 的需求,主要依赖 details 字段。

Mapping:

  • details: { "control_params": [ ... ] }
  • extra: { "raw_hex": "..." }

4.3 0x0F 上报数据 (ACK)

  • 命令字: "0x0F"
  • Action Type: "0FACK" (ACK)

Mapping:

  • details: { "ack_code": "0x00" }
  • extra: { "raw_hex": "..." }
Description
动作上报,控制下发 日志入rcu_action库 服务
Readme 183 KiB
Languages
JavaScript 99.7%
Dockerfile 0.3%