目录

UbicoreOS on OpenHarmony — 快速入门指南

本文档面向初学者,涵盖从源码获取、编译、配置到部署的完整流程。

更新日期: 2026-06-02
适用产品: unionpi_whale (UnionMan 鲸鱼开发板)
核心模块: ubicoreos_service (后端 SA 服务) + ubicoreos_web_demo (前端 Web 控制面板)


项目简介

什么是 UbicoreOS

UbicoreOS 是基于 OpenHarmony 的分布式设备管理与协同系统,主要用于智能网关场景。它提供了统一的设备发现、拓扑管理、远程控制和状态监控能力,支持多种通信协议(WiFi、MQTT、WebSocket)。

核心组件

UbicoreOS 架构
├── ubicoreos_service (后端)          — OpenHarmony SA 服务,运行在开发板上
│   ├── 设备发现 (Discovery)          — 扫描局域网设备
│   ├── 拓扑管理 (Topology)            — 维护设备连接关系图
│   ├── 连接网关 (Connection Gateway) — WebSocket/TCP 服务端
│   ├── 链路探测 (Link Probe)         — 网络质量监测
│   ├── MQTT 桥接 (MQTT Bridge)       — 云端指令下发
│   └── 调度器 (Scheduler)             — 任务调度与协调
│
└── ubicoreos_web_demo (前端)         — Web 控制面板,运行在浏览器中
    ├── 设备接入面板                   — 查看/管理已连接设备
    ├── 运行时监控面板                 — 实时拓扑图、链路指标
    └── Mock Service Worker           — 本地开发时模拟后端

技术栈

层级 技术
后端运行时 OpenHarmony (OHOS) 标准系统
后端语言 C++17
后端框架 SystemAbility Framework (SAFWK)、samgr
前端框架 React 19 + TypeScript + Vite 7
前端样式 TailwindCSS
通信协议 WebSocket (前后端)、MQTT (云端)、TCP (设备间)
构建系统 GN + Ninja (后端)、pnpm + Vite (前端)

项目目录结构

完整源码树(关键路径)

/ohos/Unionpi_Whale/
├── unionpi_whale/                          # OpenHarmony 主仓库
│   ├── build/                              # 构建系统
│   │   ├── subsystem_config.json           # ★ 子系统注册表(新增模块需在此登记)
│   │   └── ohos/packages/
│   │       └── process_field_validate.py   # 高权限进程校验脚本
│   │
│   ├── vendor/unionman/unionpi_whale/      # 产品配置
│   │   ├── config.json                     # ★ 产品组件列表(启用哪些子系统/组件)
│   │   └── security_config/
│   │       ├── high_privilege_process_list.json  # ★ 高权限进程白名单
│   │       └── critical_reboot_process_list.json # 关键重启进程白名单
│   │
│   ├── base/security/selinux_adapter/      # SELinux 策略
│   │   └── sepolicy/base/
│   │       ├── public/
│   │       │   ├── service_contexts        # ★ SA ID → 服务对象类型映射
│   │       │   ├── service.te              # ★ 服务对象类型声明
│   │       │   ├── type.te                 # ★ 进程域类型声明
│   │       │   └── init.te                 # ★ init 进程权限
│   │       └── te/                         # ★ 各服务专属权限(一服务一文件)
│   │
│   ├── foundation/ubicoreos/               # ★★ UbicoreOS 模块(自定义子系统)
│   │   ├── README.md                       # 模块配置指南(子系统注册、安全配置)
│   │   └── ubicoreos_service/              # ★★ 后端服务实现
│   │       ├── bundle.json                 # ★ 组件描述文件
│   │       ├── BUILD.gn                    # 根构建脚本
│   │       ├── services/                   # 核心业务逻辑
│   │       │   ├── service/                # 主服务入口
│   │       │   ├── base/                   # 基础设施(EventLoop、ConfigManager)
│   │       │   ├── connection_gateway/     # WebSocket/TCP 服务端
│   │       │   ├── discovery/              # 设备发现
│   │       │   ├── device_manager/         # 设备管理
│   │       │   ├── runtime/                # 运行时子模块
│   │       │   │   ├── topology_aggregator/ # 拓扑管理
│   │       │   │   ├── link_probe/          # 链路探测
│   │       │   │   ├── mqtt_bridge/         # MQTT 桥接
│   │       │   │   └── scheduler/           # 调度器
│   │       │   └── utils/                  # 工具类
│   │       ├── interfaces/                 # 对外接口(暂未导出)
│   │       ├── sa_profile/                 # SA 配置
│   │       │   └── 10002.json              # ★ SA ID、进程名、自动重启配置
│   │       ├── etc/                        # 配置文件
│   │       │   ├── ubicoreos_service.cfg   # ★ init 启动配置(uid/gid/secon)
│   │       │   └── ubicoreos_service.conf  # ★ 服务运行时配置(WiFi/MQTT/端口)
│   │       ├── scripts/                    # ★★ 部署脚本
│   │       │   ├── deploy-ubicoreos.sh     # 部署 .so 到开发板
│   │       │   └── deploy-conf.sh          # 部署配置文件到开发板
│   │       ├── test/                       # 单元测试
│   │       ├── ARCHITECTURE.md             # 架构文档
│   │       └── RUNTIME_BACKEND_PROCESS.md  # 后端开发流程
│   │
│   ├── out/unionpi_whale/                  # ★★ 编译产物(编译后生成)
│   │   ├── packages/phone/                 # 最终打包产物
│   │   │   └── system/
│   │   │       ├── lib64/
│   │   │       │   └── libubicoreos_service.z.so  # ★ 进镜像的正式 .so(已裁剪)
│   │   │       ├── etc/
│   │   │       │   ├── init/ubicoreos_service.cfg
│   │   │       │   └── ubicoreos/ubicoreos_service.conf
│   │   │       └── profile/10002.json
│   │   ├── lib.unstripped/ubicoreos/       # 带调试符号的 .so(20MB+)
│   │   └── build.log                       # 编译日志
│   │
│   └── docs/                               # 文档目录
│       └── README0602.md                   # ★ 本文档
│
└── ubicoreos_web_demo/                     # ★★ 前端 Web 控制面板(独立仓库)
    ├── view/                               # 前端源码
    │   ├── src/
    │   │   ├── pages/                      # 页面组件
    │   │   │   ├── DeviceConnectionPage.tsx    # 设备接入面板
    │   │   │   └── RuntimeMonitoringPage.tsx   # 运行时监控面板
    │   │   ├── api/                        # WebSocket 通信层
    │   │   ├── mocks/                      # MSW Mock 数据
    │   │   └── ...
    │   ├── scripts/
    │   │   └── deploy-board.mjs            # ★ 前端部署脚本(Node.js)
    │   ├── package.json
    │   ├── vite.config.ts                  # Vite 配置(Mock/真实后端切换)
    │   └── dist/                           # 构建产物(执行 pnpm build 后生成)
    ├── data/www/                           # 本地部署目标目录
    └── DEVELOPMENT_GUIDE.md                # 前端开发指南

