Files
H100PowerManger/scripts/deploy.sh
T
zjk 54c32a180a 新增复合管控器(pCCU) + 惯导数据解析 + 设备控制页增强 + 0824协议文档归档
- 新增 pCCU 复合管控器程序(src/pCCU):FC/PM 双链路(UDP)、协议编解码器
  (FcProtocol/PmProtocol/Frame/Message/MessageRegistry)、快照与落库(DbStore)、
  内置 WebServer;挂入 src/CMakeLists.txt 与板卡 mission(h100.moos)
- 惯导/深度数据:新增 uDevice_insData 消息解析,接入 UpperCommManager,
  pPowerMangerHost 注册监视,UpmsgTest 覆盖
- pPowerMangerHost 设备控制页增强(web/index.html)
- 部署/运维脚本改为 4 个 systemd 服务(moosdb/pPowerManger/pPowerMangerHost/pCCU):
  deploy/clean-data/fetch-data 同步适配
- 协议文档:归档 0824 控制主机与复合管控器通信协议 xlsx 及关联 docx,移除旧 md
- 测试:新增 pccu 单元/集成测试与 disSysTest Python 配电仿真
- 清理:移除未使用的 CCU 状态调试打印 coutMsg;.gitignore 补充编译产物/临时文件忽略
2026-08-26 22:43:10 +08:00

