verify_nextion_149.sh 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #!/bin/bash
  2. # 在 149 设备上自动验证 Nextion 串口屏显示
  3. # 用法: ./scripts/verify_nextion_149.sh [remote_host] [remote_user] [remote_pass] [remote_dir]
  4. set -e
  5. REMOTE_HOST="${1:-192.168.199.149}"
  6. REMOTE_USER="${2:-root}"
  7. REMOTE_PASS="${3:-123456}"
  8. REMOTE_DIR="${4:-/root/dzxj_dtu}"
  9. PORT=5001
  10. GREEN='\033[0;32m'
  11. RED='\033[0;31m'
  12. YELLOW='\033[1;33m'
  13. NC='\033[0m'
  14. pass_count=0
  15. fail_count=0
  16. info() { echo -e "${GREEN}[INFO]${NC} $1"; }
  17. warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
  18. err() { echo -e "${RED}[FAIL]${NC} $1"; }
  19. ok() { echo -e "${GREEN}[PASS]${NC} $1"; pass_count=$((pass_count+1)); }
  20. fail() { echo -e "${RED}[FAIL]${NC} $1"; fail_count=$((fail_count+1)); }
  21. # 检查 expect 是否安装
  22. if ! command -v expect &>/dev/null; then
  23. err "本机缺少 expect,请先安装: apt-get install expect 或 brew install expect"
  24. exit 1
  25. fi
  26. # 检查 SSH 连通性
  27. info "检查 149 SSH 连通性..."
  28. if ! ping -c 1 -W 2 "$REMOTE_HOST" >/dev/null 2>&1; then
  29. fail "无法 ping 通 $REMOTE_HOST"
  30. exit 1
  31. fi
  32. ok "SSH 目标 $REMOTE_HOST 可达"
  33. # 生成远程验证 expect 脚本
  34. VERIFY_EXP=$(mktemp /tmp/verify_nextion_149.XXXXXX.exp)
  35. cat > "$VERIFY_EXP" << 'EOF'
  36. #!/usr/bin/expect -f
  37. set timeout 30
  38. set remote_dir [lindex $argv 0]
  39. set remote_user [lindex $argv 1]
  40. set remote_host [lindex $argv 2]
  41. set remote_pass [lindex $argv 3]
  42. set port [lindex $argv 4]
  43. spawn ssh $remote_user@$remote_host
  44. expect {
  45. "*yes/no*" { send "yes\r"; exp_continue }
  46. "*password:*" { send "$remote_pass\r" }
  47. timeout { puts "SSH_TIMEOUT"; exit 1 }
  48. }
  49. expect "*#*"
  50. # 1. 检查 /dev/ttyS9
  51. send "echo '===CHECK_TTYS9===' && ls -la /dev/ttyS9 2>&1\r"
  52. expect "*#*"
  53. # 2. 检查屏幕串口权限
  54. send "echo '===CHECK_PERMS===' && test -r /dev/ttyS9 && test -w /dev/ttyS9 && echo 'TTYS9_RW_OK' || echo 'TTYS9_RW_FAIL'\r"
  55. expect "*#*"
  56. # 3. 检查后端进程
  57. send "echo '===CHECK_PROCESS===' && ps aux | grep '[p]ython.*app.py' | head -1\r"
  58. expect "*#*"
  59. # 4. 检查端口监听
  60. send "echo '===CHECK_PORT===' && (ss -tulpn 2>/dev/null | grep :$port || netstat -tulpn 2>/dev/null | grep :$port || echo 'PORT_NOT_LISTEN')\r"
  61. expect "*#*"
  62. # 5. 调用 /api/screen/status
  63. send "echo '===SCREEN_STATUS===' && curl -s http://localhost:$port/api/screen/status\r"
  64. expect "*#*"
  65. # 6. 调用 /api/screen/refresh
  66. send "echo '===SCREEN_REFRESH===' && curl -s -X POST http://localhost:$port/api/screen/refresh\r"
  67. expect "*#*"
  68. # 7. 检查日志中是否有 Nextion 连接成功/失败
  69. send "echo '===APP_LOG_NEXTION===' && tail -n 30 $remote_dir/backend/app_service.log | grep -i -E 'nextion|屏幕' | tail -10\r"
  70. expect "*#*"
  71. # 8. 直接向串口屏发测试指令
  72. send "echo '===SCREEN_DIRECT_TEST===' && (echo -e 't2.txt=\"test149\"\\xff\\xff\\xff' > /dev/ttyS9 2>&1 && echo 'DIRECT_SEND_OK' || echo 'DIRECT_SEND_FAIL')\r"
  73. expect "*#*"
  74. send "exit\r"
  75. expect eof
  76. EOF
  77. chmod +x "$VERIFY_EXP"
  78. info "在 149 上执行验证..."
  79. OUTPUT=$("$VERIFY_EXP" "$REMOTE_DIR" "$REMOTE_USER" "$REMOTE_HOST" "$REMOTE_PASS" "$PORT" 2>/dev/null)
  80. rm -f "$VERIFY_EXP"
  81. # 解析输出
  82. echo "$OUTPUT" | grep -q "===CHECK_TTYS9===" && ok "SSH 登录成功" || fail "SSH 登录失败"
  83. if echo "$OUTPUT" | grep -q "/dev/ttyS9"; then
  84. ok "/dev/ttyS9 存在"
  85. else
  86. fail "/dev/ttyS9 不存在"
  87. fi
  88. if echo "$OUTPUT" | grep -q "TTYS9_RW_OK"; then
  89. ok "/dev/ttyS9 可读可写"
  90. else
  91. fail "/dev/ttyS9 读写权限不足"
  92. fi
  93. if echo "$OUTPUT" | grep -q "python.*app.py"; then
  94. ok "后端 app.py 进程正在运行"
  95. else
  96. fail "后端 app.py 进程未运行"
  97. fi
  98. if echo "$OUTPUT" | grep -q ":$PORT"; then
  99. ok "端口 $PORT 正在监听"
  100. else
  101. fail "端口 $PORT 未监听"
  102. fi
  103. if echo "$OUTPUT" | grep -q '"success": true.*"connected": true'; then
  104. ok "屏幕串口已连接 (/api/screen/status)"
  105. elif echo "$OUTPUT" | grep -q '"success": true.*"connected": false'; then
  106. fail "屏幕串口未连接 (/api/screen/status)"
  107. else
  108. fail "无法获取 /api/screen/status"
  109. fi
  110. if echo "$OUTPUT" | grep -q '"success": true.*屏幕已刷新'; then
  111. ok "手动刷新屏幕成功 (/api/screen/refresh)"
  112. elif echo "$OUTPUT" | grep -q '"success": false'; then
  113. warn "手动刷新屏幕返回失败(可能是屏幕未连接或没有 panel)"
  114. else
  115. fail "无法调用 /api/screen/refresh"
  116. fi
  117. if echo "$OUTPUT" | grep -qi "Nextion 屏幕串口已连接\|屏幕已刷新"; then
  118. ok "应用日志中有 Nextion 相关记录"
  119. else
  120. warn "应用日志中未找到 Nextion 相关记录"
  121. fi
  122. if echo "$OUTPUT" | grep -q "DIRECT_SEND_OK"; then
  123. ok "可直接向 /dev/ttyS9 发送指令"
  124. else
  125. fail "无法直接向 /dev/ttyS9 发送指令"
  126. fi
  127. info "验证完成: 通过 $pass_count 项, 失败 $fail_count 项"
  128. if [ "$fail_count" -eq 0 ]; then
  129. info "全部检查通过。请肉眼确认屏幕上显示:终端名、版本、MQTT 状态、24 端口图标。"
  130. exit 0
  131. else
  132. err "存在失败项,请根据上方输出排查。"
  133. exit 1
  134. fi