关键路径速查表

用途 路径 说明
新增子系统 build/subsystem_config.json 注册子系统名称与路径
产品组件配置 vendor/unionman/unionpi_whale/config.json 启用/禁用组件
高权限白名单 vendor/.../security_config/high_privilege_process_list.json root/system uid 白名单
SELinux 策略 base/security/selinux_adapter/sepolicy/base/ 5 处配置文件
后端服务源码 foundation/ubicoreos/ubicoreos_service/services/ C++ 业务逻辑
后端部署脚本 foundation/ubicoreos/ubicoreos_service/scripts/ .sh 自动化脚本
前端源码 /ohos/Unionpi_Whale/ubicoreos_web_demo/view/src/ React/TS 代码
前端部署脚本 ubicoreos_web_demo/view/scripts/deploy-board.mjs Node.js 脚本
编译产物(.so) out/unionpi_whale/packages/phone/system/lib64/ 最终进镜像的库
编译日志 out/unionpi_whale/build.log 排查编译错误

文件命名约定

  • bundle.json: 组件描述文件,定义依赖、构建目标、元信息
  • BUILD.gn: GN 构建脚本,定义编译规则(sources、deps、external_deps)
  • *.cfg: init 启动配置,声明服务的 uid/gid/secon/启动参数
  • *.conf: 服务运行时配置,业务参数(端口、WiFi、MQTT 等)
  • *_service.te: SELinux 策略文件,定义该服务的安全权限
  • 10002.json: SA profile,声明 SA ID、进程名、自动重启等

目录


0. 前置准备

💡 快速通道:

  • 只做前端UI开发? 跳到 第5章,使用Mock模式无需后端编译和开发板
  • 后端开发? 按 1→2→3→4 章顺序完整走一遍
  • 时间紧急? 先看 附录:完整工作流程速查

0.1 资源清单

所有必需资源已集中存放在 OHOS-Dev/ 目录:

资源 位置 说明 大小/时间
OpenHarmony源码包 OHOS-Dev/source/ tar.gz压缩包 50GB,解压后100GB
Python 2.7.18 OHOS-Dev/tools/Python-2.7.18.tgz 源码或预编译包 编译约10分钟
预编译工具链 OHOS-Dev/prebuilts/ GN、Ninja、Clang等 自动解压到源码树
RKDevTool OHOS-Dev/tools/RKDevTool/ Rockchip烧录工具(Windows) 含USB驱动
upgrade_tool OHOS-Dev/tools/upgrade_tool Linux烧录工具 可执行文件
hdc工具 OHOS-Dev/tools/hdc OpenHarmony设备连接工具 类似adb
串口工具 系统包管理器 minicom/screen/picocom apt install minicom

如果OHOS-Dev不在/ohos目录,请联系管理员获取资源包路径。

0.2 术语速查(初学者必读)

术语 全称 通俗解释 前端/硬件类比
SA SystemAbility OpenHarmony的系统服务单元,后台常驻进程 Express中间件 / 硬件的”看门狗”
SA ID - 服务的唯一标识符(如10002) 端口号 / 芯片地址
samgr System Ability Manager SA服务注册中心 Consul / Kubernetes API Server
SAFWK System Ability Framework SA开发框架 -
SELinux Security-Enhanced Linux 强制访问控制安全机制 CORS策略 / 硬件权限开关
hdc HarmonyOS Device Connector 设备调试工具 adb (Android)
hilog - 设备日志系统 console.log / 串口日志
GN Generate Ninja 元构建系统,生成Ninja构建文件 Webpack配置生成器 / Kconfig
Ninja - 实际执行编译的工具 make
bundle.json - 组件描述文件,声明依赖和构建目标 package.json / Makefile
.cfg文件 - init启动配置(uid/gid/启动参数) systemd service文件
.conf文件 - 服务运行时配置(端口/参数) .env / config.ini
remount - 重新挂载文件系统为可写 chmod +w整个分区

0.3 硬件要求

0.3.1 开发板

  • 型号: UnionMan 鲸鱼开发板 (unionpi_whale)
  • 关键接口:
    • USB Type-C:烧录和供电
    • MASKROM按键:进入烧录模式(位置见开发板丝印或说明书)
    • RJ45网口:有线网络连接(推荐)
    • UART调试口:串口日志输出(TX/RX/GND三针)

0.3.2 开发机

  • 操作系统: Linux (推荐 Ubuntu 20.04+)
  • 最低配置: 16GB RAM、200GB 磁盘空间(SSD强烈推荐)
  • 推荐配置: 32GB RAM、8核CPU、SSD
  • 权限要求: sudo权限(安装系统依赖)

环境预检查脚本(可选,快速验证):

#!/bin/bash
echo "=== 环境预检查 ==="

# 内存
total_ram=$(free -g | awk '/^Mem:/{print $2}')
echo "内存: ${total_ram}GB (需求≥16GB)"
[[ $total_ram -lt 16 ]] && echo "⚠️  警告:内存不足,编译可能失败"

