C SDK

本文为您介绍Linux系统C语言环境集成SDK的方法。

前提条件

已开通音视频通信服务。具体操作,请参见开通服务

公测说明

C语言SDK目前正在公测中,非正式商用版本。

使用限制

  • 目前仅支持Linux_x86_64版本的设备端C语言SDK。

  • Linux系统C语言SDK仅支持音视频的传输,需要结合硬件实现采集和渲染模块功能。

步骤一:设备端集成SDK

  1. 下载SDK文件至本地并解压,下载地址,请参见SDK下载

    下载的文件详情,如下表所示:

    文件名称

    说明

    Makefile

    编译脚本。

    ca.pem

    安全证书。

    components/rtc

    信令SDK源码。

    core

    MQTT组件。

    demos

    示例代码。

    External

    MbedTLS库。

    lib

    音视频二进制库。

    portfiles

    底层适配函数。

    run.sh

    编译、执行一体化脚本。

    test_dir

    存放有关音视频文件。

  2. 执行以下命令进行编译。

    说明

    更多有关编译的步骤,请参见运行C Demo

    sh run.sh

步骤二:实现通信功能

说明

本文中的实现方法仅供参考,您可以根据实际业务需求进行开发。

rtc_host_integrated_demo.c文件中实现如下功能:

  1. 初始化SDK。

        void *mqtt_handle = NULL, *rtc_handle = NULL;
    
        /* 建立MQTT连接,并开启保活线程和接收线程 */
        res = demo_mqtt_start(&mqtt_handle);
        if (res < 0) {
            printf("demo_mqtt_start failed\n");
            return -1;
        }
    
        /* 创建rtc实例并初始化默认参数 */
        rtc_handle = aiot_rtc_init();
        if (rtc_handle == NULL) {
            demo_mqtt_stop(&mqtt_handle);
            printf("aiot_rtc_init failed\n");
            return -1;
        }
    
        /* 将rtc实例和mqtt实例进行关联,通过mqtt实例接收服务端发来的消息 */
        res = aiot_rtc_setopt(rtc_handle, AIOT_RTCOPT_MQTT_HANDLE, mqtt_handle);
        
        /* 设置rtc下行消息处理的回调函数 */
       res = aiot_rtc_setopt(rtc_handle, AIOT_RTCOPT_RECV_HANDLER, demo_rtc_recv_handler);
  2. 主叫方发起通话。

        aiot_rtc_msg_t msg = {0};
        msg.data.channel_request.product_key = "dwp2****GPq";
        msg.data.channel_request.device_name = "7D5u8********YE2y66T";
        res = aiot_rtc_launch_channel(rtc_handle, &msg);
  3. 被呼叫方加入通话。

    /* TODO: SDK接收到rtc消息时调用数据处理回调函数 */
    void demo_rtc_recv_handler(void *handle, const aiot_rtc_recv_t *packet, void *userdata)
    {
        switch (packet->type) {
    
            /* 被呼叫方收到服务端下行的通话邀请 */
            case AIOT_RTCRECV_INVIATION: {
                printf("guest invitation now\r\n");
    
                /* 保存参数 */
                if (0 != app_param_init(packet->data.invitation.app_id, packet->data.invitation.user_id,
                                        packet->data.invitation.channelid,
                                        packet->data.invitation.nonce, packet->data.invitation.timestamp, packet->data.invitation.token,
                                        packet->data.invitation.gslb,
                                        DEMO_CFG_DISPLAYNAME)) {
                    printf("init param failed\n");
                    g_start_rtc = 0;
                } else {
                    aiot_rtc_msg_t msg = {0};
                    msg.data.guest_reply.action = ACCEPT;
                    msg.data.guest_reply.channel_id = packet->data.invitation.channelid;
                    msg.data.guest_reply.caller_iotid = packet->data.invitation.caller_iotid;
                    aiot_rtc_guest_resonse(handle, &msg);
                    if (msg.data.guest_reply.action == ACCEPT) {
                        g_start_rtc = 1;
                        
                        /* 将初始化参数传递给rtc服务器 */
                        if (0 != alirtc_init(app_param.app_id, app_param.user_id, &app_param.event_handler, app_param.log_dir)) {
                            printf("init session failed\n");
                            return -1;
                        }
                        
                        /* 建立rtc连接 */
                        if (0 != alirtc_join_channel(&app_param.cfg, &app_param.options, &app_param)) {
                            printf(" init session failed\n");
                            return -1;
                        }
                    }
                }
    
            }
            break;
        ....
        
  4. 主叫方加入频道。

    /* TODO: SDK接收到rtc消息时调用数据处理回调函数 */
    void demo_rtc_recv_handler(void *handle, const aiot_rtc_recv_t *packet, void *userdata)
    {
        switch (packet->type) {
            
            /* 主叫方发起的通话邀请得到服务端批准 */
            case AIOT_RTCRECV_CHANNEL_REQUEST_GRANTED: {
                printf("host granted now\r\n");
    
                if (0 != app_param_init(packet->data.invitation.app_id, packet->data.invitation.user_id,
                                        packet->data.invitation.channelid,
                                        packet->data.invitation.nonce, packet->data.invitation.timestamp, packet->data.invitation.token,
                                        packet->data.invitation.gslb,
                                        DEMO_CFG_DISPLAYNAME)) {
                    printf("init param failed\n");
                    g_start_rtc = 0;
                } else {
                     /* 将初始化参数传递给rtc服务器 */
                    if (0 != alirtc_init(app_param.app_id, app_param.user_id, &app_param.event_handler, app_param.log_dir)) {
                        printf("init session failed\n");
                        return -1;
                    }
    
                    /* 建立rtc连接 */
                    if (0 != alirtc_join_channel(&app_param.cfg, &app_param.options, &app_param)) {
                        printf(" init session failed\n");
                        return -1;
                    }
                    g_start_rtc = 1;
                }
    
                break;
            }
  5. 结束通话。

    aiot_rtc_cancel_channel(rtc_handle, app_param.cfg.channelid);

步骤三:通信监测

在音视频通信增值服务的服务详情页面,查看通信监测信息,例如通话总时长、通话产生的时间等。通信监测

阿里云首页 物联网平台 相关技术圈