Commit Graph

24 Commits

Author SHA1 Message Date
wangfq
c875cf383b fix: 修复 HeartBeat 大小写不匹配导致交互未被记录的问题
根本原因: 设备发送 Method='HeartBeat'(大写B), 代码匹配'Heartbeat'(小写b),
        心跳包被静默忽略, record_interaction 未调用, 导致监控误判为离线。

修复:
- UDP/TCP 方法匹配改为 case-insensitive (method_lower)
- handle_timestamp 增加 record_interaction 调用 (TimeStamp 也是设备交互)
- TCP 连接/断开时写入 tb_device_log 事件日志 (tcp_connect/tcp_disconnect)
2026-06-10 10:01:07 +08:00
wangfq
11f1c4f55b fix: device_status_monitor 增加 dnt_info 全表扫描,修正状态不一致
- 新增 get_all_device_serials() 查询 dnt_info 全表
- device_status_monitor 改为三阶段:
  Phase 1: 遍历 _registry 活跃设备
  Phase 2: 扫描 dnt_info 全表,修正 DB 状态与交互实际不符的情况:
    - state=1(在线) 但 >60s 无交互 → 更新为离线
    - state=0(离线) 但有交互 → 根据交互模式更新
  Phase 3: 预留清理位
- 提取 _apply_state_change() 避免重复代码
- Count_Off 登录时主动设 _device_status[serial]=1,
  防止刚登录只有 1 条交互记录时被误判为 通信不良
2026-06-10 09:36:01 +08:00
wangfq
ef890fafc6 feat: 设备事件日志 + 在线/离线状态监控
- 新增 tb_device_log 表 (device_serial, device_ip, event_type, event_content, create_time)
- dnt_info.state 扩展为 0=离线 1=在线 2=通信不良
- handle_count_off 收到 Count_Off 后写入 login 事件日志
- 新增 device_status_monitor 后台任务,每 5s 检测设备状态:
  - 3次交互间隔均<10s → 在线
  - 1分钟内<4次交互 → 通信不良
  - >1分钟无交互 → 离线