# 磁盘
free_space=$(df -BG /ohos 2>/dev/null | awk 'NR==2{print $4}' | sed 's/G//')
echo "磁盘剩余: ${free_space}GB (需求≥200GB)"
[[ ${free_space:-0} -lt 200 ]] && echo "⚠️  警告:磁盘空间不足"

# CPU
cores=$(nproc)
echo "CPU核心: $cores (推荐≥8,影响编译速度)"

# 网络
ping -c1 -W2 gitee.com &>/dev/null && echo "✓ Gitee连通" || echo "✗ Gitee不通"

# Python
python --version 2>&1 | grep -q "Python 2.7" && echo "✓ Python 2.7已安装" || echo "✗ 需安装Python 2.7"
python3 --version 2>&1 | grep -q "Python 3" && echo "✓ Python 3已安装" || echo "✗ 需安装Python 3"

echo "=== 检查完成 ==="

0.4 软件环境

  • 操作系统: Linux
  • 必需工具:
    • git、Python 2.7 + 3.8+(编译系统同时依赖两者)
    • Node.js 20.19+ / 22.12+(仅前端开发需要)
    • hdc(OpenHarmony调试工具,从OHOS-Dev获取)
  • 可选工具:
    • ccache (加速重复编译)
    • ssh/scp (开发板部署)
    • minicom/screen (串口调试)

0.5 网络连接

  • 编译阶段: 开发机能访问Gitee/GitHub(下载依赖)
  • 部署阶段: 开发板与开发机在同一局域网(用于SSH/scp部署)
  • 公司内网环境: 如需代理请配置 http_proxy 和 https_proxy 环境变量

1. 源码获取与构建

1.1 获取源码

1.1.1 解压源码包

如果你拿到的是 tar 压缩包(如 OpenHarmony-v3.2.tar.gz):

# 解压到指定目录
cd /ohos
tar -xzvf OpenHarmony-v3.2.tar.gz

# 或如果是 .tar.bz2
tar -xjvf OpenHarmony-v3.2.tar.bz2

# 或如果是 .tar.xz
tar -xJvf OpenHarmony-v3.2.tar.xz

# 进入源码目录
cd Unionpi_Whale/unionpi_whale

提示: 新版 GNU tar 能自动识别压缩格式,直接 tar -xvf 文件名 即可。

1.1.2 通过 repo 获取(可选)

如果从 Gitee/GitHub 拉取源码:

# 初始化 repo(以 OpenHarmony 3.2 为例)
repo init -u https://gitee.com/openharmony/manifest.git -b OpenHarmony-3.2-Release --no-repo-verify

# 同步代码(首次约 50GB+,需较长时间)
repo sync -c -j8

# 同步 LFS 大文件
repo forall -c 'git lfs pull'

1.2 配置编译环境

1.2.1 系统要求与依赖安装

⚠️ 重要提示:推荐使用 Ubuntu 20.04

  • Ubuntu 20.04:测试通过,依赖库兼容性好 ✅
  • Ubuntu 24.04:版本过高,依赖库不兼容问题严重 ❌
  • 网络要求:需要外网环境,部分依赖库从国外源下载

安装基础依赖库:

sudo apt-get update && sudo apt-get install \
    binutils git git-lfs gnupg flex bison gperf \
    build-essential zip curl zlib1g-dev \
    gcc-multilib g++-multilib libc6-dev-i386 \
    lib32ncurses-dev x11proto-core-dev libx11-dev \
    lib32z1-dev ccache libgl1-mesa-dev \
    libxml2-utils xsltproc unzip m4 bc gnutls-bin \
    python3.8 python3-pip ruby \
    device-tree-compiler lib32stdc++6 lib32z1 libncurses5-dev \
    screen -y

验证基础语言环境:

确保 Python、C/C++、Java 等基础开发库已安装。如存在多个版本,需配置好当前使用版本(见下节)。

# 检查 gcc/g++
gcc --version
g++ --version

# 检查 Python 3
python3 --version  # 应显示 Python 3.8.x

# 检查 Java(如果需要)
java -version

1.2.2 配置 Python 2.7

OpenHarmony 编译系统依赖 Python 2.7,需要与 Python 3 共存。

获取 Python 2.7.18 源码:

# 方式一:从 OHOS-Dev 获取(推荐)
cd OHOS-Dev/tools/
tar -xzf Python-2.7.18.tgz
cd Python-2.7.18/

# 方式二:从官网下载(需外网)
wget https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz
mv Python-2.7.18.tgz ~/Downloads/
tar -xzf ~/Downloads/Python-2.7.18.tgz
cd Python-2.7.18/

编译安装:

# 编译安装(约 5-10 分钟)
sudo ./configure --enable-optimizations
sudo make altinstall

配置版本管理(关键步骤):

使用 update-alternatives 管理 Python 2 和 3 的切换,安全且可随时切换:

# 1. 创建 python2 软链接
sudo ln -sfn /usr/local/bin/python2.7 /usr/bin/python2

# 2. 配置 update-alternatives(优先级:python2=1,python3=2)
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 2

# 3. 选择 Python 2.7 作为默认 python
sudo update-alternatives --config python
# 输入 python2 对应的编号(通常是 1),按回车

验证配置:

python --version    # 应显示 Python 2.7.18(编译OpenHarmony时使用)
python2 --version   # 应显示 Python 2.7.18
python3 --version   # 应显示 Python 3.8.x(系统工具仍然可用)

✓ 配置成功标志:

  • python --version → Python 2.7.18
  • python3 命令仍然可用(系统工具不受影响)
  • 编译 OpenHarmony 时不会报 “python not found”

如需切换回 Python 3:

sudo update-alternatives --config python
# 选择 python3 对应的编号(通常是 2)

常见问题:

问题 解决方法
提示 update-alternatives 冲突 sudo update-alternatives --remove-all python 后重新配置
编译时找不到 python 确认 python --version 显示 2.7.18
担心破坏系统工具 系统工具使用 python3 命令,不受影响

