#!/bin/bash # 抓 Legged_sport 真实 LowCmd → 解密 → 跟本地脚本生成的对比 # # 前提: Legged_sport 必须在跑且正常向 MCU 发包 (狗在工作状态, 不能是idle) # 用法: bash tools/onboard/diff_real_lowcmd.sh [seconds] # # 输出: # data/lowlevel_captures/real_lowcmd_.pcap - 抓的原包 # data/lowlevel_captures/real_lowcmd_.bin - 一帧密文 (616B) # data/lowlevel_captures/real_lowcmd_dec_.bin - 解密后 (616B) # 字节级 diff 输出到屏幕 PI_HOST="${PI_HOST:-192.168.123.161}" PI_USER="${PI_USER:-pi}" DURATION="${1:-3}" TS=$(date +%Y%m%d_%H%M%S) PCAP_REMOTE=/tmp/real_lowcmd.pcap PCAP_LOCAL=data/lowlevel_captures/real_lowcmd_${TS}.pcap CIPHER_BIN=data/lowlevel_captures/real_lowcmd_${TS}.bin PLAIN_BIN=data/lowlevel_captures/real_lowcmd_dec_${TS}.bin mkdir -p $(dirname ${PCAP_LOCAL}) echo "============================================" echo "🔍 抓真实 LowCmd 跟本地对比" echo "============================================" echo "" # 0. 确认 Legged_sport 在发包 (而不是 idle) echo "[0/4] 确认 Legged_sport 在向 MCU 发包..." COUNT=$(ssh ${PI_USER}@${PI_HOST} \ "sudo timeout 1 /usr/sbin/tcpdump -i any -nn -c 5 'udp and dst host 192.168.123.10 and dst port 8007' 2>/dev/null | grep -c 'IP 192' || true") if [ "$COUNT" -lt 1 ]; then echo " ❌ Legged_sport 没在发 LowCmd!" echo " 可能原因:" echo " - 狗在 idle/damping 待机, 需要遥控器唤醒 (L2+A 让它站起来)" echo " - MCU 被其他客户端 (我们 Mac 的脚本) 抢占了" echo " - sportMode 服务挂了" exit 1 fi echo " ✅ 检测到 ${COUNT} 个发往 MCU 的包" echo "" # 1. 抓包 echo "[1/4] tcpdump 抓 ${DURATION}s ..." ssh ${PI_USER}@${PI_HOST} bash -s </tmp/tcpdump.log sudo chmod 644 ${PCAP_REMOTE} echo "pcap 大小: \$(stat -c%s ${PCAP_REMOTE}) 字节" EOF # 2. 拉回 echo "" echo "[2/4] 拉回本地..." scp ${PI_USER}@${PI_HOST}:${PCAP_REMOTE} ${PCAP_LOCAL} echo " ✅ ${PCAP_LOCAL}" # 3. 解析+解密+对比 echo "" echo "[3/4] 解析+解密..." conda run -n free_dog_sdk python tools/onboard/_compare_lowcmd.py \ ${PCAP_LOCAL} \ --cipher-out ${CIPHER_BIN} \ --plain-out ${PLAIN_BIN} echo "" echo "============================================" echo "完成. 文件:" echo " pcap: ${PCAP_LOCAL}" echo " 密文: ${CIPHER_BIN}" echo " 明文: ${PLAIN_BIN}" echo "============================================"