Files
xMonitor/Plan.md
2026-04-14 22:06:16 +08:00

162 lines
7.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
自启方案monitor_sender.py 通过手机热点自动启动
Context
monitor_sender.py 是一个 ROS2 节点运行在机器人控制器上Ubuntu, 用户名
ubuntu订阅机器人状态话题并通过 WebSocket 发送到 PC
端监控服务器。设备在真实世界运行,需要开机后:
1. 自动连接手机热点 WiFi
2. 等待网络就绪后启动 monitor_sender.py通过热点向 PC 的固定 IP 发送数据)
3. 崩溃后自动重启并记录崩溃原因
方案systemd 服务 + 启动脚本(两个文件搞定)
文件 1启动脚本 ~/xMonitor/start_monitor.sh
#!/bin/bash
# ========== 配置区(按实际修改) ==========
HOTSPOT_SSID="你的热点名称" # ← 稍后填
HOTSPOT_PASS="你的热点密码" # ← 稍后填
SERVER_IP="192.168.43.xxx" # ← 电脑在热点中的固定 IP
SERVER_PORT=9000
# ==========================================
LOG_DIR="$HOME/xMonitor/logs"
mkdir -p "$LOG_DIR"
LOG_FILE="$LOG_DIR/monitor_$(date +%Y%m%d_%H%M%S).log"
exec > >(tee -a "$LOG_FILE") 2>&1
echo "===== $(date) 启动 monitor_sender ====="
# --- 1) 连接手机热点 ---
echo "[NET] 正在连接热点: $HOTSPOT_SSID"
MAX_WIFI_RETRY=30
for i in $(seq 1 $MAX_WIFI_RETRY); do
# 尝试连接(如果已保存过连接配置则直接 up否则新建
nmcli dev wifi connect "$HOTSPOT_SSID" password "$HOTSPOT_PASS" 2>/dev/null \
|| nmcli con up "$HOTSPOT_SSID" 2>/dev/null
# 检查是否拿到 IP
if nmcli -t -f GENERAL.STATE dev show wlan0 2>/dev/null | grep -q "100"; then
echo "[NET] WiFi 已连接 ($i/$MAX_WIFI_RETRY)"
break
fi
echo "[NET] WiFi 未就绪,重试 ($i/$MAX_WIFI_RETRY)..."
sleep 3
done
# --- 2) 等待能 ping 通服务器 ---
echo "[NET] 等待服务器 $SERVER_IP 可达..."
MAX_PING_RETRY=20
for i in $(seq 1 $MAX_PING_RETRY); do
if ping -c 1 -W 2 "$SERVER_IP" >/dev/null 2>&1; then
echo "[NET] 服务器可达 ✓"
break
fi
echo "[NET] ping 失败,重试 ($i/$MAX_PING_RETRY)..."
sleep 3
done
# --- 3) Source 环境并启动 ---
echo "[ENV] source ROS2 workspace..."
source /home/ubuntu/ros2ws/install/setup.bash
echo "[ENV] source Python venv..."
source "$HOME/xMonitor/.venv/bin/activate"
echo "[RUN] 启动 monitor_sender.py --ip $SERVER_IP --port $SERVER_PORT"
cd "$HOME/xMonitor"
python3 monitor_sender.py --ip "$SERVER_IP" --port "$SERVER_PORT"
EXIT_CODE=$?
echo "===== $(date) 进程退出, code=$EXIT_CODE ====="
exit $EXIT_CODE
文件 2systemd 服务 /etc/systemd/system/xmonitor.service
[Unit]
Description=xMonitor Robot Status Sender
After=network-manager.service
Wants=network-manager.service
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/xMonitor
ExecStart=/bin/bash /home/ubuntu/xMonitor/start_monitor.sh
# --- 崩溃自动重启 ---
Restart=on-failure
RestartSec=10
# --- 崩溃日志 ---
StandardOutput=journal
StandardError=journal
SyslogIdentifier=xmonitor
[Install]
WantedBy=multi-user.target
部署步骤(在机器人设备上执行)
# 1. 将 start_monitor.sh 放到 ~/xMonitor/ 并加执行权限
chmod +x ~/xMonitor/start_monitor.sh
# 2. 编辑 start_monitor.sh 顶部配置区填入热点名称、密码、电脑IP
# 3. 复制 service 文件并启用
sudo cp xmonitor.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable xmonitor.service
# 4. 立即测试启动(可选)
sudo systemctl start xmonitor.service
# 5. 查看状态 / 日志
systemctl status xmonitor.service
journalctl -u xmonitor -f # 实时查看日志
ls ~/xMonitor/logs/ # 查看历史日志文件
关键设计说明
┌────────────┬───────────────────────────────────────────────────────────────┐
│ 需求 │ 实现方式 │
├────────────┼───────────────────────────────────────────────────────────────┤
│ 连热点 │ nmcli dev wifi connect 循环重试,最多 30 次 × 3 秒 │
├────────────┼───────────────────────────────────────────────────────────────┤
│ 等待网络 │ ping 服务器 IP 直到可达 │
├────────────┼───────────────────────────────────────────────────────────────┤
│ source │ 脚本内 source .venv/bin/activate │
│ 虚拟环境 │ │
├────────────┼───────────────────────────────────────────────────────────────┤
│ source │ 脚本内 source /home/ubuntu/ros2ws/install/setup.bash来自 │
│ ROS2 │ README
├────────────┼───────────────────────────────────────────────────────────────┤
│ 崩溃重启 │ systemd Restart=on-failure + RestartSec=1010 秒后重启) │
├────────────┼───────────────────────────────────────────────────────────────┤
│ 崩溃日志 │ 双保险:① journalctl -u xmonitor 系统日志 ② ~/xMonitor/logs/ │
│ │ 下按时间戳命名的文本日志 │
├────────────┼───────────────────────────────────────────────────────────────┤
│ 开机自启 │ systemctl enable xmonitor.service │
└────────────┴───────────────────────────────────────────────────────────────┘
待用户提供
- 手机热点 SSID
- 手机热点密码
- 电脑在热点中的固定 IP192.168.43.???
需要创建/修改的文件
1. 新建 ~/xMonitor/start_monitor.sh — 启动脚本
2. 新建 ~/xMonitor/xmonitor.service — systemd 服务文件(用户手动 sudo cp 到
/etc/systemd/system/
验证方法
1. 手动运行 bash ~/xMonitor/start_monitor.sh 确认 WiFi 连接和程序启动正常
2. sudo systemctl start xmonitor.service 启动服务
3. systemctl status xmonitor.service 确认 active (running)
4. journalctl -u xmonitor -f 实时查看日志
5. 杀掉 python 进程 kill $(pgrep -f monitor_sender) 验证自动重启
6. 重启设备验证开机自启