# libcom_router — 通信路由中枢 API 参考

## 模块概述

**位置**: `src/system/libcom_router/`

**定位**: RTU 通信路由中枢。负责:
- 转发通道管理 (TCP/串口 → FTU 串口透传)
- FTU 串口接收分路 (按帧内容区分维护PC/self_ptl)
- 跨模块回调注册 (与 self_ptl 解耦)

**依赖**: `libcomm`, `libicp67`(帧头检测), `liblog`, `libdatacenter`

**不依赖**: self_ptl, libiec (通过 `app_wiring()` 运行时解耦)

## 架构

```
                    libcom_router
               ┌──────────┼──────────┐
               │                     │
         转发通道(TCP)          FTU 串口
               │                     │
    Step1: 直接透传 ────→  ┌── Step2: 分路 ──┐
                           │                  │
                    ICP67 dev=0  IEC 0x68  ICP67 dev=1
                        │          │          │
                    回传转发源  回传转发源   self_ptl
                   (维护软件)  (维护软件)  (RTU自身)
```

**注意**: RTU 自身的 IEC-104 不走 com_router，由 libiec 直管 libcomm。

## 文件清单

| 文件 | 行数 | 说明 |
|---|---|---|
| `inc/com_router.h` | 98 | 通道配置、转发规则、回调注册 API |
| `src/com_router.cpp` | 385 | 通道管理、配置加载、状态回调、主循环 |
| `src/com_router_dispatch.cpp` | 191 | 转发透传 + FTU 串口分路 |

## 对外 API

### 配置加载

```c
int com_router_config_load(const char *json_path);
```

从 JSON 加载通道配置和转发规则。未调用时使用硬编码默认配置。

### 回调注册 (模块解耦)

```c
typedef void (*com_router_dispatch_cb)(uint32_t interface, const unsigned char *data, int len);

int com_router_register_dispatch(const char *bind_app, com_router_dispatch_cb cb);
```

协议模块通过此 API 接收 FTU 串口的 ICP67 dev=1 帧。

**调用者**: `app_sys.cpp` → `app_wiring()`

**示例**:
```c
com_router_register_dispatch("self_ptl", self_ptl_router_wrapper);
```

### 查询 API

```c
uint32_t com_router_interface_get(const char *key);   // key → interface
int      com_router_fd_get(const char *key);           // key → socket_fd
int      com_router_id_get_by_bind(const char *bind_app); // bind_app → ch_id
```

### 应用线程入口

```c
int   app_com_router_init1(void *arg);   // 创建通道 + 注册回调
int   app_com_router_init2(void *arg);   // 连接通道
void *app_com_router(void *arg);         // 主循环
```

## 路由规则 (v2 — bind_app 协议绑定)

```
com_router_recv_cb(id, fd, data, len)
│
├─ Step 1: forward_rule → FTU串口透传
│
├─ Step 2: bind_app 非空 → dispatch 投递给注册协议
│
└─ Step 3: bind_app 为空 → FTU串口帧内容分路
    ├─ ICP67 dev=0 → 回传维护
    ├─ IEC  → 回传维护
    └─ ICP67 dev≠0 → MQ → self_ptl
```

**示例**: `tcp_master(:2404)` 配置 `bind_app="iec"` → 整帧直投 libiec

### bind_app 注册 API

```c
typedef void (*com_router_dispatch_cb)(uint32_t interface, const unsigned char *data, int len);

int com_router_register_dispatch(const char *bind_app, com_router_dispatch_cb cb);
```

## 配置结构

### 通道配置

```c
typedef struct {
    char     key[32];           // "serial_ftu"
    char     bind_app[16];      // "" (FTU串口不需要绑定)
    int      type;              // COMM_TYPE_UART / COMM_TYPE_TCP_SERVER
    union_comm_para para;       // 通道参数
    int      id;                // comm_create 返回值
    int      socket_fd;         // 当前 fd, -1=未连接
    uint32_t interface;         // (id<<16)|fd
} com_channel_t;
```

### 转发规则

```c
typedef struct {
    char  listen_ip[32];        // "0.0.0.0"
    int   listen_port;          // 2405
    char  target_type[16];      // "uart"
    char  target_dev[64];       // "/dev/ttyS1"
    int   sock_fd;              // accept 后的 client fd
    int   target_ch_id;         // 目标通道 id
} com_forward_rule_t;
```

## 默认配置 (硬编码兜底)

| 通道 | key | 类型 | bind_app | 说明 |
|---|---|---|---|---|
| 串口 | `serial_ftu` | UART 115200 | `""` | FTU连接, bind_app 空→帧内容分路 |
| TCP | `tcp_master` | TCP :2404 | `"iec"` | IEC-104主站, bind_app 绑定后直投 libiec |

| 转发规则 | 监听 | 目标 | 说明 |
|---|---|---|---|
| 维护透传 | 0.0.0.0:2405 | FTU 串口 | 维护软件直连 FTU |

## 多 FTU 扩展

```
新增 FTU 只需:
1. 配置加一个串口通道 + 一个转发规则
2. com_router 自动按帧的 dev_addr 分路
3. self_ptl 通过 interface 区分不同 FTU
```

## 完成状态

### ✅ 已完成

- [x] 通道创建/连接/状态回调
- [x] 转发通道 → FTU 串口透传
- [x] FTU 串口接收三路分路 (ICP67 dev=0 / IEC / ICP67 dev=1)
- [x] 跨模块回调注册 (app_wiring 解耦)
- [x] bind_app 协议绑定路由 + register_dispatch API
- [x] JSON 解析 channels/forward_rules/bind_app
- [x] TCP accept + 客户端 fd 管理
- [x] X-Macro + EV_STOP
- [x] 通道健康检测

### ⬜ 未完成

- [ ] 串口热插拔/自动重连
- [ ] 单元测试 (test_com_router.c)
- [ ] 通道流量统计上报 (EV_TIMER3)
