Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

🔌 Portal Hub API

Portal Hub 提供了统一的 API 服务,用于动态创建和管理 WebRTC Portal。与 portald 不同,Portal Hub 支持多用户、多服务的集中管理。

📋 概述

Portal Hub 提供两种接口:

  • 🔌 gRPC API (portal_hub_grpc):提供 gRPC 接口供管理 portal
  • 🌐 REST API (portal_hub_rest):提供 REST 接口供管理 portal
sequenceDiagram
    participant Client as 客户端应用
    participant Hub as Portal Hub
    participant MQTT as MQTT Broker
    participant Proxy as 远端 Proxy (proxyd)
    participant Service as 远端服务

    Note over Client,Service: 1. 启动阶段
    Hub->>MQTT: 连接 MQTT Broker
    Proxy->>MQTT: 连接 MQTT Broker<br/>订阅信令话题
    Service->>Proxy: 启动本地服务<br/>(如 gRPC/REST Server)

    Note over Client,Service: 2. 创建 Portal
    Client->>Hub: POST /portal<br/>(创建 Portal 请求)
    Hub->>MQTT: 查找设备在线状态
    MQTT-->>Hub: 设备在线
    Hub->>MQTT: 发送 WebRTC offer
    Proxy->>MQTT: 接收 offer,发送 answer
    Hub->>Proxy: 建立 WebRTC 连接
    Hub-->>Client: 返回 Portal 地址<br/>(如 "0.0.0.0:12345")

    Note over Client,Service: 3. 使用 Portal 访问服务
    Client->>Hub: 连接 Portal 地址<br/>(TCP/Unix Socket)
    Hub->>Proxy: 通过 WebRTC DataChannel<br/>转发数据
    Proxy->>Service: 转发到本地服务
    Service->>Proxy: 返回响应
    Proxy->>Hub: 通过 WebRTC 返回数据
    Hub-->>Client: 返回服务响应

    Note over Client,Service: 4. 销毁 Portal
    Client->>Hub: DELETE /portal<br/>(销毁 Portal)
    Hub->>Proxy: 关闭 WebRTC 连接
    Hub-->>Client: 确认销毁

📖 命令行参数详解

🔌 portal_hub_grpc

portal_hub_grpc 运行在控制端,提供 gRPC 服务用于创建和管理 Portal。

接口定义见 crates/grpc/proto/lrc_user_rpc.proto

$ ./portal_hub_grpc -h
Usage: portal_hub_grpc [OPTIONS]

Options:
  -u, --user-id <USER_ID>
          默认用户 ID,当请求中未提供 user_id 时使用 [默认: ]
  -l, --listen <LISTEN>
          Portal hub 的 gRPC 服务器监听地址 [默认: [::1]:50051]
  -m, --mqtt-broker <MQTT_BROKER>
          MQTT Broker 地址 (mqtt://host:port) [默认: mqtt://localhost:1883]
      --mqtt-username <MQTT_USERNAME>
          MQTT 用户名 [可选]
      --mqtt-password <MQTT_PASSWORD>
          MQTT 密码 [可选]
      --peer-stun <PEER_STUN>
          STUN 服务器地址 (例如: stun:stun.l.google.com:19302),可指定多个 [默认: stun:stun.l.google.com:19302]
      --peer-turn <PEER_TURN>
          TURN 服务器地址 (例如: turn:user:pass@host:port),可指定多个
      --online-timeout <ONLINE_TIMEOUT>
          等待远程端上线超时时间 (秒) [默认: 5]
      --connect-timeout <CONNECT_TIMEOUT>
          WebRTC 连接超时时间 (秒) [默认: 5]
  -h, --help
          显示帮助信息

🌐 portal_hub_rest

portal_hub_rest 运行在控制端,提供 HTTP REST API 用于创建和管理 Portal。

$ ./portal_hub_rest -h
Usage: portal_hub_rest [OPTIONS]

Options:
  -u, --user-id <USER_ID>
          默认用户 ID,当请求中未提供 user_id 时使用 [默认: ]
  -l, --listen <LISTEN>
          Portal hub 的 HTTP 服务器监听地址 [默认: 127.0.0.1:3000]
  -m, --mqtt-broker <MQTT_BROKER>
          MQTT Broker 地址 (mqtt://host:port) [默认: mqtt://localhost:1883]
      --mqtt-username <MQTT_USERNAME>
          MQTT 用户名 [可选]
      --mqtt-password <MQTT_PASSWORD>
          MQTT 密码 [可选]
      --peer-stun <PEER_STUN>
          STUN 服务器地址 (例如: stun:stun.l.google.com:19302),可指定多个 [默认: stun:stun.l.google.com:19302]
      --peer-turn <PEER_TURN>
          TURN 服务器地址 (例如: turn:user:pass@host:port),可指定多个
      --online-timeout <ONLINE_TIMEOUT>
          等待远程端上线超时时间 (秒) [默认: 5]
      --connect-timeout <CONNECT_TIMEOUT>
          WebRTC 连接超时时间 (秒) [默认: 5]
  -h, --help
          显示帮助信息

📚 API 使用说明

➕ 创建 Portal

端点: POST /portal | lrc.user.rpc.PortalLauncher/CreatePortal

请求体:

grpc 请求体 Config 与 Json 请求体字段一致

{
  "user_id": "user_1", // 可选,用户 ID
  "robot_id": "robot_1", // 必须,机器人/设备 ID
  "service_name": "tcp_service", // 必须,服务名称
  "portal_type": "inet", // 可选,"inet" 或 "unix",默认 "inet"
  "inet_port": "12345", // 可选,仅当 portal_type="inet" 时有效
  "unix_file": "/tmp/sock" // 可选,仅当 portal_type="unix" 时有效
}

响应体:

grpc 响应体 SockAddr 与 Json 请求体字段一致

{
  "uri": "0.0.0.0:12345" // Portal 地址 URI
  // type=INET: "0.0.0.0:12345"
  // type=UNIX: "unix:///tmp/rpc_gps.sock"
}

➖ 销毁 Portal

端点: DELETE /portal | lrc.user.rpc.PortalLauncher/DestroyPortal

请求体: 同 CreatePortalConfig(至少需要 robot_idservice_name

响应体: 空消息

🔗 代码示例

完整的代码示例请参考 examples/ 目录:

🎯 使用场景

  1. ☁️ 云平台设备管理 - 通过统一的 API 管理多个设备的 Portal
  2. 🔧 微服务架构 - 服务间通过 Portal Hub 动态建立连接
  3. 👥 多租户系统 - 不同用户通过 user_id 隔离 Portal 资源
  4. 🧪 自动化测试 - 通过 API 动态创建和销毁测试环境

⚠️ 注意事项

  1. 用户 ID 管理: 如果请求中未提供 user_id,必须通过命令行参数 -u/--user-id 设置默认值
  2. 远程 ID 构建: Portal Hub 会自动将 robot_idservice_name 组合为远程 ID,格式为 {robot_id}-{service_name}
  3. 端口分配: 创建 INET 类型 Portal 时,如果不指定 inet_port,系统会自动分配随机端口
  4. 连接超时: 确保设备端(proxyd)已启动并在线,否则创建 Portal 会超时失败