"""教学用双随机帧;默认离线,--send 才在已打开的隔离通道发送。""" import argparse import json import random import subprocess import time from pathlib import Path def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('--seed', type=int, default=2026) parser.add_argument('--send', action='store_true') parser.add_argument('--channel') parser.add_argument('--sequence', type=Path) args = parser.parse_args() if args.send and (not args.channel or not args.sequence): parser.error('--send requires --channel and a new --sequence file') rng = random.Random(args.seed) frames = [dict(index=i, id=f'0x{rng.randrange(0x600, 0x610):03X}', data=' '.join(f'{rng.randrange(256):02X}' for _ in range(8))) for i in range(32)] lines = [json.dumps(frame, ensure_ascii=False) for frame in frames] if args.sequence: # 独占创建,保留已经存在的测试记录,不覆盖它们。 with args.sequence.open('x', encoding='utf-8') as output: output.write('\n'.join(lines) + '\n') if not args.send: print('\n'.join(lines)) return for frame in frames: result = subprocess.run( ['bmcli', 'message', 'send', f'--channel={args.channel}', f'--message={frame["id"]}', f'--data={frame["data"]}', '--count=1', '--format=json'], capture_output=True, text=True, encoding='utf-8', timeout=10) print(json.dumps(dict(index=frame['index'], returncode=result.returncode, stdout=result.stdout, stderr=result.stderr), ensure_ascii=False), flush=True) if result.returncode != 0: raise SystemExit(result.returncode) if json.loads(result.stdout).get('status') != 'ok': raise SystemExit('BMCLI did not return status=ok; stopped') # 命令调用耗时另计;这是主机侧低速激励,不承诺硬件周期精度。 time.sleep(0.1) if __name__ == '__main__': main()