network: 台架 IP 迁到 192.168.31.100,并把重复写死的值收进单一真源
CI / 静态门禁 (pre-commit) (push) Failing after 25s
CI / 主机侧单测 (MSVC) (push) Successful in 48s

分两段(用户裁定 2026-11-02):先做地址迁移,再把同类字面量收敛成
单一真源,以后再改地址只动一处。

一、IP 迁移 192.168.1.100 → 192.168.31.100(gw 同步 → .31.1)
- 工厂默认:Drivers/BSP/NETCFG/net_cfg.c 的 NET_CFG_DEF_IP/_GW
- 注释/文档示例、主机与板级测试、台架 py 脚本、两份 sim_config.ini
- 字节序教学点同步换算 hex:0x6401A8C0 → 0x641FA8C0(内存
  C0 A8 1F 64),旧版示例引文与历史 Trap 记录按冻结纪律不动
- UI 黄金基准:网口设置 4 态 + shot_info 共 5 张 .bin 由
  check_content_pages.py --update 重刷(渲染值 IP 变了,属预期变更)
- 保留判定:客户点表引用(IEC104/继电保护规划)、芯片手册摘录、
  日期冻结的变更记录行、已退役台架档案 MDK-ARM/retracted_bench_*

二、单一真源收口(A+B+C+D,用户批准全做)
- 新建 test/host/bench_defaults.py:台架 py 默认值唯一定义点
  (DEVICE_IP/DEVICE_GW/PC_IP/NET_BCAST),22 个脚本改为引用;
  MDK-ARM 两探针与 scripts/board_ui_nav.py 经 sys.path shim 引入
- test/board/net_test_task.h 新增 TEST_PC_PEER_IP,板测三处
  PHASE*_REMOTE_IP 改引该宏(保留 -D 覆盖);Phase1 断言改
  memcmp 数组比较,数组各只出现一次
- simulator/tests/check_content_pages.py 从 net_cfg.c 正则解析
  NET_CFG_DEF_* 推导期望值(解析失败即报错、不静默兜底),
  脚本内台架 IP 字面量清零
- 装饰性注释去具体值(net_cfg.h/net_socket.h/net_socket.c/
  net_socket_sim.c);字节序教学 hex 对刻意保留为唯一写值点
- 刻意不动:主机单测夹具 IP(逐文件钉住的任意值是正确测试
  实践)、文档正文 IP(那是文档内容本身)

顺带:scripts/gen_task_table.py 规范串清掉「,B5」——编号清退提交
72b4b094 改了受管区没重跑生成器,task-table 门禁因此一直红