- 状态变化时同步写入 tb_device_log + dnt_info
- 所有设备交互点 (心跳/TSReport/SerialNet/解析成功) 均记录 interaction 时间戳
2026-06-10 09:14:24 +08:00
wangfq
3a74759066 fix(B4): 波动测试记录写入 sub_type/str_type,从工装配置 DevType 获取
- 新增 get_fixture_dev_type() 查询工装配的 DevType
- insert_wave_data 自动补充 sub_type(型号编码) 和 str_type(PD132/DLD110)
2026-06-08 11:31:42 +08:00
wangfq
68c6d0bcfe feat(db): 新增线圈参数表/模拟车辆参数表 + tb_fixture_param/tb_state_tst 关联字段
- CREATE TABLE tb_coil_info (线圈编号/名称/电感量/形状/尺寸/圈数/电阻/材质/备注)
- CREATE TABLE tb_simulate_car (模拟编号/名称/形状/尺寸/材质/备注)
- ALTER TABLE tb_fixture_param ADD coil_id, simulate_car_id
- ALTER TABLE tb_state_tst ADD coil_id, simulate_car_id
- 新增 get_fixture_coil_car_ids() 查询当前关联
- insert_test_result/insert_wave_data 自动从 fixture 获取线圈/车辆并记录
2026-06-08 10:42:04 +08:00
wangfq
844de70017 feat: relay_code 存储+解析 — B2/B4 以原始 int 值写入 tb_state_tst
- insert_test_result 增加 relay_code 参数
- insert_wave_data: relay_out 改为 relay_code (int)
- handlers.py: B2/B4 解析传递 status.relay_out 原始值
- relay_out VARCHAR 列保留兼容
2026-06-05 17:56:52 +08:00
wangfq
dc1d2b8871 fix: 恢复 FarStay 为 2 字节 — 与 NearStay 一致 2026-06-03 13:40:18 +08:00
wangfq
7e5fe2cccd fix: FarStay 2B→1B 匹配设备固件,修正 parse_4c_params 偏移 2026-06-03 11:52:37 +08:00
wangfq
6724af7951 fix: ALTER TABLE 迁移补充 tb_fixture_param 缺失的 V2.0.3 波动参数字段
CREATE TABLE IF NOT EXISTS 不会更新已存在的旧表,
新增 ALTER TABLE ADD COLUMN 自动迁移逻辑(列已存在时忽略)
2026-06-02 18:33:22 +08:00
wangfq
2d6c9f03dd feat: DG430 V2.0.3 — 波动测试模式支持
- dg430.py: 新增 DG430WaveStatus + parse_b4_wave_status() 0xB4解析
- dg430.py: 0x4C 扩展6字段(向后兼容旧版长度)
- models.py: tb_fixture_param DDL + upsert 新增6个波动参数
- handlers.py: parse_loop 添加0xB4处理; 0x4C传参扩展
- TestMode=1 模拟过车→波动测试 (注释)
2026-06-02 18:06:07 +08:00
wangfq
6ecc653133 chore: 精简 requirements.txt — 仅保留直接依赖 aiomysql+uvloop,移除未使用的传递依赖 2026-06-01 08:34:39 +08:00
wangfq
e7c20c69d2 feat: 工装配置功能 — 新增 0x4A~0x4E 协议解析、tb_fixture_param/tb_vechicle_base_test 表、SerialNet 响应匹配
- dg430.py: 新增 parse_4a_version, parse_flag_response, parse_4c_params, get_packet_cmd
- handlers.py: parse_loop 增加 0x4C/非B2 指令处理,0x4C 响应自动更新 tb_fixture_param
- handlers.py: 测试指令(B0/B1/BA/BB/BC)Flag 不匹配 serialnet,仅 B2 标记完成
- handlers.py: 新增 serialnet_response_loop 处理 dat_type=9
- models.py: 新增 tb_fixture_param + tb_vechicle_base_test 表 DDL + CRUD
- server.py: 注册 serialnet_response_loop
2026-05-29 17:25:54 +08:00
wangfq
43fd3e7be9 feat: 新增 tb_user、tb_log 表 2026-05-28 13:58:08 +08:00
wangfq
df461362f5 fix: serialnet_loop 改为直接查 tb_serialnet,不依赖 _registry 2026-05-28 12:08:29 +08:00
wangfq
85e7f66b19 fix: SerialNet 下发目标端口改为设备UDP 4900 2026-05-28 10:51:12 +08:00
wangfq
d6e169ce12 chore: 默认 MySQL 用户 dg / 密码 123456 2026-05-28 10:31:21 +08:00
wangfq
a1f4dcd4bf fix: callable 不是类型,改为 object 注解 2026-05-28 10:00:08 +08:00
wangfq
7a6f56339c feat: 新增 tb_serialnet 透传发送表 + serialnet_loop 轮询下发 + B2响应匹配 + 超时检测 2026-05-28 09:40:28 +08:00
wangfq
97302caf6b fix: 支持拼接多包解析 + 校验失败标记 state=3
- dg430.py: 新增 split_packets() 按 STX+LEN 拆分拼接的 DG430 数据包
- handlers.py: parse_loop 拆分后只解析 B2 状态上报包,非 B2 跳过
- models.py: mark_parsed 改为 mark_record_state(state) 支持自定义状态
- 校验失败 → state=3; 解析成功 → state=1
2026-05-27 16:39:39 +08:00
wangfq
8c5389670d fix: 修正设备接入流程
- Count_Off 改为读取 Data.Device_id (设备返回格式), 不再回复设备
- TimeStamp 改为同步函数 (无异步 IO)
- TCP 改用 JSON 流解析 (raw_decode), 支持紧凑 JSON 和 NDJSON
- TSReport/SerialNet 返回确认消息
2026-05-27 14:17:36 +08:00
wangfq
35a2cc7d20 chore: 添加 .venv/ 到 gitignore,更新 README 加入 venv 步骤 2026-05-27 11:21:43 +08:00
wangfq
b1cea017ab docs: 修正协议文档相对路径 2026-05-27 10:34:15 +08:00
wangfq
bcd4cc6a8d fix: DG430 协议校验 off-by-one,payload 范围修正 2026-05-27 10:25:40 +08:00
wangfq
a10d176f68 feat: EDC 服务 — Python/uvloop 实现,UDP/TCP 异步网络服务 2026-05-27 10:23:15 +08:00