253 lines
9.3 KiB
Bash
Executable File
Raw 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.
#!/bin/bash
#=======================================================================
# FILE: scripts/deploy.sh
# DESC: 部署 pPowerManger / pPowerMangerHost / pCCU(aarch64 二进制 +
# mission)到目标板卡 (RK3588 / Ubuntu 22.04),并用四个独立
# systemd 服务(moosdb / pPowerManger / pPowerMangerHost / pCCU)
# 管理。只安装服务 + daemon-reload,默认不启动、不自启。
#
# 用法:
# ./scripts/deploy.sh setup-ssh 一次性:生成 ed25519 key + ssh-copy-id
# ./scripts/deploy.sh 默认:推送二进制 + mission + 装 4 个
# systemd 服务 + daemon-reload(不启动)
# ./scripts/deploy.sh --start 部署后按依赖顺序启动服务
# ./scripts/deploy.sh status 板卡 4 个服务状态
# ./scripts/deploy.sh stop 停止 4 个服务
# ./scripts/deploy.sh help 显示帮助
#
# 参数:
# --host <ip> 目标主机(默认 192.168.0.223)
# --user <user> 登录用户(默认 root)
# --board-dir <dir> 板卡部署根目录(默认 /root/work/h100)
# --start 部署后立即启动服务
#
# 板卡布局:
# /root/work/h100/bin/ aarch64 二进制
# /root/work/h100/missions/ 板卡 mission h100.moos
# /root/work/h100/data/ 数据库存储目录 (power_data.db 等)
# /etc/systemd/system/ moosdb.service / pPowerManger.service /
# pPowerMangerHost.service / pCCU.service
#=======================================================================
set -uo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "${SCRIPT_DIR}")"
HOST="192.168.0.223"
USER="root"
BOARD_DIR="/root/work/h100"
DO_START=0
SERVICES=(moosdb pPowerManger pPowerMangerHost pCCU)
info() { printf '\033[1;36m[deploy]\033[0m %s\n' "$*"; }
ok() { printf '\033[1;32m[deploy]\033[0m %s\n' "$*"; }
warn() { printf '\033[1;33m[deploy]\033[0m %s\n' "$*"; }
err() { printf '\033[1;31m[deploy]\033[0m %s\n' "$*"; }
usage() {
sed -n '2,29p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//'
exit 0
}
#-------------------------------------------------------------------
# 参数解析
#-------------------------------------------------------------------
ACTION=""
while [ $# -gt 0 ]; do
case "$1" in
--host) [ $# -ge 2 ] || { err "--host 需要参数"; exit 1; }; HOST="$2"; shift 2 ;;
--user) [ $# -ge 2 ] || { err "--user 需要参数"; exit 1; }; USER="$2"; shift 2 ;;
--board-dir)[ $# -ge 2 ] || { err "--board-dir 需要参数"; exit 1; }; BOARD_DIR="$2"; shift 2 ;;
--start) DO_START=1; shift ;;
setup-ssh|status|stop|help|-h|--help) ACTION="$1"; shift ;;
"") shift ;;
*) err "未知参数: $1(见 help)"; exit 1 ;;
esac
done
[ -n "${ACTION}" ] || ACTION="deploy"
SSH_TARGET="${USER}@${HOST}"
SSH="ssh -o BatchMode=yes -o ConnectTimeout=5"
SCP="scp -o BatchMode=yes -o ConnectTimeout=5"
#-------------------------------------------------------------------
# 命令: setup-ssh
#-------------------------------------------------------------------
cmd_setup_ssh() {
local key="$HOME/.ssh/id_ed25519"
if [ ! -f "${key}" ]; then
info "未发现 SSH key,生成 ed25519 key ..."
mkdir -p "$HOME/.ssh" && chmod 700 "$HOME/.ssh"
ssh-keygen -t ed25519 -N '' -f "${key}"
fi
info "上传公钥到 ${SSH_TARGET}(会提示输入密码,仅此一次)..."
ssh-copy-id -o ConnectTimeout=5 "${SSH_TARGET}"
ok "免密 SSH 已配置。验证: ssh ${SSH_TARGET}"
}
#-------------------------------------------------------------------
# 前置检查
#-------------------------------------------------------------------
check_local() {
local missing=0
for b in pPowerManger pPowerMangerHost pCCU; do
if [ ! -f "${PROJECT_ROOT}/bin/arm64/${b}" ]; then
err "缺少本地 aarch64 二进制: bin/arm64/${b}(先运行 ./scripts/build-arm64.sh)"; missing=1
elif ! file "${PROJECT_ROOT}/bin/arm64/${b}" | grep -q "aarch64"; then
err "bin/arm64/${b} 不是 aarch64 二进制"; missing=1
fi
done
if [ ! -f "${PROJECT_ROOT}/missions/h100.moos" ]; then
err "缺少板卡 mission: missions/h100.moos"; missing=1
fi
[ "${missing}" -eq 0 ] || return 1
ok "本地产物校验通过 (aarch64 + mission)"
}
check_ssh() {
if ! ${SSH} "${SSH_TARGET}" 'true' 2>/dev/null; then
err "无法免密 SSH 到 ${SSH_TARGET}"
err "请先执行: ./scripts/deploy.sh setup-ssh"
return 1
fi
ok "SSH 连接正常: ${SSH_TARGET}"
}
#-------------------------------------------------------------------
# 生成 systemd unit(含板卡绝对路径)
#-------------------------------------------------------------------
gen_moosdb_unit() {
# MOOSDB 路径在板卡探测;探测失败给出提示
local moosdb_bin
moosdb_bin="$(${SSH} "${SSH_TARGET}" 'command -v MOOSDB || true' 2>/dev/null)"
if [ -z "${moosdb_bin}" ]; then
moosdb_bin="$(command -v MOOSDB || true)"
warn "板卡未在 PATH 找到 MOOSDB,回退本机路径 ${moosdb_bin:-"(未找到)"}"
[ -n "${moosdb_bin}" ] || { err "MOOSDB 路径未知,无法生成 moosdb.service"; return 1; }
fi
ok "MOOSDB 路径: ${moosdb_bin}" >&2
cat <<EOF
[Unit]
Description=MOOSDB for H100 Power Manager
After=network.target
[Service]
Type=simple
ExecStart=${moosdb_bin} --moos_no_colour ${BOARD_DIR}/missions/h100.moos
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
}
gen_app_unit() {
local app="$1" deps=""
[ "${app}" = "moosdb" ] || deps="After=moosdb.service\nRequires=moosdb.service"
cat <<EOF
[Unit]
Description=${app} for H100 Power Manager
$(printf '%b' "${deps}")
[Service]
Type=simple
WorkingDirectory=${BOARD_DIR}/bin
ExecStart=${BOARD_DIR}/bin/${app} --alias=${app} ${BOARD_DIR}/missions/h100.moos
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
}
#-------------------------------------------------------------------
# 命令: deploy
#-------------------------------------------------------------------
cmd_deploy() {
check_local || return 1
check_ssh || return 1
# 1. 推送二进制 + mission
info "创建板卡目录 ${BOARD_DIR}/{bin,missions,data} ..."
${SSH} "${SSH_TARGET}" "mkdir -p ${BOARD_DIR}/bin ${BOARD_DIR}/missions ${BOARD_DIR}/data" || { err "创建目录失败"; return 1; }
info "推送 aarch64 二进制 ..."
${SCP} -q "${PROJECT_ROOT}/bin/arm64/pPowerManger" \
"${PROJECT_ROOT}/bin/arm64/pPowerMangerHost" \
"${PROJECT_ROOT}/bin/arm64/pCCU" \
"${SSH_TARGET}:${BOARD_DIR}/bin/" || { err "推送二进制失败"; return 1; }
info "推送 mission h100.moos ..."
${SCP} -q "${PROJECT_ROOT}/missions/h100.moos" \
"${SSH_TARGET}:${BOARD_DIR}/missions/" || { err "推送 mission 失败"; return 1; }
${SSH} "${SSH_TARGET}" "chmod +x ${BOARD_DIR}/bin/pPowerManger ${BOARD_DIR}/bin/pPowerMangerHost ${BOARD_DIR}/bin/pCCU"
ok "二进制与 mission 已推送"
# 2. 生成并安装 4 个 systemd unit
local unit
for s in "${SERVICES[@]}"; do
info "生成 ${s}.service ..."
if [ "${s}" = "moosdb" ]; then
unit="$(gen_moosdb_unit)" || return 1
else
unit="$(gen_app_unit "${s}")"
fi
printf '%s\n' "${unit}" | ${SSH} "${SSH_TARGET}" "cat > /etc/systemd/system/${s}.service"
ok "${s}.service 已安装"
done
# 3. daemon-reload(不 enable,不自启)
info "systemctl daemon-reload ..."
${SSH} "${SSH_TARGET}" "systemctl daemon-reload && systemctl reset-failed ${SERVICES[*]} 2>/dev/null || true"
ok "服务已安装但未启用自启(systemctl is-enabled 应输出 disabled)"
# 4. 可选启动
if [ "${DO_START}" = "1" ]; then
cmd_start
else
echo ""
info "部署完成。手动启动(或加 --start):"
echo " systemctl start moosdb pPowerManger pPowerMangerHost pCCU"
echo " 浏览器: http://${HOST}:18080 (上位机模拟)"
echo " http://${HOST}:8090 (pPowerManger)"
echo " http://${HOST}:8080 (pCCU)"
fi
}
#-------------------------------------------------------------------
# 命令: start / status / stop
#-------------------------------------------------------------------
cmd_start() {
info "启动服务 (moosdb -> pPowerManger / pPowerMangerHost / pCCU) ..."
${SSH} "${SSH_TARGET}" "systemctl start moosdb && sleep 1 && \
systemctl start pPowerManger pPowerMangerHost pCCU" || { err "启动失败"; return 1; }
ok "服务已启动"
cmd_status
}
cmd_status() {
${SSH} "${SSH_TARGET}" "systemctl --no-pager status ${SERVICES[*]}" || true
}
cmd_stop() {
${SSH} "${SSH_TARGET}" "systemctl stop pPowerMangerHost pPowerManger pCCU moosdb" && \
ok "服务已停止" || err "停止服务失败"
}
#-------------------------------------------------------------------
# 命令入口
#-------------------------------------------------------------------
case "${ACTION}" in
deploy) cmd_deploy ;;
setup-ssh) cmd_setup_ssh ;;
status) cmd_status ;;
stop) cmd_stop ;;
help|-h|--help) usage ;;
*) usage ;;
esac