验证:产品 @build 0/0;CH395F 套件开关构建 0/0 后还原产品态;
6 套主机单测 rc=0;content_pages(含宏推导路径)/菜单 8 态/
推流位比对全 PASS;bom-drift 99 无漂移;doc-links/coding-standard/
cppcheck 绿;py_compile 23 文件 + --help 冒烟(含 shim 绝对路径)
This commit is contained in:
2026-11-02 14:36:36 +08:00
parent 9a71265f41
commit 7efa58d9a1
62 changed files with 338 additions and 224 deletions
+19
View File
@@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
"""台架连接默认值单一真源(test/host/*.py 直接 `import bench_defaults`)。
2026-11-02 设备 IP 由 192.168.1.100 迁到 192.168.31.100 时,25+ 个脚本的
argparse 缺省值/模块常量逐处爆红——收口到本文件后,换台架只改这里。
对应关系(同一事实一处详述,勿在别处复制值):
- 设备 IP/网关:编译期工厂默认在 Drivers/BSP/NETCFG/net_cfg.c 的 NET_CFG_DEF_*,
本文件是**台架脚本侧**的连接缺省,两者当前一致但语义不同(工厂默认 vs 台架约定)。
- PC 对端 IP:板测固件侧单一真源是 test/board/net_test_task.h 的 TEST_PC_PEER_IP,
本文件 PC_IP 与其保持同值(改台架两处都要动——C 与 Python 无共享编译单元)。
"""
DEVICE_IP = "192.168.31.100" # DTU 板子(台架标准地址,用户裁定 2026-11-02)
DEVICE_GW = "192.168.31.1" # 台架网关(PC 热点/路由侧)
PC_IP = "192.168.31.2" # 台架 PC 自身网卡地址(= TEST_PC_PEER_IP 同值)
# /24 子网定向广播(从 DEVICE_IP 现算,不再单独钉一个 .255 字面量)
NET_BCAST = DEVICE_IP.rsplit(".", 1)[0] + ".255"
+2 -2
View File
@@ -474,8 +474,8 @@ static void tc_ip4(void) {
CHECK(s_decode_ip4(d, "0.0.0.0") == 0 && d[0] == 0u && d[3] == 0u, "all-zero");
CHECK(s_decode_ip4(d, "255.255.255.255") == 0 &&
d[0] == 255u && d[3] == 255u, "all-255");
CHECK(s_decode_ip4(d, "192.168.1.100") == 0 &&
d[0] == 192u && d[1] == 168u && d[2] == 1u && d[3] == 100u, "typical");
CHECK(s_decode_ip4(d, "192.168.31.100") == 0 &&
d[0] == 192u && d[1] == 168u && d[2] == 31u && d[3] == 100u, "typical");
CHECK(s_decode_ip4(d, "1.2.3") == -1, "too few octets rejected");
CHECK(s_decode_ip4(d, "1.2.3.4.5") == -1, "too many octets rejected");
CHECK(s_decode_ip4(d, "256.1.1.1") == -1, "octet >255 rejected");
@@ -268,9 +268,9 @@ static void tc_read(void)
/* 001 成功 + 只读模式 */
reset_all();
(void)ff_fake_mkfile(P_CFG, (const uint8_t *)"net ip=192.168.1.100\n", 20u);
ok = (cfg_store_read(P_CFG, buf, sizeof(buf), &n) == 0) && (n == 20u)
&& (memcmp(buf, "net ip=192.168.1.100\n", 20u) == 0)
(void)ff_fake_mkfile(P_CFG, (const uint8_t *)"net ip=192.168.31.100\n", 21u);
ok = (cfg_store_read(P_CFG, buf, sizeof(buf), &n) == 0) && (n == 21u)
&& (memcmp(buf, "net ip=192.168.31.100\n", 21u) == 0)
&& (g_ff_obs.last_open_mode == (BYTE)FA_READ)
&& (s_lock_waits == 1) && (s_lock_releases == 1) && (s_lock_seq_err == 0);
CHECK(ok, "TC-CFGFST-001 read ok: content and length correct, opened with FA_READ only (no write bit)");
+3 -1
View File
@@ -11,6 +11,8 @@ import struct
import sys
import time
import bench_defaults # 台架连接默认值单一真源
# {idx: (tx_len, close_mode)} 与固件表一致
VARS = {
0: (100, 0), # 0ms control
@@ -125,7 +127,7 @@ def e4_round(host, rg, rounds_per_variant, first_budget):
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--host", default="192.168.1.100")
ap.add_argument("--host", default=bench_defaults.DEVICE_IP)
ap.add_argument("--cycles", type=int, default=3)
ap.add_argument("--mode", choices=["legacy", "e4"], default="legacy")
ap.add_argument("--rounds", type=int, default=10, help="e4: rounds per variant")
+18 -16
View File
@@ -19,7 +19,7 @@ CH395F BSD Socket API 测试程序
tcp_file - 文件收发:PC 作 Client 连 MCU:8080(阶段 8),--op send/recv 收发 100KB 文件(含 CRC32)
选项:
--ip 目标 IP 地址(默认: 192.168.1.100)
--ip 目标 IP 地址(默认见 bench_defaults.DEVICE_IP)
--port 端口号(默认: 8080)
--count 测试次数(默认: 10)
--size 数据包大小(默认: 1024)
@@ -28,7 +28,7 @@ CH395F BSD Socket API 测试程序
示例:
# 测试 CH395F TCP Server
python ch395f_socket_test.py tcp_client --ip 192.168.1.100 --port 8080
python ch395f_socket_test.py tcp_client --port 8080
# 测试 CH395F TCP Client
python ch395f_socket_test.py tcp_server --port 8080
@@ -37,18 +37,18 @@ CH395F BSD Socket API 测试程序
python ch395f_socket_test.py udp_server --port 8888
# 测试 CH395F UDP Server
python ch395f_socket_test.py udp_client --ip 192.168.1.100 --port 8888
python ch395f_socket_test.py udp_client --port 8888
# 压力测试(多连接)
python ch395f_socket_test.py stress --ip 192.168.1.100 --port 8080 --count 7
python ch395f_socket_test.py stress --port 8080 --count 7
# 阶段 5 双向大块(先收 256KB 再回放 256KB)
python ch395f_socket_test.py tcp_bulk --port 8081 --bulk 262144 --chunk 4096
# 阶段 8 文件收发(PC 连 MCU:8080)
python ch395f_socket_test.py tcp_file --ip 192.168.1.100 --port 8080 --op recv --file rx_100k.bin --size 102400
python ch395f_socket_test.py tcp_file --ip 192.168.1.100 --port 8080 --op send --file tx_100k.bin
python ch395f_socket_test.py tcp_file --ip 192.168.1.100 --port 8080 --op echo # TC-NET-803 回显(MCU 为 server)
python ch395f_socket_test.py tcp_file --port 8080 --op recv --file rx_100k.bin --size 102400
python ch395f_socket_test.py tcp_file --port 8080 --op send --file tx_100k.bin
python ch395f_socket_test.py tcp_file --port 8080 --op echo # TC-NET-803 回显(MCU 为 server)
"""
import socket
@@ -63,6 +63,8 @@ import string
import zlib
from datetime import datetime
import bench_defaults # 台架连接默认值单一真源
# TCP 回显服务器(tcp_server 模式)参数
INTER_ACCEPT_TIMEOUT = 60 # 首个连接后,等待下一个连接的超时秒数
ECHO_IDLE_TIMEOUT = 30 # 连接内无数据的空闲超时秒数
@@ -963,7 +965,7 @@ def dhcp_server_test(args):
options)
# Try both global broadcast and subnet broadcast
for bcast in ['255.255.255.255', '192.168.1.255']:
for bcast in ['255.255.255.255', bench_defaults.NET_BCAST]:
sock.sendto(offer, (bcast, DHCP_CLIENT_PORT))
log_success("发送 DHCP OFFER")
@@ -994,7 +996,7 @@ def dhcp_server_test(args):
_ip_to_bytes(offer_ip),
_ip_to_bytes(server_ip),
ack_options)
for bcast in ['255.255.255.255', '192.168.1.255']:
for bcast in ['255.255.255.255', bench_defaults.NET_BCAST]:
sock.sendto(ack, (bcast, DHCP_CLIENT_PORT))
log_success(f"发送 DHCP ACK → {offer_ip}")
log_success("DHCP 分配完成!")
@@ -1016,7 +1018,7 @@ def dhcp_server_test(args):
_ip_to_bytes(offer_ip),
_ip_to_bytes(server_ip),
options)
for bcast in ['255.255.255.255', '192.168.1.255']:
for bcast in ['255.255.255.255', bench_defaults.NET_BCAST]:
sock.sendto(offer, (bcast, DHCP_CLIENT_PORT))
log_info(f"重发 DHCP OFFER (retry={retry+1})")
except socket.timeout:
@@ -1245,10 +1247,10 @@ def main():
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
示例:
%(prog)s tcp_client --ip 192.168.1.100 --port 8080
%(prog)s tcp_client --port 8080
%(prog)s tcp_server --port 8080
%(prog)s stress --ip 192.168.1.100 --port 8080 --count 5
%(prog)s dhcp_server --dhcp-iface 192.168.1.2 --ip 192.168.1.100
%(prog)s stress --port 8080 --count 5
%(prog)s dhcp_server --dhcp-iface <PC 网卡 IP,见 bench_defaults.PC_IP> --ip <设备 IP>
%(prog)s tcp_bulk --port 8081 --bulk 262144 --chunk 4096
"""
)
@@ -1257,7 +1259,7 @@ def main():
'tcp_echo', 'udp_echo', 'stress', 'packet_size',
'dhcp_server', 'tcp_bulk', 'tcp_file'],
help='测试模式')
parser.add_argument('--ip', default='192.168.1.100', help='目标 IP 地址 / DHCP 待分配 IP')
parser.add_argument('--ip', default=bench_defaults.DEVICE_IP, help='目标 IP 地址 / DHCP 待分配 IP')
parser.add_argument('--port', type=int, default=8080, help='端口号')
parser.add_argument('--count', type=int, default=10, help='测试次数')
parser.add_argument('--size', type=int, default=1024, help='数据包大小')
@@ -1268,9 +1270,9 @@ def main():
help='tcp_file 方向: send=读文件发往 MCU, recv=从 MCU 收文件落盘, echo=连 MCU 回显')
parser.add_argument('--file', default=None, help='tcp_file 文件路经(send: 读取; recv: 写入)')
parser.add_argument('--max-conn', type=int, default=0, help='最大并发连接数(默认0=不限;按并发计数,非累计,TC-NET-704 并发测试用 8)')
parser.add_argument('--dhcp-iface', default='192.168.1.2', help='DHCP 服务器网卡 IP')
parser.add_argument('--dhcp-iface', default=bench_defaults.PC_IP, help='DHCP 服务器网卡 IP')
parser.add_argument('--dhcp-mask', default='255.255.255.0', help='DHCP 分配的子网掩码')
parser.add_argument('--dhcp-gw', default='192.168.1.1', help='DHCP 分配的网关')
parser.add_argument('--dhcp-gw', default=bench_defaults.DEVICE_GW, help='DHCP 分配的网关')
args = parser.parse_args()
+3 -1
View File
@@ -27,7 +27,9 @@ import socket
import sys
import time
DEV = "192.168.1.100"
import bench_defaults # 台架连接默认值单一真源
DEV = bench_defaults.DEVICE_IP
tag = sys.argv[1] if len(sys.argv) > 1 else "run"
t0 = time.time()
+3 -1
View File
@@ -30,6 +30,8 @@ import subprocess
import sys
import time
import bench_defaults # 台架连接默认值单一真源
TAG_C, TAG_D = 0xAA, 0xBB
CMD_KEEPLIVE = 0
RULE_NAME = "SELFHEAL-E11-DROP"
@@ -88,7 +90,7 @@ def connect(host: str, port: int, timeout: float = 5.0):
def main() -> int:
ap = argparse.ArgumentParser()
ap.add_argument("--host", default="192.168.1.100")
ap.add_argument("--host", default=bench_defaults.DEVICE_IP)
ap.add_argument("--port", type=int, default=7003)
ap.add_argument("--mode", choices=["idle", "block"], required=True)
ap.add_argument("--hold-s", type=float, default=90.0)
+3 -1
View File
@@ -19,6 +19,8 @@
import argparse, hashlib, io, random, re, socket, struct, sys, time
from ftplib import FTP, all_errors
import bench_defaults # 台架连接默认值单一真源
def log(m):
sys.stdout.write(m + "\n"); sys.stdout.flush()
@@ -66,7 +68,7 @@ def followup_ok(ip, port, size=4096):
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--ip", default="192.168.1.100")
ap.add_argument("--ip", default=bench_defaults.DEVICE_IP)
ap.add_argument("--port", type=int, default=21)
ap.add_argument("--rounds", type=int, default=10)
ap.add_argument("--send", type=int, default=8192, help="bytes sent before the RST")
+4 -2
View File
@@ -16,7 +16,7 @@
注意:CH395F 单连接——每步用完必须 quit() 释放 socket,否则下一步连不上;
跑之前确保 UI 远程显示(7003)/对时(8888)客户端未占用 socket。
用法(设备默认 192.168.1.100,出厂口令 admin/admin):
用法(设备默认见 bench_defaults.DEVICE_IP,出厂口令 admin/admin):
& '.venv\\Scripts\\python.exe' test/host/ftp_auth_bench.py
改过口令: ... --pwd <新口令>
跳过 60s 锁定等待(只验锁定触发不验解锁): ... --skip-unlock
@@ -32,6 +32,8 @@ import sys
import time
from ftplib import FTP, error_perm
import bench_defaults # 台架连接默认值单一真源
LOCK_WAIT_S = 62 # 固件锁定 60 s + 余量
@@ -66,7 +68,7 @@ def _try_login(host, port, timeout, user, pwd):
def main(argv=None):
ap = argparse.ArgumentParser(description="FTP auth bench matrix")
ap.add_argument("--host", default="192.168.1.100")
ap.add_argument("--host", default=bench_defaults.DEVICE_IP)
ap.add_argument("--port", type=int, default=21)
ap.add_argument("--timeout", type=int, default=15)
ap.add_argument("--user", default="admin")
+3 -1
View File
@@ -26,6 +26,8 @@ import sys
import time
from ftplib import FTP, error_perm
import bench_defaults # 台架连接默认值单一真源
NAME = "e12a.bin" # 8.3 短名(FatFs FF_USE_LFN=0)
@@ -45,7 +47,7 @@ def first_diff(a: bytes, b: bytes):
def main() -> int:
ap = argparse.ArgumentParser()
ap.add_argument("--host", default="192.168.1.100")
ap.add_argument("--host", default=bench_defaults.DEVICE_IP)
ap.add_argument("--port", type=int, default=21)
ap.add_argument("--user", default="admin")
ap.add_argument("--pwd", default="admin")
+4 -2
View File
@@ -16,7 +16,7 @@ break 并回 -1,cmd_list 据此回 **550**——目录一大,客户端拿到
3. LIST 的完成回包是 226 而不是 550(ftplib 在非 2xx 完成时会抛异常,正是这条)
清理:无论成败都逐个 DELE;删除失败会打 WARN(不影响判定,但会留残留文件要手清)。
用法:python ftp_list_fill_test.py [--host 192.168.1.100] [--files 26]
用法:python ftp_list_fill_test.py [--host <设备IP>] [--files 26]
[--user admin] [--password admin]
注:--files 26 是按每行约 63 B 反推的下限(26×63 ≈ 1638 > 1536);目录本来就有
条目时更小也能触发,取 26 保证空目录也能越过一块。
@@ -27,7 +27,9 @@ import io
import sys
from ftplib import FTP, all_errors
HOST = "192.168.1.100"
import bench_defaults # 台架连接默认值单一真源
HOST = bench_defaults.DEVICE_IP
PORT = 21
# 设备无匿名通道:账号取 /config.ini 的 [ftp],出厂默认 admin/admin
USER = "admin"
+4 -2
View File
@@ -12,7 +12,7 @@ net 层当作"刚建立就断开"释放。修复见 net_socket.c handle_disconne
内容校验;任一环节失败即退出码 1。
用法:
& '.venv\\Scripts\\python.exe' test/host/ftp_regression.py --host 192.168.1.100
& '.venv\\Scripts\\python.exe' test/host/ftp_regression.py --host <设备IP>
"""
import argparse
@@ -21,13 +21,15 @@ import sys
import time
from ftplib import FTP
import bench_defaults # 台架连接默认值单一真源
SMALL = b"D20-small-" + b"A" * 1017 # 1024B
BIG = bytes(((i * 7 + 3) & 0xFF) for i in range(32768)) # 32KB 模式数据
def main(argv=None):
ap = argparse.ArgumentParser(description="FTP data-connection regression (D20)")
ap.add_argument("--host", default="192.168.1.100", help="device IP")
ap.add_argument("--host", default=bench_defaults.DEVICE_IP, help="device IP")
ap.add_argument("--port", type=int, default=21, help="FTP control port")
ap.add_argument("--timeout", type=int, default=20, help="socket timeout (s)")
# 2026-10-11 起 FTP 强制鉴权:匿名登录被 530 拒;默认口令 admin/admin
+4 -2
View File
@@ -1,7 +1,7 @@
#!/usr/bin/env python3
"""
FTP 速度测试 — 上传/下载大文件,测量传输速度
用法:python ftp_speed_test.py --host 192.168.1.100 [--size 512] [--port 21]
用法:python ftp_speed_test.py --host <设备IP> [--size 512] [--port 21]
[--user admin] [--password admin]
"""
@@ -12,7 +12,9 @@ import re
import argparse
import os
HOST = "192.168.1.100"
import bench_defaults # 台架连接默认值单一真源
HOST = bench_defaults.DEVICE_IP
PORT = 21
# 设备侧 FTP 鉴权走 /config.ini 的 [ftp](user / pwd_hash),出厂默认 admin/admin;
# **没有匿名通道**(USER anonymous 一律回 530)。
+4 -2
View File
@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-
"""
FTP Server 测试脚本 — 连接 STM32F4 上的 lftpd 服务器
用法:python ftp_test.py [--host 192.168.1.100] [--port 21] [--user admin] [--password admin]
用法:python ftp_test.py [--host <设备IP>] [--port 21] [--user admin] [--password admin]
"""
import socket
@@ -10,7 +10,9 @@ import sys
import time
import argparse
HOST = "192.168.1.100"
import bench_defaults # 台架连接默认值单一真源
HOST = bench_defaults.DEVICE_IP
PORT = 21
# 设备侧 FTP 鉴权走 /config.ini 的 [ftp](user / pwd_hash),出厂默认 admin/admin;
# **没有匿名通道**(USER anonymous 一律回 530)。
+4 -2
View File
@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-
"""
FTP 上传+下载测试脚本
用法:python ftp_up_dl_test.py --host 192.168.1.100 [--user admin] [--password admin]
用法:python ftp_up_dl_test.py --host <设备IP> [--user admin] [--password admin]
"""
import socket
@@ -12,7 +12,9 @@ import re
import argparse
import os
HOST = "192.168.1.100"
import bench_defaults # 台架连接默认值单一真源
HOST = bench_defaults.DEVICE_IP
PORT = 21
# 设备侧 FTP 鉴权走 /config.ini 的 [ftp](user / pwd_hash = SHA-256(user‖password)),
# 出厂默认 admin/admin;**没有匿名通道**(USER anonymous 一律回 530)。
+4 -2
View File
@@ -30,7 +30,7 @@ round-trip log as bench evidence).
RX decode fix (2026-10-25, task-21/m104fix): cause-byte semantics above;
offline sample-frame selftest: python test/host/test_iec104_master_rx.py
Usage: python iec104_master.py [--ip 192.168.1.100] [--port 2404]
Usage: python iec104_master.py [--ip <设备IP>] [--port 2404]
[--addr 0x8858] [--low 0.05]
[--restore 10.0]
@@ -49,6 +49,8 @@ bench leg, firmware side App/cfg/prot_set_store.c):
"""
import argparse
import collections
import bench_defaults # 台架连接默认值单一真源
import socket
import struct
import sys
@@ -469,7 +471,7 @@ def b7_check(m, ck, args):
def main():
ap = argparse.ArgumentParser(description=__doc__.splitlines()[0])
ap.add_argument("--ip", default="192.168.1.100")
ap.add_argument("--ip", default=bench_defaults.DEVICE_IP)
ap.add_argument("--port", type=int, default=2404)
ap.add_argument("--addr", default="0x8858",
help="setpoint comm addr to drive COV (OC1 current)")
+4 -2
View File
@@ -18,7 +18,7 @@ per-batch arrival curve / >=500ms spikes (TCP retransmission fingerprint).
Both the serial log and this JSON carry HOST timestamps -> direct correlation.
Usage:
python latency_peer.py --host 192.168.1.100 --port 8080 --json m2_net.json
python latency_peer.py --port 8080 --json m2_net.json
python latency_peer.py --mode net --ftp-stress ... (head-of-line repro)
Pure stdlib (socket/json/time/argparse/threading). ASCII output only.
@@ -31,6 +31,8 @@ import sys
import threading
import time
import bench_defaults # 台架连接默认值单一真源
# --- Protocol constants (mirror test/board/net_latency_test.c Phase 13 defines) ---
HELLO = b"\x5a\xa5\x58\x01"
OP_QUEUE_RT_RECV = 0x01
@@ -783,7 +785,7 @@ def main(argv=None):
ap.add_argument("--mode", default="net", choices=["net", "remo"],
help="net = Phase 13 test protocol :8080; "
"remo = production RemoDispBus client :7003 (Phase 14 / simulator)")
ap.add_argument("--host", default="192.168.1.100", help="device IP")
ap.add_argument("--host", default=bench_defaults.DEVICE_IP, help="device IP")
ap.add_argument("--port", type=int, default=None,
help="listen port (default: 8080 for net, 7003 for remo)")
ap.add_argument("--wait", type=int, default=180,
+2 -2
View File
@@ -346,7 +346,7 @@ int net_getsockname(int sockfd, struct net_sockaddr *addr, int *addrlen)
(void)sockfd;
(void)addrlen;
a->sin_addr.s_addr = 0x0101A8C0u; /* 192.168.1.1 的宿主序表示(假件自定) */
a->sin_addr.s_addr = 0x011FA8C0u; /* 192.168.31.1 的宿主序表示(假件自定) */
a->sin_port = net_htons(21u);
return g_sockname_rc;
}
@@ -512,7 +512,7 @@ static void tc_passive(void)
/* 直调处理器:走 handle_control_channel 的话,会话退出时 cleanup 一定把被动监听
关掉(那正是 TC-LFTPD-006 要验的行为),这里要看的是 PASV 自己留下的状态。 */
(void)cmd_pasv(&g_cli, NULL);
CHECK((strcmp(rep(0), "227 Entering Passive Mode (192,168,1,1,19,136).\r\n") == 0) &&
CHECK((strcmp(rep(0), "227 Entering Passive Mode (192,168,31,1,19,136).\r\n") == 0) &&
(g_cli.data_socket == 20) && (g_n.listen_calls == 1),
"TC-LFTPD-011 the 227 tuple: ip through htonl then high byte to low byte (dotted order), port high/low, and the passive listen handle is recorded");
+3 -1
View File
@@ -6,10 +6,12 @@ import io
import sys
from ftplib import FTP, error_temp, error_perm
import bench_defaults # 台架连接默认值单一真源
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--host", default="192.168.1.100")
ap.add_argument("--host", default=bench_defaults.DEVICE_IP)
ap.add_argument("--port", type=int, default=21)
ap.add_argument("--user", default=None, help="None=anonymous")
ap.add_argument("--pwd", default=None)
+6 -6
View File
@@ -32,9 +32,9 @@
*
* 覆盖点:
* —— 出厂默认(load 之前也必须可用,TC-NETCFG-001..004)——
* TC-NETCFG-001 未 load 时 ip = 工厂默认 192.168.1.100
* TC-NETCFG-001 未 load 时 ip = 工厂默认 192.168.31.100
* TC-NETCFG-002 未 load 时 mask = 255.255.255.0
* TC-NETCFG-003 未 load 时 gw = 192.168.1.1
* TC-NETCFG-003 未 load 时 gw = 192.168.31.1
* TC-NETCFG-004 未 load 时 mac = 全零(哨兵 = 不覆盖芯片内置 MAC)
* —— 注册与 load(TC-NETCFG-005..011)——
* TC-NETCFG-005 首次 load 注册 [network] 段恰好一次(且 load 返回 0)
@@ -257,15 +257,15 @@ static void save_hook_probe(void)
static void tc_defaults(void)
{
const net_cfg_t *p = net_cfg_get();
static const uint8_t def_ip[4] = { 192u, 168u, 1u, 100u };
static const uint8_t def_ip[4] = { 192u, 168u, 31u, 100u };
static const uint8_t def_mask[4] = { 255u, 255u, 255u, 0u };
static const uint8_t def_gw[4] = { 192u, 168u, 1u, 1u };
static const uint8_t def_gw[4] = { 192u, 168u, 31u, 1u };
static const uint8_t zero[6] = { 0u, 0u, 0u, 0u, 0u, 0u };
printf("-- TC-NETCFG-001..004 defaults before load --\n");
CHECK(bytes_eq(p->ip, def_ip, 4u), "TC-NETCFG-001 ip = 192.168.1.100");
CHECK(bytes_eq(p->ip, def_ip, 4u), "TC-NETCFG-001 ip = 192.168.31.100");
CHECK(bytes_eq(p->mask, def_mask, 4u), "TC-NETCFG-002 mask = 255.255.255.0");
CHECK(bytes_eq(p->gw, def_gw, 4u), "TC-NETCFG-003 gw = 192.168.1.1");
CHECK(bytes_eq(p->gw, def_gw, 4u), "TC-NETCFG-003 gw = 192.168.31.1");
CHECK(mac_eq(p->mac, zero), "TC-NETCFG-004 mac = all zero (chip built-in sentinel)");
}
+3 -3
View File
@@ -209,13 +209,13 @@ static void tc_connect(void)
printf("-- TC-NETEV-001..006 CONNECT --\n");
reset_all();
p = mk(0, NET_SOCK_STATE_LISTENING, 2404u);
ch395f_fake_set_peer(0, 192u, 168u, 1u, 50u, 51234u);
ch395f_fake_set_peer(0, 192u, 168u, 31u, 50u, 51234u);
handle_connect_event(p);
/* remote_ip 是**低字节在前**拼的(remote[0] 落在最低 8 位),与网络序相反:
* 192.168.1.50 -> 0x3201A8C0。这是既有实现的字节序,钉住它是防止有人"顺手
* 192.168.31.50 -> 0x321FA8C0。这是既有实现的字节序,钉住它是防止有人"顺手
* 改成大端"导致所有按 IP 比对/白名单的判断静默错位。 */
CHECK((p->remote_ip_arr[0] == 192u) && (p->remote_ip_arr[3] == 50u) &&
(p->remote_ip == ((192u) | (168u << 8) | (1u << 16) | (50u << 24))) &&
(p->remote_ip == ((192u) | (168u << 8) | (31u << 16) | (50u << 24))) &&
(p->remote_port == 51234u),
"TC-NETEV-001 peer tuple parsing: ip assembled little-endian into 32 bits, port from bytes 5/6");
CHECK((p->state == NET_SOCK_STATE_ESTABLISHED) && (p->session_dead == 0u) &&
+15 -15
View File
@@ -121,7 +121,7 @@ static void bring_up(void)
* 调用的(App/task/net_task.c:92),而本层执行任务句柄(UDP 上下文守卫的判据)
* 正是在这里捕获——这里若不换身份,整个 UDP 守卫就只能测到"自己判自己" */
g_ns_cur_task = (TaskHandle_t)&g_ns_task_net;
(void)net_init("192.168.1.100", "255.255.255.0", "192.168.1.1", NULL);
(void)net_init("192.168.31.100", "255.255.255.0", "192.168.31.1", NULL);
g_ns_cur_task = (TaskHandle_t)&g_ns_task_caller;
g_peers.pending_capture_calls = 0; /* bring_up 内部的登记动作不该算进场景 */
g_ns_error_count = 0;
@@ -160,13 +160,13 @@ static int mk_sock(int type, net_sock_state_t state)
/* TC-NETSOCK-100 点分十进制 ↔ 32 位:**正向断言**(字节序统一修复后)
* 全仓唯一约定:s_addr 是网络字节序整数,&s_addr 的第 0 个内存字节 == 点分第一段;
* 小端主机上 "192.168.1.100" 的数值 = 0x6401A8C0。本组断言的落点是「互逆」与
* 小端主机上 "192.168.31.100" 的数值 = 0x641FA8C0。本组断言的落点是「互逆」与
* 「同族可比」,不是某个中间数值——数值只是这条约定的一个投影。 */
static void tc_100_inet_helpers(void)
{
/* 往返不变量的样本集:两个全零/全一边界 + 三个非回文地址(非回文才能考出顺位) */
static const char *const k_ips[5] = {
"0.0.0.0", "255.255.255.255", "1.1.1.1", "192.168.1.100", "10.0.0.0"
"0.0.0.0", "255.255.255.255", "1.1.1.1", "192.168.31.100", "10.0.0.0"
};
char buf[16];
int i;
@@ -174,12 +174,12 @@ static void tc_100_inet_helpers(void)
reset_all();
CHECK(net_inet_addr(NULL) == 0U, "TC-NETSOCK-100a inet_addr(NULL) returns 0 (invalid)");
CHECK(net_inet_addr("192.168.1.100") == 0x6401A8C0U,
"TC-NETSOCK-100b inet_addr returns network-order int (LE value 0x6401A8C0 = bytes C0 A8 01 64)");
CHECK(net_inet_ntoa(net_inet_addr("192.168.1.100"), buf) == buf &&
strcmp(buf, "192.168.1.100") == 0,
CHECK(net_inet_addr("192.168.31.100") == 0x641FA8C0U,
"TC-NETSOCK-100b inet_addr returns network-order int (LE value 0x641FA8C0 = bytes C0 A8 1F 64)");
CHECK(net_inet_ntoa(net_inet_addr("192.168.31.100"), buf) == buf &&
strcmp(buf, "192.168.31.100") == 0,
"TC-NETSOCK-100c ntoa(inet_addr(s)) == s: the two are exact inverses");
CHECK(net_inet_ntoa(0x6401A8C0U, buf) == buf && strcmp(buf, "192.168.1.100") == 0,
CHECK(net_inet_ntoa(0x641FA8C0U, buf) == buf && strcmp(buf, "192.168.31.100") == 0,
"TC-NETSOCK-100d ntoa segment order is MSB-first (fixed by E13/TRAP-NET-21, unchanged here)");
CHECK(net_inet_ntoa(0U, NULL) == NULL, "TC-NETSOCK-100e ntoa(NULL buf) returns NULL without crashing");
CHECK(net_inet_addr("10.0.0.1") == 0x0100000AU,
@@ -237,8 +237,8 @@ static void tc_102_parse_ip(void)
(void)memset(a, 0xEE, sizeof(a));
parse_ip_string(NULL, a);
CHECK(a[0] == 0xEEU, "TC-NETSOCK-102a parse_ip_string(NULL) returns at once, target buffer untouched");
parse_ip_string("192.168.1.100", a);
CHECK(a[0] == 192U && a[1] == 168U && a[2] == 1U && a[3] == 100U,
parse_ip_string("192.168.31.100", a);
CHECK(a[0] == 192U && a[1] == 168U && a[2] == 31U && a[3] == 100U,
"TC-NETSOCK-102b parse_ip_string puts segment 0 at [0] (the order chip set_ip_addr wants)");
parse_ip_string("10.20.30.40", NULL); /* 只验不崩 */
CHECK(1, "TC-NETSOCK-102c parse_ip_string with NULL target does not crash");
@@ -333,7 +333,7 @@ static void tc_105_bind(void)
(void)memset(&in, 0, sizeof(in));
in.sin_family = NET_AF_INET;
in.sin_port = net_htons(2404);
in.sin_addr.s_addr = net_inet_addr("192.168.1.100");
in.sin_addr.s_addr = net_inet_addr("192.168.31.100");
CHECK(net_bind(-1, (struct net_sockaddr *)&in, sizeof(in)) == -1 &&
net_get_errno() == NET_ERR_BADF, "TC-NETSOCK-105a out of range fd -> BADF");
@@ -442,7 +442,7 @@ static void tc_107_peer_and_localname(void)
int fd;
reset_all();
(void)net_init("192.168.1.100", "255.255.255.0", "192.168.1.1", NULL);
(void)net_init("192.168.31.100", "255.255.255.0", "192.168.31.1", NULL);
CHECK(net_getsockname(-1, sa, &addrlen) == -1 && net_get_errno() == NET_ERR_BADF,
"TC-NETSOCK-107a getsockname out of range -> BADF");
@@ -460,10 +460,10 @@ static void tc_107_peer_and_localname(void)
addrlen == (int)sizeof(in),
"TC-NETSOCK-107e fills family, port (network order) and length");
/* 钉**具体顺位**而不是二选一:getsockname 走的是「首段在最低字节」这一族
* (与 net_inet_ntoa、net_events 的 remote_ip 同族),所以 192.168.1.100 =
* 0x6401A8C0。net_inet_addr 返回的是另一族(首段在最高字节,0xC0A80164),
* (与 net_inet_ntoa、net_events 的 remote_ip 同族),所以 192.168.31.100 =
* 0x641FA8C0。net_inet_addr 返回的是另一族(首段在最高字节,0xC0A81F64),
* 两族不互逆——已作为疑似缺陷报出,这里刻意不写成「两个都行」。 */
CHECK(in.sin_addr.s_addr == 0x6401A8C0U,
CHECK(in.sin_addr.s_addr == 0x641FA8C0U,
"TC-NETSOCK-107f local IP byte order = first octet in low byte (ntoa family)");
addrlen = 1;
+12 -12
View File
@@ -33,7 +33,7 @@ static void tc_400_net_init_downlink(void)
/* 1) 芯片不在位:直接失败,且不得继续下发任何参数 */
reset_all();
g_fx.exist_rc = (int)CH395F_STATUS_NOT_DETECTED;
CHECK(net_init("192.168.1.100", "255.255.255.0", "192.168.1.1", NULL) == -1,
CHECK(net_init("192.168.31.100", "255.255.255.0", "192.168.31.1", NULL) == -1,
"TC-NETSOCK-400a chip not present -> -1");
CHECK(g_fxchip.reset_calls == 0 && g_fxchip.init_calls == 0,
"TC-NETSOCK-400b when absent it must not reset or initialise (do not drag the error into the stack)");
@@ -42,21 +42,21 @@ static void tc_400_net_init_downlink(void)
/* 2) 协议栈初始化失败 */
reset_all();
g_fx.init_rc = (int)CH395F_STATUS_ERROR;
CHECK(net_init("192.168.1.100", "255.255.255.0", "192.168.1.1", NULL) == -1,
CHECK(net_init("192.168.31.100", "255.255.255.0", "192.168.31.1", NULL) == -1,
"TC-NETSOCK-400d ch395f_init failure -> -1");
CHECK(g_fxchip.ping_calls == 0, "TC-NETSOCK-400e after an init failure PING must not be enabled (half-configured state)");
/* 3) 版本门控:低于 0x46 必须**拒置** bit3(SOCKET_CLOSE),退回芯片自动关断 */
reset_all();
g_fx.version = 0x45U;
CHECK(net_init("192.168.1.100", "255.255.255.0", "192.168.1.1", NULL) == 0,
CHECK(net_init("192.168.31.100", "255.255.255.0", "192.168.31.1", NULL) == 0,
"TC-NETSOCK-400f a too-old version is not fatal: bring-up continues");
CHECK(g_fx.fun_para == 0U && g_ns_error_count == 1,
"TC-NETSOCK-400g ver<0x46 -> FUN_PARA actually sends 0 (bit3 refused) plus [ERR], never silently degraded");
/* 4) 版本够新:FUN_PARA=0x08;bit1(TCP_SERVER 多连接) 与 bit0(保留) 都必须为 0 */
reset_all();
CHECK(net_init("192.168.1.100", "255.255.255.0", "192.168.1.1", NULL) == 0,
CHECK(net_init("192.168.31.100", "255.255.255.0", "192.168.31.1", NULL) == 0,
"TC-NETSOCK-400h normal initialisation succeeds");
/* bit3=SOCKET_CLOSE 要置;bit1=TCP_SERVER 多连接(本项目单连接模型)与
* bit0=保留位都必须为 0——旧实现把 0x09 当「多 Socket 模式」下发,2026-10-11
@@ -76,7 +76,7 @@ static void tc_400_net_init_downlink(void)
"TC-NETSOCK-400l SET-class commands (MSS/KeepAlive) come before INIT_CH395 (manual hard requirement)");
/* 5) IP/掩码/网关三样都按点分顺位下发,并缓存本机 IP 供 getsockname 用 */
CHECK(g_fx.ip[0] == 192U && g_fx.ip[1] == 168U && g_fx.ip[2] == 1U &&
CHECK(g_fx.ip[0] == 192U && g_fx.ip[1] == 168U && g_fx.ip[2] == 31U &&
g_fx.ip[3] == 100U && g_fx.gw[3] == 1U && g_fx.mask[0] == 255U,
"TC-NETSOCK-400m IP, gateway and mask follow the parse_ip_string order (segment 0 lands at [0])");
CHECK(g_fxchip.set_dhcp_calls == 0 && g_fx.dhcp_enable == 0U,
@@ -92,10 +92,10 @@ static void tc_400_net_init_downlink(void)
/* 7) MAC:全零=用芯片内置,不下发;非零必须下发(写 EEPROM,须在 INIT 之前) */
reset_all();
(void)net_init("192.168.1.100", "255.255.255.0", "192.168.1.1", mac_zero);
(void)net_init("192.168.31.100", "255.255.255.0", "192.168.31.1", mac_zero);
CHECK(g_fxchip.set_mac_calls == 0, "TC-NETSOCK-400q all-zero MAC -> keep the chip built-in one, do not issue it");
reset_all();
(void)net_init("192.168.1.100", "255.255.255.0", "192.168.1.1", mac_real);
(void)net_init("192.168.31.100", "255.255.255.0", "192.168.31.1", mac_real);
CHECK(g_fxchip.set_mac_calls == 1 && g_fx.mac[0] == 0x02U && g_fx.mac[5] == 0x55U,
"TC-NETSOCK-400r a non-zero MAC is issued (device online identity stays consistent with the UI)");
CHECK(ch395f_fake_log_find('M') < ch395f_fake_log_find('n') ||
@@ -104,7 +104,7 @@ static void tc_400_net_init_downlink(void)
/* 8) 收发缓冲块布局:6 块/Socket,先配数据 Socket 再配监听 Socket 0(TRAP-NET-01) */
reset_all();
(void)net_init("192.168.1.100", "255.255.255.0", "192.168.1.1", NULL);
(void)net_init("192.168.31.100", "255.255.255.0", "192.168.31.1", NULL);
CHECK(g_fxchip.set_recv_buf_calls == NET_MAX_SOCKETS &&
g_fxchip.set_send_buf_calls == NET_MAX_SOCKETS,
"TC-NETSOCK-400t all 8 sockets are explicitly reallocated (power-on defaults only cover 0-3)");
@@ -122,7 +122,7 @@ static void tc_400_net_init_downlink(void)
/* 9) net_init 的第一件事是取消挂起并通知调用方(顺序错了 = 调用方永久挂死) */
reset_all();
(void)net_init("192.168.1.100", "255.255.255.0", "192.168.1.1", NULL);
(void)net_init("192.168.31.100", "255.255.255.0", "192.168.31.1", NULL);
CHECK(g_peers.pending_cancel_all_calls == 1 &&
g_peers.send_cancel_all_calls == 1,
"TC-NETSOCK-400w both pending tables are cancelled before a rebuild (recv and send each one, missing one strands a task)");
@@ -358,7 +358,7 @@ static void tc_430_connect(void)
(void)memset(&in, 0, sizeof(in));
in.sin_family = NET_AF_INET;
in.sin_port = net_htons(8888);
in.sin_addr.s_addr = net_inet_addr("192.168.1.200");
in.sin_addr.s_addr = net_inet_addr("192.168.31.200");
g_ns_cur_task = (TaskHandle_t)&g_ns_task_caller;
CHECK(net_connect(fd, (struct net_sockaddr *)&in, (int)sizeof(in)) == 0,
"TC-NETSOCK-430e connect command issued (asynchronous, the interrupt decides success)");
@@ -367,7 +367,7 @@ static void tc_430_connect(void)
CHECK(s_net_socks[fd].remote_port == 8888U,
"TC-NETSOCK-430g peer port stored in bookkeeping as host order");
CHECK(g_fx.des_ip[fd][0] == 192U && g_fx.des_ip[fd][1] == 168U &&
g_fx.des_ip[fd][2] == 1U && g_fx.des_ip[fd][3] == 200U,
g_fx.des_ip[fd][2] == 31U && g_fx.des_ip[fd][3] == 200U,
"TC-NETSOCK-430h destination IP issued as a big-endian array (the order set_des_ip needs, reversed means no link)");
CHECK(g_chip.set_port_calls == 1 && g_fx.des_port[fd] == 8888U,
"TC-NETSOCK-430i source port issued once (SET_SOUR_PORT), the peer port goes via SET_DES_PORT=8888");
@@ -455,7 +455,7 @@ static void tc_440_udp_datagram(void)
fd = net_socket(NET_AF_INET, NET_SOCK_DGRAM);
(void)memset(&in, 0, sizeof(in));
in.sin_port = net_htons(8888);
in.sin_addr.s_addr = net_inet_addr("192.168.1.9");
in.sin_addr.s_addr = net_inet_addr("192.168.31.9");
CHECK(net_sendto(fd, "hello", 5, 0, sa, (int)sizeof(in)) == 5,
"TC-NETSOCK-440f sendto returns the number of bytes sent");
CHECK(g_fx.des_ip[fd][3] == 9U && g_fx.des_port[fd] == 8888U,
+7 -7
View File
@@ -402,17 +402,17 @@ static void tc_550_family_roundtrip(void)
(void)memset(&in, 0, sizeof(in));
CHECK(net_getsockname(0, sa, &addrlen) == 0,
"TC-NETSOCK-550a getsockname precondition ok");
CHECK(in.sin_addr.s_addr == net_inet_addr("192.168.1.100"),
CHECK(in.sin_addr.s_addr == net_inet_addr("192.168.31.100"),
"TC-NETSOCK-550b getsockname s_addr is the same family as inet_addr (direct equality)");
CHECK(strcmp(net_inet_ntoa(in.sin_addr.s_addr, txt), "192.168.1.100") == 0,
"TC-NETSOCK-550c local address closes parse-store-print (old code printed 100.1.168.192)");
CHECK(strcmp(net_inet_ntoa(in.sin_addr.s_addr, txt), "192.168.31.100") == 0,
"TC-NETSOCK-550c local address closes parse-store-print (old code printed 100.31.168.192)");
/* 2) connect 的对端簿记同样闭合(lftpd:864 与 104 显示走的就是这条链) */
fd = net_socket(NET_AF_INET, NET_SOCK_STREAM);
(void)memset(&in, 0, sizeof(in));
in.sin_family = NET_AF_INET;
in.sin_port = net_htons(2404U);
in.sin_addr.s_addr = net_inet_addr("192.168.1.200");
in.sin_addr.s_addr = net_inet_addr("192.168.31.200");
g_ns_cur_task = (TaskHandle_t)&g_ns_task_net;
CHECK(net_connect_locked(fd, sa, (int)sizeof(in)) == 0,
"TC-NETSOCK-550d connect precondition ok");
@@ -420,13 +420,13 @@ static void tc_550_family_roundtrip(void)
(void)memset(&in, 0, sizeof(in));
CHECK(net_getpeername(fd, sa, &addrlen) == 0,
"TC-NETSOCK-550e getpeername ok (reads event cache, zero SPI)");
CHECK(in.sin_addr.s_addr == net_inet_addr("192.168.1.200"),
CHECK(in.sin_addr.s_addr == net_inet_addr("192.168.31.200"),
"TC-NETSOCK-550f getpeername peer equals the s_addr fed into net_connect");
CHECK(strcmp(net_inet_ntoa(in.sin_addr.s_addr, txt), "192.168.1.200") == 0,
CHECK(strcmp(net_inet_ntoa(in.sin_addr.s_addr, txt), "192.168.31.200") == 0,
"TC-NETSOCK-550g peer address prints right (lftpd connection-received log depends on it)");
CHECK(s_net_socks[fd].remote_ip_arr[0] == 192U &&
s_net_socks[fd].remote_ip_arr[3] == 200U,
"TC-NETSOCK-550h chip des_ip array stays wire order [192,168,1,200]: on-wire behaviour unchanged");
"TC-NETSOCK-550h chip des_ip array stays wire order [192,168,31,200]: on-wire behaviour unchanged");
reset_all();
}
+3 -1
View File
@@ -20,7 +20,9 @@ import socket
import sys
import time
IP_DEFAULT = "192.168.1.100"
import bench_defaults # 台架连接默认值单一真源
IP_DEFAULT = bench_defaults.DEVICE_IP
def ftp_stor_round(ip, user, pwd, fname, payload):
+3 -1
View File
@@ -16,10 +16,12 @@ import socket
import sys
import time
import bench_defaults # 台架连接默认值单一真源
def main():
ap = argparse.ArgumentParser(description="listener reconnect stress")
ap.add_argument("--host", default="192.168.1.100")
ap.add_argument("--host", default=bench_defaults.DEVICE_IP)
ap.add_argument("--port", type=int, required=True)
ap.add_argument("--n", type=int, default=50)
ap.add_argument("--gap-ms", type=int, default=100)
+4 -2
View File
@@ -3,7 +3,7 @@
"""RemoDispBus(7003) 拉帧压力客户端:「双通道并发回归」的网络侧激励。
做什么:
连 192.168.1.100:7003,先发 INIT 查询屏幕参数(应得 8 B:宽u16/高u16/帧字节数u32,
连设备 IP(默认见 bench_defaults.DEVICE_IP):7003,先发 INIT 查询屏幕参数(应得 8 B:宽u16/高u16/帧字节数u32,
大端),随后按固定节拍持续发 LCDMEM(偏移 0) 拉整帧 3200 B 显存,逐帧校验
XOR 校验和与长度,统计请求数 / 应答数 / CRC 错 / 超时 / 往返延迟 min-avg-max。
可 --dump last_frame.pbm 存最后一帧(1bpp 布局与屏板帧 B 点阵段逐字节同构)。
@@ -39,7 +39,9 @@ import struct
import sys
import time
DEFAULT_IP = "192.168.1.100"
import bench_defaults # 台架连接默认值单一真源
DEFAULT_IP = bench_defaults.DEVICE_IP
DEFAULT_PORT = 7003
TAG_CLIENT = 0xAA
TAG_DEVICE = 0xBB
+6 -4
View File
@@ -13,9 +13,9 @@
字节 4..7 : 本地 Unix 时间戳,uint32,大端(主机字节序转换后由板子分解)
用法:
python time_sync_server.py # 默认推送到 192.168.1.100:8888
python time_sync_server.py 192.168.1.100 # 指定板子 IP
python time_sync_server.py 192.168.1.100 9000 3 # 指定端口与间隔(秒)
python time_sync_server.py # 默认推送到设备 IP(bench_defaults.DEVICE_IP):8888
python time_sync_server.py <设备IP> # 指定板子 IP
python time_sync_server.py <设备IP> 9000 3 # 指定端口与间隔(秒)
按 Ctrl+C 停止。
"""
@@ -26,7 +26,9 @@ import sys
import time
import calendar
DEFAULT_MCU_IP = "192.168.1.100"
import bench_defaults # 台架连接默认值单一真源
DEFAULT_MCU_IP = bench_defaults.DEVICE_IP
DEFAULT_PORT = 8888
DEFAULT_INTERVAL = 5.0