1.2.3 安装 Python 3(如果没有)

Ubuntu 20.04 默认已安装 Python 3.8,验证即可:

python3 --version  # 应显示 Python 3.8.x

如果缺失,安装:

sudo apt-get install python3.8 python3-pip python3-setuptools

1.2.4 安装 hdc 工具

hdc 是 OpenHarmony 设备连接工具(类似 Android 的 adb),用于部署、日志查看、shell 连接。

# 从 OHOS-Dev 获取
cd /ohos
sudo cp OHOS-Dev/tools/hdc /usr/local/bin/
sudo chmod +x /usr/local/bin/hdc

# 验证
hdc -v
# 应显示版本信息

# 如果 OHOS-Dev 中没有,可从预编译工具链提取(编译后)
# cp prebuilts/ohos-sdk/linux/toolchains/hdc /usr/local/bin/

hdc 常用命令速查:

hdc list targets          # 列出已连接设备
hdc shell                 # 进入设备 shell
hdc file send <本地> <设备路径>  # 推送文件
hdc file recv <设备路径> <本地>  # 拉取文件

1.2.5 配置 ccache(可选,加速重复编译)

# 安装
sudo apt-get install ccache

# 配置缓存大小(建议 50GB+)
ccache -M 50G

# 查看状态
ccache -s

1.2.6 准备预编译工具链

cd /ohos/Unionpi_Whale/unionpi_whale

