# 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": "..." }`