# IH-Simulate **Repository Path**: bruceyan/ih-simulate ## Basic Information - **Project Name**: IH-Simulate - **Description**: 国强标协议模拟 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-29 - **Last Updated**: 2026-10-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # IH-Simulate — 智能家居互联互通(IoT 国强标)设备模拟 模拟**主控侧 App(配置单元/控制单元)**与**被控侧设备(IP 执行单元)**, 对局域网直连通信协议(依据《智能家居互联互通 第1部分:局域网接入要求》 7.1 章节)进行发现、传输、安全会话协商等协议验证。 ## 目录结构 ``` IH-Simulate/ ├── main.py 入口:PyQt 模式选择(主控 / 被控) ├── app/ 主控侧:配置单元/控制单元业务逻辑 + GUI ├── device/ 被控侧:IP 执行单元业务逻辑 + GUI ├── ih_protocol/ 双侧公共协议栈 │ ├── common.py 常量/返回码(表7-5)/TLV8/默认参数(表7-11) │ ├── transport.py 应用传输层(7.1.2):帧格式(表7-1~7-3)、参数同步、 │ │ 滑动窗口、分片重组、确认重传、TCP 流去帧器 │ ├── session.py 安全会话层(7.1.3):会话帧(表7-6/7-7)、MsgID 防重放 │ ├── business.py 业务层(7.1.4):业务帧(表7-8)、TransactionID 管理 │ ├── mdns.py mDNS 发现(8.1.3):DNS 编解码、被控侧通告 │ │ (MdnsResponder)、主控侧扫描(MdnsScanner) │ └── stack.py 三层组装管线(图7-3 封装关系) ├── doc/ 规范文档 ├── task/ 任务说明 └── tests/ selftest.py 协议回环自测(55 项) mdns_test.py mDNS 真实多播联调 ``` ## 运行 ```bash pip install -r requirements.txt python main.py # 不带参数时弹出模式选择对话框 ``` 也可用命令行参数**直接启动**并指定各模式的参数(跳过对话框): ```bash python main.py --mode app # 主控端 python main.py --mode app --auto-scan # 主控端:启动即扫描 python main.py --mode app --host 192.168.1.20 --port 8899 --auto-connect python main.py --mode device # 被控端(默认监听 8899) python main.py --mode device --listen-port 8900 --associated python main.py --mode device --device-id 0102030405060708090A0B \ --product-id IH-SIM-DEV-02 python main.py --help # 查看全部参数 ``` | 参数 | 适用 | 说明 | | --- | --- | --- | | `-m/--mode {app,device}` | 通用 | 直接进入主控 / 被控模式;缺省时弹窗选择 | | `--listen-port` | 被控 | 业务监听端口(默认 8899) | | `--device-id` | 被控 | DeviceID,22 位十六进制(11 字节);缺省随机生成 | | `--brand-id` `--category-id` `--discription-code` `--product-id` `--model-id` | 被控 | 设备身份字段(mDNS TXT) | | `--capability` | 被控 | 能力标识,支持 `0x` 前缀(如 `0x0002`) | | `--heartbeat-period` | 被控 | 心跳周期(秒) | | `--associated` | 被控 | 启动即已配网关联(通告 `_ISo`);缺省 `_ISp` 待配置 | | `--host` / `--port` | 主控 | 预填直连设备地址 | | `--auto-scan` | 主控 | 启动后自动执行一次 mDNS 扫描 | | `--auto-connect` | 主控 | 启动后按 `--host/--port` 自动连接 | 启动后选择模式: - **主控模式**:「扫描」按钮按 8.1.3 进行 mDNS 扫描(指数退避 PTR 查询, 总超时 30s,每次点击先清空当前列表再重新扫描),结果实时呈现于设备列表; 双击设备行即用其 IP:端口 直连, 点击「连接」自动完成参数同步,「发送测试报文」走完整 传输→会话→业务 链路(SIM_PING/SIM_PONG)。仍可手工输入 IP:端口 直连。 「执行测试用例」按钮打开「执行测试用例窗口」:加载《国强标通信协议 验证(IP).xlsx》「测试用例完整描述」sheet 中的 102 条用例,点击「开始 执行」依次运行并记录发送/接收 hex 报文与通过-不通过判定(可人工覆盖)。 已连接被控设备时,交互类用例走真实 TCP 端到端执行,表格同时记录 **主控侧与被控侧双侧收发 hex**(被控侧经其控制通道上报);被控端需以 默认参数启动(业务端口 8899,控制通道 8900),或用 `--control-port` 指定并在执行窗口保持连接。 - **被控模式**:启动即监听业务端口(默认 8899)并持续通告 `_ISp._udp.local`(待配置关联);「重置」按钮按 8.1.3 重新通告 (模拟物理按键触发);勾选「已配网关联」切换通告 `_ISo._udp.local` (TXT 携带 ModelID/HeartbeatPeriod)。 ## 协议验证 ```bash python -m tests.selftest # 协议栈回环自测(55 项) python -m tests.mdns_test # mDNS 真实多播联调(需可绑定 UDP 5353) ``` 覆盖:帧编解码往返、序号比较规则(含回绕)、参数同步三次交互、分片重组、 重组超限丢弃、丢包超时重传恢复、乱序重复确认与快速重传、TCP 粘包去帧、 会话帧校验(MsgID=0 丢弃/防重放/无效组合丢弃)、业务全链路、事务超时释放、 mDNS DNS 编解码(含压缩指针/goodbye)、PTR+SRV+TXT+A 设备解析、 _ISp/_ISo 状态切换与 goodbye 后不应答。 ## 当前进度 / 待办 - [x] 工程结构与三层协议栈(7.1) - [x] PyQt 模式选择与主控/被控 GUI - [x] TCP 直连承载 + 参数同步 + 可靠传输 + 模拟回环业务 - [x] mDNS 发现(8.1.3):主控「+」扫描、被控「重置」通告/应答、 _ISp/_ISo 状态切换、goodbye - [x] 执行测试用例窗口:加载 xlsx「测试用例完整描述」102 条用例并依次 自动执行,记录主控/被控**双侧**收发 hex、自动判定通过-不通过(可 人工覆盖);已连接被控设备时交互类用例走真实 TCP 端到端执行, 被控端通过控制通道上报本端收发 hex 与协议事件;会话加密/真实业务 OpCode 等未支撑项如实标记「不通过」并附原因 - [ ] 安全会话协商与加密(8.8.3,CryptoProvider 接口已预留) - [ ] 各业务接口(第 8 章 OpCode)