#!/bin/bash # 抓 Legged_sport 发给 MCU :8007 的 LowCmd UDP 包, 拉回本地解析 # # 用法: bash tools/onboard/capture_lowcmd.sh [seconds] # # 流程: # 1. SSH 到狗启动 tcpdump 抓包 (持续N秒) # 2. 拉回 pcap 到本地 # 3. 用 Python 解析 pcap, 提取 LowCmd 字节 # 4. 跟本地 buildCmd() 的输出对比 PI_HOST="${PI_HOST:-192.168.123.161}" PI_USER="${PI_USER:-pi}" DURATION="${1:-5}" # 抓包秒数 PCAP_REMOTE=/tmp/legged_sport.pcap PCAP_LOCAL=data/lowlevel_captures/legged_sport_$(date +%Y%m%d_%H%M%S).pcap echo "============================================" echo "🔍 抓 Legged_sport → MCU 的 LowCmd 包" echo "============================================" echo " 抓包时长: ${DURATION}s" echo " 远端 pcap: ${PCAP_REMOTE}" echo " 本地保存: ${PCAP_LOCAL}" echo "" # 先确认 Legged_sport 在运行 (否则抓不到包) echo "[1/4] 确认 Legged_sport 在运行..." if ssh ${PI_USER}@${PI_HOST} "pgrep Legged_sport > /dev/null 2>&1"; then echo " ✅ Legged_sport 在运行" else echo " ⚠️ Legged_sport 未运行! 先恢复 sportMode:" echo " bash tools/onboard/stop_sportmode.sh start" exit 1 fi # 抓包: 用 tcpdump (已在 Pi 上安装) echo "" echo "[2/4] 启动 tcpdump 抓包 (${DURATION}s, eth0)..." ssh ${PI_USER}@${PI_HOST} bash -s </tmp/tcpdump.log echo "tcpdump 退出码: \$?" if [ -f ${PCAP_REMOTE} ]; then sudo chmod 644 ${PCAP_REMOTE} echo "pcap 大小: \$(stat -c%s ${PCAP_REMOTE}) 字节" cat /tmp/tcpdump.log else echo "❌ pcap 未生成!" cat /tmp/tcpdump.log exit 1 fi EOF echo " ✅ 抓包完成" # 拉回本地 echo "" echo "[3/4] 拉回本地..." mkdir -p $(dirname ${PCAP_LOCAL}) if ! scp ${PI_USER}@${PI_HOST}:${PCAP_REMOTE} ${PCAP_LOCAL}; then echo "❌ 拉取失败" exit 1 fi echo " ✅ ${PCAP_LOCAL} ($(stat -f%z ${PCAP_LOCAL} 2>/dev/null || stat -c%s ${PCAP_LOCAL}) 字节)" # 解析+对比 echo "" echo "[4/4] 解析+对比..." conda run -n free_dog_sdk python tools/onboard/diff_lowcmd.py ${PCAP_LOCAL}