pjsip铃声和答案码

时间:2015-12-04 13:26:50

标签: c sip voip raspberry-pi2 pjsip

我正在编写一个pjsip应用程序,并且呼叫/应答工作正常。现在我想实现这一点,当我打电话给某人时,我听到铃声响起,当我接到一个电话铃声时。

我搜索了这个,但我只是偶然发现了在示例文件夹(pjproject-2.4.5/pjsip-apps/src/pjsua/)中引用pjsua应用程序的答案。所以我试图理解这个程序包含多个文件(总共大约3k行代码)和特殊结构,这使得它更难理解。所以我无法弄清楚如何做这个功能,我会欣​​赏一个正确方向的暗示。

另一点是我可以在接听来电时提供的代码列表,因为我找不到一个描述代码含义的代码。

欣赏你的时间。

2 个答案:

答案 0 :(得分:2)

SIP响应代码分为6个类

  • 1xxProvisional - 收到请求,继续处理    请求;临时回复,也称为信息回复    回复,表明联系的服务器正在执行某些操作    进一步的行动,还没有明确的回应。一台服务器    如果预计需要超过200毫秒,则发送1xx响应    获得最终答复。请注意,不会传输1xx响应    可靠。它们永远不会导致客户端发送ACK。临时    (1xx)响应可以包含消息体,包括会话    描述

  • 2xxSuccess - 已成功接收,理解并执行此操作 接受;

  • 3xxRedirection - 需要采取进一步行动 完成请求;

  • 4xxClient Error - 请求包含错误的语法或不能 在此服务器上完成;

  • 5xxServer Error - 服务器未能达到明显有效的效果 请求;

  • 6xxGlobal Failure - 无法在任何服务器上完成请求。

    您可以在此处找到PJSIP struct which holds these codesSIP codes description

答案 1 :(得分:1)

旧问题,但如果有任何迷惑之处,请在此处发布我的答案:

播放铃声

假设您的铃声是wav文件,则需要创建一个wav播放器并将其端口连接到输出设备。 wav文件将一直循环播放,直到您断开端口的连接为止,然后在重新连接时重新启动。

应在致电init_ringtone_player之后再致电pjsua_initringtone_port_info是用于跟踪端口和环状态的全局结构。

typedef struct _ringtone_port_info {
    int ring_on;
    int ring_slot;
    pjmedia_port *ring_port;
    pj_pool_t *pool;
} ringtone_port_info_t;

static ringtone_port_info_t ringtone_port_info;

static void init_ringtone_player() {

    int file_slot;
    pj_pool_t *pool;
    pjmedia_port *file_port;
    pj_status_t status;

    pool = pjsua_pool_create("wav", 4000, 4000);

    status = pjmedia_wav_player_port_create(pool, "ringtone.wav", 
        0, 0, 0, &file_port);

    if (status != PJ_SUCCESS) {
        error_exit("Error creating WAV player port", status);
        return;
    }

    status = pjsua_conf_add_port(pool, file_port, &file_slot);

    if (status != PJ_SUCCESS) {
        error_exit("Error adding port to conference", status);
        return;
    }

    ringtone_port_info = (ringtone_port_info_t) { .ring_on = 0, 
        .ring_slot = file_slot, .ring_port = file_port , .pool = pool };

}

然后,根据需要制作函数来启动和停止铃声(即在on_incoming_callon_call_state或任何地方)。这里要注意的重要函数调用是pjsua_conf_connect

pj_status_t start_ring() {
    pj_status_t status;

    if (ringtone_port_info.ring_on) {
        printf("Ringtone port already connected\n");
        return PJ_SUCCESS;
    }

    printf("Starting ringtone\n");
    status = pjsua_conf_connect(ringtone_port_info.ring_slot, 0);
    ringtone_port_info.ring_on = 1;
    if (status != PJ_SUCCESS)
        error_exit("Error connecting ringtone port", status);
    return status;
}

pj_status_t stop_ring() {
    pj_status_t status;

    if (!ringtone_port_info.ring_on) {
        printf("Ringtone port already disconnected\n");
        return PJ_SUCCESS;
    }

    printf("Stopping ringtone\n");
    status = pjsua_conf_disconnect(ringtone_port_info.ring_slot, 0);
    ringtone_port_info.ring_on = 0;
    if (status != PJ_SUCCESS)
        error_exit("Error disconnecting ringtone port", status);
    return status;
}

请确保在完成释放池(或手动释放池)后调用pjsua_destroy

SIP响应代码

请参阅此处以获取状态码列表:

https://www.pjsip.org/pjsip/docs/html/group__PJSIP__MSG__LINE.htm#

您可以使用200接受,使用603拒绝(使用pjsua_call_answer