# 02 · 编译、部署与运行

> **验证平台**：本项目已在 **Rockchip RK1126B** 开发板上验证跑通，运行环境为 **Debian 13 (aarch64)**，使用 Rockchip SDK 自带的 `aarch64-rockchip1240-linux-gnu` 交叉工具链编译。
>
> 若需在其他平台（如 RK3588、x86 Linux、其他 ARM 板卡等）上使用，请根据目标环境：
> - 安装对应的系统依赖库（libcurl、OpenSSL、ALSA 等）
> - 修改交叉编译工具链配置（`cmake/aarch64-debian-cross.cmake`）或使用本地编译
> - 调整 `scripts/cross-build.sh` 中的 sysroot 路径和工具链检测逻辑

## 1. 环境要求

| 项 | 说明 |
| --- | --- |
| 已验证目标板 | Rockchip **RK1126B** 开发板，Debian 13 (aarch64)，glibc |
| 编译主机 | Linux x86_64（交叉编译）或 aarch64（本地编译） |
| CMake | ≥ 3.16 |
| 编译器 | GCC（C++14），交叉编译使用 Rockchip SDK 自带工具链或 `gcc-aarch64-linux-gnu` |
| 系统库 | libcurl-dev、libssl-dev、libasound2-dev（目标板需安装） |

## 2. 获取代码

```bash
git clone <本仓库地址>
cd joyinside_rk_linux_demo
```

## 3. 编译方式

### 方式一：交叉编译（推荐，在 x86 主机为 aarch64 目标编译）

使用内置脚本一键完成：

```bash
# 1. 设置 Rockchip SDK 根目录（可选）
#    脚本会在 $JOYINSIDE_SDK/tools/linux/toolchain/aarch64-rockchip1240-linux-gnu/bin/
#    下查找交叉编译器。
#    请替换为你本机实际解压 Rockchip SDK 的路径。
export JOYINSIDE_SDK=~/rk_sdk

# 2. 设置 sysroot（必须）
#    sysroot 是从目标开发板同步过来的根文件系统副本（包含头文件和库），
#    用于交叉编译时定位 libc、OpenSSL、ALSA 等系统库。
#    请替换为你本机存放 sysroot 的实际路径（准备方法见下文）。
export JOYINSIDE_SYSROOT=~/rk_sdk/debian_sysroot

# 3. 执行编译
./scripts/cross-build.sh
```

**产物**：`build-aarch64/joyinside_demo`（aarch64 ELF 可执行文件）

#### Sysroot 准备

sysroot 需包含目标板的头文件和库，从开发板同步：

```bash
# 在编译主机上执行（BOARD_IP 为目标板 IP）
mkdir -p ~/rk_sdk/debian_sysroot
rsync -aL root@<BOARD_IP>:/usr/include/ ~/rk_sdk/debian_sysroot/usr/include/
rsync -aL root@<BOARD_IP>:/usr/lib/aarch64-linux-gnu/ ~/rk_sdk/debian_sysroot/usr/lib/aarch64-linux-gnu/
rsync -aL root@<BOARD_IP>:/lib/aarch64-linux-gnu/ ~/rk_sdk/debian_sysroot/lib/aarch64-linux-gnu/
```

必须包含的关键文件：
- `usr/include/openssl/ssl.h`（libssl-dev）
- `usr/include/curl/curl.h`（libcurl4-openssl-dev）
- `usr/include/alsa/asoundlib.h`（libasound2-dev）
- `usr/include/pthread.h`（libc6-dev）
- `usr/include/aarch64-linux-gnu/asm/types.h`（linux-libc-dev）
- `usr/lib/aarch64-linux-gnu/crt1.o, crti.o, crtn.o`（libc6-dev）
- `lib/aarch64-linux-gnu/ld-linux-aarch64.so.1`（libc6）
- `usr/lib/aarch64-linux-gnu/libasound.so`（libasound2）

#### 工具链选择

脚本按以下顺序检测交叉编译器：

1. `$JOYINSIDE_SDK/tools/linux/toolchain/aarch64-rockchip1240-linux-gnu/bin/`（Rockchip SDK 自带）
2. 系统 PATH 中的 `aarch64-linux-gnu-g++`（apt 安装：`sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu`）

### 方式二：本地编译（在 aarch64 目标板上直接编译）

```bash
# 安装依赖（目标板上执行）
sudo apt install cmake g++ libcurl4-openssl-dev libssl-dev libasound2-dev

# 编译
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
```

**产物**：`build/joyinside_demo`

## 4. 部署到目标板

### 方法一：脚本直接部署

```bash
./scripts/cross-build.sh deploy root@<BOARD_IP> /your/bin/path/joyinside_demo
```

### 方法二：手动 scp

```bash
scp build-aarch64/joyinside_demo root@<BOARD_IP>:/your/bin/path/
scp conf/joyinside.conf.example root@<BOARD_IP>:/your/bin/path/joyinside.conf
ssh root@<BOARD_IP> "chmod +x /your/bin/path/joyinside_demo"
```

## 5. 运行

### 基本用法

```bash
# 方式 1：使用配置文件
cd /your/bin/path
# 编辑 joyinside.conf，填入凭证和音频参数
./joyinside_demo --flagfile joyinside.conf

# 方式 2：命令行参数
./joyinside_demo \
    --bot_id=your_bot_id \
    --access_key_id=your_access_key_id \
    --access_key_secret=your_access_key_secret

# 方式 3：环境变量
export JOYINSIDE_BOT_ID=your_bot_id
export JOYINSIDE_ACCESS_KEY_ID=your_access_key_id
export JOYINSIDE_ACCESS_KEY_SECRET=your_access_key_secret
./joyinside_demo
```

### 自动加载配置文件

程序启动时自动检测当前目录是否存在 `joyinside.conf`，存在则自动加载。命令行参数优先级高于配置文件。

### 常用参数

```bash
# 调整日志级别
./joyinside_demo --log_level=debug

# 导出麦克风 PCM（调试用）
./joyinside_demo --dump_mic_pcm=true --dump_mic_pcm_seconds=30

# 指定音频设备
./joyinside_demo --mic_device=hw:0,0 --playback_card=1 --playback_device=0

# 调整增益
./joyinside_demo --capture_gain=2.0 --playback_gain=1.5

# 开启稳定性统计（压测时使用）
./joyinside_demo --stats_enable=true --stats_interval_sec=5
```

### 信号处理

- `SIGINT`（Ctrl+C）/ `SIGTERM`：优雅退出，关闭 WS 连接和音频设备

## 6. 查看帮助

```bash
./joyinside_demo --help
```

显示所有支持的参数及说明。