# 如果 OHOS-Dev 中有预下载的工具链
cp -r /ohos/OHOS-Dev/prebuilts/* prebuilts/

# 否则执行下载脚本(需要网络,约30分钟-2小时)
bash build/prebuilts_download.sh

# 验证工具链完整性
ls prebuilts/clang/ohos/linux-x86_64/  # 应看到 clang 目录
ls prebuilts/cmake/                     # 应看到 cmake

✓ 验证环境配置完成:

# 所有检查项应通过
python2 --version        # Python 2.7.18
python3 --version        # Python 3.8+
hdc -v                   # 显示版本
which ccache             # /usr/bin/ccache
ls prebuilts/clang/      # 目录存在

1.3 首次全量编译

环境配置完成后,开始首次编译:

cd /ohos/Unionpi_Whale/unionpi_whale

# 日常开发编译(推荐,不生成镜像,速度快)
./build.sh --product-name unionpi_whale \
  --ccache \
  --no-prebuilt-sdk \
  --disable-package-image

# 首次烧录开发板时需要镜像,去掉 --disable-package-image
./build.sh --product-name unionpi_whale --ccache

# 编译日志保存在
# out/unionpi_whale/build.log

编译参数说明:

  • --product-name unionpi_whale — 指定产品名称
  • --ccache — 启用 ccache 缓存,加速重复编译
  • --no-prebuilt-sdk — 跳过预编译 SDK 阶段(加快增量编译)
  • --disable-package-image — 不打包系统镜像(仅编译,节省时间,日常开发推荐)

⚠️ 重要: 首次烧录开发板或需要更新系统镜像时,去掉 --disable-package-image 参数。

编译过程说明:

  1. GN 阶段: 生成 Ninja 构建文件(约 2-5 分钟)
  2. Ninja 阶段: 执行实际编译(主要耗时部分)
  3. 打包阶段: 生成系统镜像(如果未加 --disable-package-image)

编译时间参考:

  • 16GB RAM / 4核 / HDD → 约 3 小时
  • 32GB RAM / 8核 / SSD → 约 1.5 小时
  • 64GB RAM / 16核 / NVMe SSD → 约 50 分钟

编译产物位置:

  • 系统镜像(如果生成):out/unionpi_whale/packages/phone/images/
    • system.img — 系统分区镜像
    • vendor.img — 厂商分区镜像
    • userdata.img — 用户数据分区镜像
  • 独立库文件: out/unionpi_whale/packages/phone/system/lib64/
  • 带调试符号的库: out/unionpi_whale/lib.unstripped/

✓ 编译成功标志:

  • 终端显示 “build success”
  • ls out/unionpi_whale/packages/phone/system/lib64/*.so 能看到大量 .so 文件

1.3.1 编译失败排查

查看错误摘要:

# 查看最后 50 行(通常包含核心错误)
tail -n 50 out/unionpi_whale/build.log

# 搜索第一个 ERROR(后续可能是连锁反应)
grep -n "ERROR" out/unionpi_whale/build.log | head -5

常见错误速查:

错误关键词 原因 解决方法
python: command not found Python 2.7 未配置 确认 python --version 显示 2.7.18(见 1.2.2 节)
No such file or directory: 'xxx.h' 缺少头文件 检查依赖包是否完整安装(1.2.1 节)
undefined reference to 链接错误 检查 BUILD.gn 的 external_deps
Permission denied 权限不足 检查是否有 sudo 权限,或 out 目录权限
internal compiler error: Killed 内存不足 减少并行数:添加 -j4 参数
No space left on device 磁盘空间不足 清理磁盘或扩容(需 200GB+)

如何减少并行度(内存不足时):

# 限制并行数为 4(默认使用所有 CPU 核心)
./build.sh --product-name unionpi_whale --ccache -j4

1.4 烧录到开发板

编译成功后,将镜像烧录到开发板。

1.4.1 准备烧录工具

烧录工具已放在 OHOS-Dev/tools/ 目录。

Windows 环境:

  • 使用 RKDevTool(Rockchip 官方工具)
  • 位置:OHOS-Dev/tools/RKDevTool/
  • 包含 USB 驱动(DriverAssitant)

Linux 环境:

  • 使用 upgrade_tool
  • 位置:OHOS-Dev/tools/upgrade_tool
# 复制到系统路径
sudo cp OHOS-Dev/tools/upgrade_tool /usr/local/bin/
sudo chmod +x /usr/local/bin/upgrade_tool

# 验证
upgrade_tool --version

或使用开源工具 rkdeveloptool:

# 安装依赖
sudo apt-get install libudev-dev libusb-1.0-0-dev dh-autoreconf

# 编译安装(如果 OHOS-Dev 中没有预编译版)
git clone https://github.com/rockchip-linux/rkdeveloptool
cd rkdeveloptool
autoreconf -i
./configure
make
sudo make install

1.4.2 进入烧录模式

⚠️ 开发板物理操作(请参考开发板说明书确认按键位置):

  1. 开发板断电
  2. 按住 MASKROM 按键(通常标注为 “MASKROM” 或 “RECOVERY”,靠近USB接口)
  3. 通过 USB Type-C 连接开发板与电脑
  4. 松开按键,此时开发板进入烧录模式

验证是否进入烧录模式:

# Linux
lsusb | grep Rockchip
# 应显示类似:Bus 001 Device 010: ID 2207:330c Fuzhou Rockchip Electronics Company
# 或看到 "Rockchip Device in Maskrom Mode"

# Windows
# 设备管理器中看到 "Rockchip Device" 或 "Rockchip USB"

如果进不去 Maskrom 模式:

  • 确认按键位置(查看开发板丝印标注或说明书)
  • 有的板子需要先按住再上电(而不是断电后按)
  • 换 USB 口/线(直连主机 USB 2.0 口,不要用 Hub)
  • 检查 USB 驱动(Windows 需要用 DriverAssitant 安装)

1.4.3 烧录镜像

方式一:使用 RKDevTool(Windows,推荐新手)

  1. 打开 OHOS-Dev/tools/RKDevTool/RKDevTool.exe
  2. 切换到”下载镜像”标签
  3. 确认设备已识别(显示”发现一个MASKROM设备”)
  4. 加载配置或手动选择镜像文件:
    • system: out/unionpi_whale/packages/phone/images/system.img
    • vendor: out/unionpi_whale/packages/phone/images/vendor.img
    • userdata: out/unionpi_whale/packages/phone/images/userdata.img
  5. 点击”执行”开始烧录(约 5-10 分钟)

方式二:使用 upgrade_tool(Linux 命令行)

cd /ohos/Unionpi_Whale/unionpi_whale/out/unionpi_whale/packages/phone/images

# 检测设备
sudo upgrade_tool ld
# 应显示设备列表

# 烧录 system 分区
sudo upgrade_tool di -s system.img

# 烧录 vendor 分区  
sudo upgrade_tool di -v vendor.img

# 烧录 userdata 分区
sudo upgrade_tool di -userdata userdata.img

# 重启设备
sudo upgrade_tool rd

✓ 烧录成功标志:

  • 进度条 100%
  • 显示”下载完成”或”Download image ok”
  • 设备自动重启(或手动执行 upgrade_tool rd)

1.4.4 首次启动与验证

烧录完成后:

  1. 断开 USB 连接(或保持连接用于 hdc)
  2. 给开发板上电(如果已上电则按复位键)
  3. 等待启动(首次启动约 1-2 分钟)

验证启动成功(三种方式):

方式一:通过 hdc(USB 或网络)

# USB 连接模式
hdc list targets
# 应显示设备序列号

hdc shell
# 进入 OpenHarmony shell,看到提示符 "#"

方式二:通过串口(最可靠)

见下一节 1.4.5 串口调试,串口能看到完整启动日志。

方式三:通过网络(需先配置 IP)

见 1.4.6 网络配置。

1.4.5 串口调试配置

串口是嵌入式开发的核心调试手段,可以看到从 U-Boot 到内核启动的完整日志,排查启动失败问题。

硬件连接:

  1. 准备 USB 转 TTL 模块(如 CP2102、CH340、PL2303)

  2. 连接开发板 UART 调试口(通常是 3 针或 4 针排针):

    USB-TTL 模块        开发板 UART0
    ─────────────      ──────────────
    TXD (发送)    →    RX (接收)
    RXD (接收)    ←    TX (发送)
    GND (地)      ─    GND (地)
    VCC (供电)         不连接(开发板独立供电)

    ⚠️ 注意 TX/RX 交叉连接:模块的 TX 接板子的 RX,模块的 RX 接板子的 TX。

  3. USB-TTL 模块插入开发机

配置串口工具:

# 安装 screen(已在 1.2.1 系统依赖中安装)
sudo apt-get install screen

# 或使用 minicom
sudo apt-get install minicom
sudo minicom -s  # 进入配置:选择串口设备、波特率

# 查找串口设备
ls /dev/ttyUSB*
# 通常是 /dev/ttyUSB0

# 使用 screen 连接(推荐,简单)
sudo screen /dev/ttyUSB0 115200
# 参数说明:设备路径 波特率(115200)

# 使用 minicom 连接
sudo minicom -D /dev/ttyUSB0 -b 115200

串口配置参数:

  • 波特率: 115200(OpenHarmony 标准,部分板子 U-Boot 阶段可能是 1500000)
  • 数据位: 8
  • 停止位: 1
  • 校验位: 无(None)
  • 流控: 关闭(无硬件流控)

正常启动日志示例:

[0.5s] U-Boot 2017.09 (Dec 01 2023 - 10:23:45 +0800)
[2.3s] ## Booting kernel from Legacy Image at 00280000 ...
[5.8s] [    0.000000] Booting Linux on physical CPU 0x0
[8.2s] [    2.456789] init: start running
[12.1s] # <-- 看到提示符说明系统启动完成

串口故障排查:

现象 可能原因 解决方法
完全无输出 TX/RX 接反 对调 TX/RX 线
GND 未连接 确认 GND 连接
波特率错误 试试 1500000
板子未上电 检查供电
乱码 波特率不匹配 调整为 115200
数据位/停止位错误 设置为 8N1
偶尔丢字符 USB-TTL 质量差 换模块或换 USB 口

screen 使用技巧:

  • Ctrl+A 然后 K → 退出 screen
  • Ctrl+A 然后 D → 分离会话(后台保留)
  • screen -r → 恢复分离的会话
  • screen -ls → 列出所有会话

1.4.6 开发板网络配置

网络是后续 SSH 部署、远程调试的基础,必须配置。

方式一:有线网络(推荐,稳定)

  1. 硬件连接:

    • 网线连接开发板 RJ45 口 ↔ 路由器/交换机
    • 确认网口 LED 灯亮起
  2. 通过串口或 hdc shell 进入设备:

    hdc shell
    # 或串口已连接
  3. 查看网络接口:

    ifconfig
    # 或
    ip addr show
    
    # 应看到 eth0 网卡,检查是否有 IP 地址
  4. DHCP 自动获取 IP(推荐):

    # 开发板上执行
    dhclient eth0
    # 或
    udhcpc -i eth0
    
    # 再次查看 IP
    ifconfig eth0
    # 应显示 inet addr: 192.168.x.x
  5. 配置静态 IP(可选):

    # 设置 IP(根据你的局域网段修改)
    ifconfig eth0 192.168.1.108 netmask 255.255.255.0
    
    # 设置网关
    route add default gw 192.168.1.1
    
    # 设置 DNS
    echo "nameserver 8.8.8.8" > /etc/resolv.conf
  6. 验证网络:

    # 开发板上 ping 网关
    ping -c 3 192.168.1.1
    
    # 开发机上 ping 开发板
    ping 192.168.1.108

方式二:WiFi 网络(可选)

如果开发板支持 WiFi(需确认硬件配置):

# 查看 WiFi 接口
ifconfig wlan0

# 扫描可用网络
iw dev wlan0 scan | grep SSID

# 连接 WiFi(需要 wpa_supplicant 配置)
wpa_cli -i wlan0
> add_network
0
> set_network 0 ssid "你的WiFi名称"
> set_network 0 psk "WiFi密码"
> enable_network 0
> quit

# DHCP 获取 IP
dhclient wlan0

配置 SSH 服务:

# 检查 sshd 是否运行
ps aux | grep sshd

# 如果未运行,启动 sshd
/usr/sbin/sshd

# 设置 root 密码(如果未设置)
passwd root
# 输入新密码

# 验证端口监听
netstat -tlnp | grep 22
# 应看到 0.0.0.0:22 LISTEN

从开发机连接:

# SSH 连接
ssh root@192.168.1.108
# 输入密码

# 配置免密登录(推荐)
ssh-keygen -t rsa  # 如果已有密钥跳过
ssh-copy-id root@192.168.1.108
# 或手动复制:
cat ~/.ssh/id_rsa.pub | ssh root@192.168.1.108 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

# 再次连接应无需密码
ssh root@192.168.1.108

网络故障排查:

现象 排查步骤
ifconfig 无 eth0 检查网线、驱动是否加载(dmesg | grep eth)
IP 是 169.254.x.x DHCP 失败,配置静态 IP 或检查路由器
ping 网关不通 检查网关地址、路由表(route -n)
开发机 ping 不通开发板 防火墙、不在同一网段、开发板无网关
ssh 连接被拒绝 sshd 未启动、端口未监听、防火墙阻止

✓ 网络配置成功标志:

# 开发板能 ping 通网关
ping -c 1 192.168.1.1

# 开发机能 SSH 登录开发板
ssh root@192.168.1.108

1.5 增量编译(日常开发)

首次全量编译后,日常开发使用增量编译(约 30s~2min):

cd /ohos/Unionpi_Whale/unionpi_whale

# 快速增量编译(跳过 preloader、syscap 等预处理阶段)
./build.sh --product-name unionpi_whale --ccache --no-prebuilt-sdk --fast-rebuild

1.6 编译单个模块

仅重新编译特定组件:

# 编译 ubicoreos_service
./build.sh --product-name unionpi_whale --build-target ubicoreos_service --ccache

1.7 清理

# 清理所有编译产物
./build.sh --product-name unionpi_whale --gn-args clean

# 或直接删除 out 目录
rm -rf out

# 清理 ccache 缓存
ccache -C

2. 添加新模块到系统(以 ubicoreos 为例)

当在 foundation/ 下新增自定义模块时,需要完成以下配置才能被编译系统识别。完整说明见 foundation/ubicoreos/README.md。

2.1 注册子系统

编辑 build/subsystem_config.json,添加新子系统:

{
  "ubicoreos": {
    "path": "foundation/ubicoreos",
    "name": "ubicoreos"
  }
}

2.2 创建 bundle.json

在组件目录下创建 bundle.json,定义组件信息:

文件: foundation/ubicoreos/ubicoreos_service/bundle.json

{
  "name": "@ubicoreos/ubicoreos-service",
  "description": "UbiCoreOS Service",
  "version": "1.0",
  "component": {
    "name": "ubicoreos_service",
    "subsystem": "ubicoreos",
    "adapted_system_type": ["standard"],
    "deps": {
      "components": ["c_utils", "hilog", "ipc", "samgr", "safwk"]
    },
    "build": {
      "group_type": {
        "service_group": [
          "//foundation/ubicoreos/ubicoreos_service/services:ubicoreos_service"
        ]
      }
    }
  }
}

2.3 添加到产品配置

编辑产品配置文件,启用该组件:

文件: vendor/unionman/unionpi_whale/config.json

在 subsystems 数组中添加:

{
  "subsystem": "ubicoreos",
  "components": [
    {
      "component": "ubicoreos_service",
      "features": []
    }
  ]
}

2.4 编写 BUILD.gn

在模块目录下创建 BUILD.gn 定义编译规则:

import("//build/ohos.gni")

ohos_shared_library("ubicoreos_service") {
  sources = [ "src/service.cpp" ]
  include_dirs = [ "include" ]
  
  external_deps = [
    "c_utils:utils",
    "hilog:libhilog",
    "ipc:ipc_core",
  ]
  
  part_name = "ubicoreos_service"
  subsystem_name = "ubicoreos"
}

关键字段:

  • part_name: 组件名(与 bundle.json 的 component.name 一致)
  • subsystem_name: 子系统名(与 subsystem_config.json 的 key 一致)
  • external_deps: 外部依赖,格式 "组件名:目标名"

3. 安全配置

3.1 高权限进程白名单

如果服务的 .cfg 文件声明 uid: root 或 uid: system,需要在高权限进程白名单中登记,否则编译失败。

报错示例:

[OHOS ERROR] Error: some services are not authenticated. Listed as follow:
[OHOS ERROR] Name: ubicoreos_service
[OHOS ERROR] uid: root

解决方法:

编辑 vendor/unionman/unionpi_whale/security_config/high_privilege_process_list.json,添加对应条目:

{
  "name": "ubicoreos_service",
  "uid": "root",
  "gid": ["root", "shell"]
}

⚠️ 安全提示: 仅在服务确实需要 root 权限时才加白名单;能用低权限 uid 就不要用 root。

详细说明见 foundation/ubicoreos/README.md#8-配置高权限进程白名单。

3.2 SELinux 安全策略

系统开启 SELinux 后,每个 SA (SystemAbility) 服务必须配置安全策略,否则无法启动。OpenHarmony 采用”双类型”模型:

  • 进程域类型: 服务名,如 ubicoreos_service
  • 服务对象类型: sa_服务名,如 sa_ubicoreos_service

需要配置 5 处文件(以 ubicoreos_service、SA ID 10002 为例):

(1) service_contexts — 绑定服务对象标签

文件: base/security/selinux_adapter/sepolicy/base/public/service_contexts

10002                                 u:object_r:sa_ubicoreos_service:s0

左边是 SA ID(见 sa_profile/*.json),右边是服务对象类型。

(2) service.te — 声明服务对象类型

文件: base/security/selinux_adapter/sepolicy/base/public/service.te

type sa_ubicoreos_service, sa_service_attr;

(3) type.te — 声明进程域类型

文件: base/security/selinux_adapter/sepolicy/base/public/type.te

type ubicoreos_service, sadomain, domain;

sadomain 赋予 SA 进程一批公共权限(读 system_profile、调 samgr binder 等)。

(4) init.te — 允许 init 拉起该进程

文件: base/security/selinux_adapter/sepolicy/base/public/init.te

allow init ubicoreos_service:process { getattr rlimitinh siginh transition };

init 需要 transition 权限将自己降权切换到该服务的安全域。

(5) 新建 te/<服务名>.te — 服务专属权限

文件: base/security/selinux_adapter/sepolicy/base/te/ubicoreos_service.te

allow ubicoreos_service init_param:file { map open read };
allow ubicoreos_service sa_ubicoreos_service:samgr_class { add get };

samgr_class { add get } 是核心权限:add 让进程能向 samgr 注册自己,get 让它能被查询获取。

运行时权限补全:

服务首次运行后,通过 avc denied 日志收集缺失权限:

# 开发板上查看 avc denied 日志
hdc shell "dmesg | grep -i avc | grep ubicoreos"

# 或用 audit2allow 自动生成规则建议
hdc shell "dmesg | grep avc" | audit2allow

将生成的规则补进 base/te/ubicoreos_service.te,重新编译验证。

详细说明见 foundation/ubicoreos/README.md#9-配置-selinux-安全策略。


4. 部署到开发板

4.1 自动化部署脚本

位于 foundation/ubicoreos/ubicoreos_service/scripts/,提供两个部署脚本:

4.1.1 部署 .so(改代码后快速验证)

cd foundation/ubicoreos/ubicoreos_service/scripts

# 默认部署到 192.168.1.108
./deploy-ubicoreos.sh

# 部署后跟踪日志(Ctrl+C 退出)
./deploy-ubicoreos.sh -f

# 临时换开发板 IP
./deploy-ubicoreos.sh -i 192.168.1.50

# 指定带调试符号的 .so(用于调试崩溃)
./deploy-ubicoreos.sh -s ../../../../out/unionpi_whale/lib.unstripped/ubicoreos/ubicoreos_service/libubicoreos_service.z.so

脚本会自动:

  1. remount /system 为可写
  2. 推送 .so 到 /system/lib64/
  3. kill 旧进程,init 通过 auto-restart=true 自动重启

首次运行: 需输入开发板 root 密码。建议先配置 SSH 免密登录:

ssh-copy-id root@192.168.1.108

4.1.2 部署配置文件(调试配置参数)

# 默认推到 /data 路径(优先级高,可读写,无需 remount)
./deploy-conf.sh

# 推到系统默认配置路径(会 remount /system)
./deploy-conf.sh -t system

# 只推文件不重启服务(下次启动生效)
./deploy-conf.sh -n

# 指定自定义配置文件
./deploy-conf.sh -c /path/to/ubicoreos_service.conf

配置文件优先级(见 services/base/src/config_manager.cpp):

  1. /data/service/el1/public/ubicoreos/ubicoreos_service.conf — 用户配置,优先级高(默认推这里)
  2. /system/etc/ubicoreos/ubicoreos_service.conf — 系统默认配置

调试改配置推 data 即可;要更新进镜像的出厂默认值才用 -t system。

4.2 手动部署(脚本不可用时)

# 方式一:hdc(USB 或网络连接)
hdc file send out/unionpi_whale/packages/phone/system/lib64/libubicoreos_service.z.so /system/lib64/
hdc shell "kill $(pidof ubicoreos_service)"

# 方式二:scp + ssh
# 先 remount /system 为可写
ssh root@192.168.1.108 "mount -o remount,rw /"
scp out/unionpi_whale/packages/phone/system/lib64/libubicoreos_service.z.so root@192.168.1.108:/system/lib64/
ssh root@192.168.1.108 "kill $(pidof ubicoreos_service)"

4.3 查看日志

# 连接开发板
hdc shell
# 或
ssh root@192.168.1.108

# 过滤服务日志
hilog | grep UbicoreOS

# 按子模块过滤
hilog | grep -E "UbicoreOS.*(Envelope|Topology|LinkProbe|MqttBridge|Scheduler)"

# dump SA 运行信息
hidumper -s 10002

5. 前端开发与部署

前端 Web 控制面板位于 /ohos/Unionpi_Whale/ubicoreos_web_demo,基于 Vite + React + TypeScript。

5.1 环境准备

Node.js 要求: 20.19+ 或 22.12+(项目使用 Vite 7、React 19)

如果系统 Node 版本过低,用 nvm 安装新版:

# 安装 nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash

# 让 nvm 生效
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

# 安装 Node 22 LTS
nvm install 22
nvm use 22
nvm alias default 22

# 验证
node -v  # 应显示 v22.x

安装 pnpm:

# 通过 corepack(Node 16.13+ 自带)
corepack enable
corepack prepare pnpm@latest --activate

# 或直接用 npm 全局安装
npm install -g pnpm

# 验证
pnpm -v

5.2 安装依赖

cd /ohos/Unionpi_Whale/ubicoreos_web_demo/view
pnpm install

5.3 本地开发

# 启动开发服务器(使用 Mock 数据)
pnpm dev

# 连接真实后端(需要开发板已运行 ubicoreos_service)
BOARD_IP=192.168.1.108 pnpm dev:board

访问 http://localhost:5173 查看界面。

5.4 构建与部署

5.4.1 发布到本仓库 data/www/

pnpm release:local

产物会复制到 ../data/www/,适合本地测试。

5.4.2 发布到开发板

# 一键构建 + 部署到开发板
BOARD_IP=192.168.1.108 pnpm release:board

首次运行: 需输入开发板 root 密码,建议配置免密 ssh-copy-id root@192.168.1.108。

部署后访问 http://192.168.1.108:11311/(开发板 IP + ubicoreos_service 监听端口)。

5.5 Mock / 真实后端开关

前端自动根据环境变量 VITE_USE_MOCK_WS 切换:

  • Mock 模式(默认): pnpm dev,使用 MSW (Mock Service Worker) 模拟后端响应
  • 真实后端: pnpm dev:board,连接真实开发板

配置在 vite.config.ts 中,无需手改。


6. 常见问题排查

6.1 编译报错:some services are not authenticated

原因: 服务以 uid: root 运行,但未登记到高权限进程白名单。

解决: 参考 3.1 高权限进程白名单,在 security_config/high_privilege_process_list.json 中添加对应条目。

6.2 服务启动失败或 avc denied

原因: SELinux 策略未配置或不完整。

解决:

  1. 确认 5 处 SELinux 配置齐全(参考 3.2)
  2. 通过 hdc shell dmesg | grep avc 收集 denied 日志
  3. 将缺失权限补进 base/te/<服务名>.te

6.3 模块没有被编译

原因: 产品配置文件中未添加该子系统。

解决: 检查 vendor/unionman/unionpi_whale/config.json 中是否包含对应子系统(参考 2.3)。

6.4 编译时找不到依赖

原因: bundle.json 中的依赖项配置不正确。

解决:

  1. 检查 deps.components 中的组件名称是否正确
  2. 确认依赖的组件已在产品配置中启用
  3. 检查 BUILD.gn 中的 external_deps 格式是否正确("组件:目标")

6.5 子系统名称不匹配

原因: subsystem_config.json、bundle.json、BUILD.gn 中的子系统名称不一致。

解决: 确保以下三处的名称完全一致:

  • build/subsystem_config.json 中的 key
  • bundle.json 中的 component.subsystem
  • BUILD.gn 中的 subsystem_name

6.6 前端 pnpm 找不到或 Node 版本过低

原因: 系统 Node 版本太老(< 20.19),或未安装 pnpm。

解决: 参考 5.1 环境准备,用 nvm 安装新版 Node 并启用 pnpm。

6.7 scp 报错:unknown option – O

原因: 系统的 scp 版本较老,不支持 -O 参数。

解决: 部署脚本已自动探测并适配,此报错不应再出现。如果仍有问题,手动去掉 scp 命令中的 -O 参数。


7. 参考文档

7.1 OpenHarmony 官方文档

7.2 本项目文档

总览与配置:

后端服务:

前端开发:

部署脚本:


附录:完整工作流程速查

A. 首次环境搭建

# 1. 拉取源码(假设已完成 repo init + sync)
cd /ohos/Unionpi_Whale/unionpi_whale

# 2. 全量编译
./build.sh --product-name unionpi_whale --ccache

# 3. 烧录镜像到开发板(参考开发板厂商文档)
# ...

# 4. 配置 SSH 免密登录
ssh-copy-id root@192.168.1.108

B. 日常开发迭代(后端)

# 1. 修改代码
vim foundation/ubicoreos/ubicoreos_service/services/xxx.cpp

# 2. 增量编译
./build.sh --product-name unionpi_whale --ccache --no-prebuilt-sdk --fast-rebuild

# 3. 部署到开发板
cd foundation/ubicoreos/ubicoreos_service/scripts
./deploy-ubicoreos.sh -f  # -f 自动跟踪日志

# 4. 查看日志验证
# (已在步骤 3 中跟踪,或手动执行:)
# hdc shell "hilog | grep UbicoreOS"

C. 日常开发迭代(前端)

cd /ohos/Unionpi_Whale/ubicoreos_web_demo/view

# 1. 启动开发服务器(Mock 模式)
pnpm dev

# 2. 修改代码,浏览器自动刷新
# ...

# 3. 连接真实后端测试
BOARD_IP=192.168.1.108 pnpm dev:board

# 4. 构建并部署到开发板
BOARD_IP=192.168.1.108 pnpm release:board

D. 添加新组件

# 1. 注册子系统(build/subsystem_config.json)
# 2. 创建 bundle.json
# 3. 添加到产品配置(vendor/.../config.json)
# 4. 编写 BUILD.gn
# 5. 配置高权限白名单(如需 root)
# 6. 配置 SELinux 策略(5 处文件)
# 7. 编译验证
./build.sh --product-name unionpi_whale --build-target <component> --ccache

本文档持续更新。如有问题或建议,请提交 Issue 或 PR。

关于

面向 OpenHarmony 智能网关的人机物融合多级协同调度框架

1.1 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号