Files
open-xiaoai/packages/client-v2
2026-01-04 15:06:55 +08:00
..
2026-01-04 15:06:55 +08:00
2026-01-02 09:59:29 +08:00
2026-01-03 19:17:13 +08:00
2026-01-03 19:17:13 +08:00
2026-01-02 15:16:31 +08:00

Open-XiaoAI Client V2

开发中,敬请期待...

实时音频流推送服务,支持多客户端连接、音频录制/播放、RPC 远程调用和实时事件推送。

架构

┌─────────────────────────────────────────────────────────────────────────┐
│                              Server                                     │
│                                                                         │
│  ┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐     │
│  │ SessionManager  │    │    AudioBus     │    │   EventBus      │     │
│  │                 │    │  (Pub/Sub)      │    │  (Broadcast)    │     │
│  │  ├─ Session 1   │    │                 │    │                 │     │
│  │  ├─ Session 2   │◄──►│  ├─ Receiver    │    │  ├─ Server →    │     │
│  │  └─ Session N   │    │  └─ Broadcaster │    │  └─ Client →    │     │
│  └─────────────────┘    └─────────────────┘    └─────────────────┘     │
│           │                      │                      │               │
│           ▼                      ▼                      ▼               │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                     Command Handler                              │   │
│  │  ├─ Shell      (执行远程命令)                                    │   │
│  │  ├─ GetInfo    (获取设备信息)                                    │   │
│  │  ├─ SetVolume  (设置音量)                                        │   │
│  │  ├─ File       (文件操作)                                        │   │
│  │  └─ System     (系统控制)                                        │   │
│  └─────────────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────────────┘
         │ TCP                           │ UDP
         ▼                               ▼
┌─────────────────────────────────────────────────────────────────────────┐
│                              Client                                     │
│                                                                         │
│  ┌─────────────────┐    ┌─────────────────────────────────────────┐    │
│  │    Session      │    │           Audio Pipelines               │    │
│  │                 │    │                                         │    │
│  │  ├─ Connection  │    │  ┌───────────┐      ┌───────────────┐   │    │
│  │  ├─ RPC Manager │    │  │ Record    │      │   Playback    │   │    │
│  │  └─ Pipelines   │◄──►│  │ Pipeline  │      │   Pipeline    │   │    │
│  └─────────────────┘    │  │           │      │               │   │    │
│                         │  │ Mic→Opus  │      │ Opus→Speaker  │   │    │
│                         │  │   →UDP    │      │   ←UDP        │   │    │
│                         │  └───────────┘      └───────────────┘   │    │
│                         └─────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────────────────┘

项目结构

src/
├── lib.rs
├── app/
│   ├── server/                    # 服务端
│   │   ├── mod.rs                 # Server 主体
│   │   ├── audio_bus.rs           # 音频总线 (发布-订阅)
│   │   ├── session.rs             # 会话管理
│   │   └── stream.rs              # 音频流 (录音/播放/转发)
│   │
│   └── client/                    # 客户端
│       ├── mod.rs                 # Client 主体
│       ├── session.rs             # 会话管理
│       └── pipeline.rs            # 音频管道
│
├── audio/                         # 音频处理
│   ├── codec.rs                   # Opus 编解码
│   ├── config.rs                  # 音频配置
│   ├── player.rs                  # ALSA 播放
│   ├── recorder.rs                # ALSA 录音
│   └── wav.rs                     # WAV 文件读写
│
├── net/                           # 网络层
│   ├── command.rs                 # RPC 命令类型
│   ├── discovery.rs               # 服务发现
│   ├── event.rs                   # 实时事件系统
│   ├── network.rs                 # TCP/UDP 连接
│   ├── protocol.rs                # 通信协议
│   └── rpc.rs                     # RPC 管理
│
└── bin/
    ├── client.rs                  # 客户端 demo
    └── server.rs                  # 服务端 demo

功能特性

RPC 命令系统

支持多种类型的远程调用:

命令 描述 请求 响应
Shell 执行 Shell 命令 command, cwd, env, timeout stdout, stderr, exit_code
GetInfo 获取设备信息 - model, serial, version, uptime, audio_state
SetVolume 设置音量 volume (0-100) previous, current
File 文件操作 Read/Write/Delete/List/Stat data/entries/stat
System 系统控制 Reboot/Shutdown/GetLoad/GetMemory Accepted/Load/Memory
Ping 延迟测量 timestamp timestamp, server_time

实时事件系统

服务端事件 (Server → Client):

  • AudioStatusChanged - 音频状态变化
  • ClientJoined/Left - 客户端加入/离开
  • Notification - 通知消息
  • RecordingComplete - 录音完成
  • PlaybackComplete - 播放完成

客户端事件 (Client → Server):

  • StatusUpdate - 状态更新 (CPU/内存/温度)
  • AudioLevel - 音频电平
  • KeyPress - 按键事件
  • Alert - 警告/错误

音频功能

  • 录音: 从客户端麦克风录制,服务端保存为 WAV
  • 播放: 服务端推送音频文件到客户端播放
  • 编码: Opus 编解码,支持 16kHz/48kHz
  • 传输: UDP 低延迟传输

使用方法

启动服务端

cargo run --bin server --release

启动客户端 (Linux)

cargo run --bin client --release

交叉编译 (ARM)

make build-arm

配置

通过环境变量配置认证:

export XIAO_SERVER_AUTH="your-server-secret"
export XIAO_CLIENT_AUTH="your-client-secret"

示例代码

服务端

use xiao::app::server::Server;
use xiao::net::command::Command;

let server = Arc::new(Server::new().await?);

// 启动服务器
tokio::spawn(async move {
    server.run(8080).await.unwrap();
});

// 执行远程命令
let result = server.shell(client_addr, "uname -a").await?;
println!("Output: {}", result.stdout);

// 开始录音
server.start_record(client_addr, AudioConfig::voice_16k()).await?;

// 广播事件
server.broadcast_event(ServerEvent::Notification {
    level: NotificationLevel::Info,
    title: "Notice".to_string(),
    message: "Hello everyone!".to_string(),
}).await;

客户端

use xiao::app::client::{Client, ClientConfig};

let client = Arc::new(Client::new(ClientConfig::default()));

// 订阅服务端事件
let mut events = client.subscribe_events();
tokio::spawn(async move {
    while let Ok(event) = events.recv().await {
        println!("Event: {:?}", event);
    }
});

// 运行客户端
client.run().await?;

License

MIT License © 2026-PRESENT Del Wang