# 操控端实现 (Linux) (/zh-CN/solutions/teleoperation/build/operator-linux)

> For AI agents: see the complete documentation index at [llms.txt](/llms.txt).

声网平行操控 SDK 支持主流的 Linux、Android 设备端平台，Windows、Web、Linux、Android、iOS、macOS 操控端平台。

本文介绍如何通过声网平行操控 SDK 在 Linux 操控端实现主要功能。

:::info[信息]
如需体验其它操控端，请联系 sales@shengwang.cn。
:::

## 技术原理 [#技术原理]

基于如下技术框架图，你可以结合你的实际业务进行开发。

![操控端技术架构](https://web-cdn.agora.io/docs-portal/img/teleoperation/architecture.png)

## 前提条件 [#前提条件]

开始前，请确保满足如下条件：

- 准备平行操控所需的 Linux 开发环境。详见[准备开发环境](/zh-CN/solutions/teleoperation/get-started/run-example#准备开发环境)。
- 联系 sales@shengwang.cn 获取平行操控 Linux SDK。
- 初始化 SDK 并与声网 RTC 频道建立连接。详见[准备工作](/zh-CN/realtime-media/rtc-server-sdk/build/send-receive#准备工作)。

## 实现流程 [#实现流程]

### 接收音视频流 [#接收音视频流]

接收 YUV 格式的原始视频数据或编码后的 H.264 格式视频数据，详细步骤请参考[从设备端接收媒体流](/zh-CN/realtime-media/rtc-server-sdk/build/send-receive#从客户端接收媒体流)。

### 收发控制信令 [#收发控制信令]

按照如下步骤实现从操控端收发控制信令的逻辑：

1. 创建并初始化 `RtmClient` 对象，并设置事件监听。

    ```cpp
    auto service = createAndInitAgoraService(false, true, true, true, false, options.appId.c_str());
    auto con = service->createRtcConnection(agora::rtc::RtcConnectionConfiguration());
    // 使用新的流订阅模式
    auto p = con->getAgoraParameter(); p->setBool("rtc.vos_aut_use_old_sync",false);
    // 创建 RtmClient
    auto rtm_client = agora::rtm::createAgoraRtmClient();
    rtmHandler handle;
    // 配置 RtmClient
    agora::rtm::RtmConfig config;
    // 设置事件监听程序
    config.eventHandler = &handle;
    config.appId = options.appId.c_str();
    // userId 中仅支持传入内容为数值的字符串，例如 "1234567"
    config.userId = options.userId.c_str();
    // 初始化 RtmClient
    rtm_client->initialize(config);
    ```

2. 创建 Stream Channel 并加入频道。在使用 `StreamChannel` 类中的任何 API 之前，你需要先调用 `createStreamChannel` 创建 Stream Channel。

    ```cpp
    // 创建 Stream Channel
    auto stream_channel = rtm_client->createStreamChannel(options.channelId.c_str());
    agora::rtm::JoinChannelOptions opt;
    opt.token = options.appId.c_str();
    // 加入频道
    stream_channel->join(opt);
    ```

3. 加入频道中的 Topic 并发布消息。成功加入 Topic 后，SDK 会自动将你注册为该 Topic 的消息发布者，你可以在该 Topic 中发送消息。成功发送后，SDK 会把该消息分发给该 Topic 的所有订阅者。

    ```cpp
    agora::rtm::JoinTopicOptions topic_join_opt;
    stream_channel->joinTopic(options.topic.c_str(), topic_join_opt); // 加入 Topic
    // 在 Topic 中发布消息
    stream_channel->publishTopicMessage(options.topic.c_str(), "hellortm", 9);
    ```

4. 订阅 Topic 及 Topic 中的消息发送者。

    ```cpp
    agora::rtm::TopicOptions topic_opt;
    const char *users[] = { options.remoteUserId.c_str() };
    topic_opt.users = users;
    topic_opt.userCount = 1;
    stream_channel->subscribeTopic(options.topic.c_str(), topic_opt);
    ```

5. 通过 `onMessageEvent` 事件通知接收远端用户的消息。

    ```cpp
    // 继承 IRtmEventHandler 类
    class rtmHandler : public agora::rtm::IRtmEventHandler {
    public:
        // 监听消息事件通知
        void onMessageEvent(MessageEvent &event) override
        {
            if(_stream_channel){
            
            int r = _stream_channel->publishTopicMessage(_topic.c_str(), event.message, 12);
            printf("send %d rrr \n",r);
            }
            get_stime();
            printf("send ts: %s, receive ts: %s \n", event.message, timestr);
        }
        agora::rtm::IStreamChannel* _stream_channel = nullptr;
        std::string _topic;
    };
    ```

6. 退出并释放资源。

    ```cpp
    stream_channel->leaveTopic(options.topic.c_str()); // 退出 Topic
    stream_channel->leave(); // 退出频道
    stream_channel->release(); // 销毁 Stream Channel
    rtm_client->release(); // 销毁 RtmClient
    ```

## 参考信息 [#参考信息]

### 示例项目 [#示例项目]

声网在 SDK 包中提供了以下示例项目供你参考：

```shell
├── agora_sdk  # 声网的 SDK 库文件和头文件
└── example    # 示例代码
    ├── yuv_pcm
    │   └── sample_receive_yuv_pcm.cpp # 接收音视频流
    └── rtm
        ├── receive_rtm_message.cpp     # 接收控制信令
        └── send_rtm_message.cpp        # 发送控制信令
```

### API 参考 [#api-参考]

你可以参考以下 API 文档：

- [实时音视频 API](/zh-CN/api-reference/rtc-server-sdk/cpp/overview)
- [实时控制信令 API](https://docs-preprod.agora.io/cn/rtm-2.x/api-overview-linux?platform=Linux)
