我正在编写一个pjsip应用程序,并且呼叫/应答工作正常。现在我想实现这一点,当我打电话给某人时,我听到铃声响起,当我接到一个电话铃声时。
我搜索了这个,但我只是偶然发现了在示例文件夹(pjproject-2.4.5/pjsip-apps/src/pjsua/
)中引用pjsua应用程序的答案。所以我试图理解这个程序包含多个文件(总共大约3k行代码)和特殊结构,这使得它更难理解。所以我无法弄清楚如何做这个功能,我会欣赏一个正确方向的暗示。
另一点是我可以在接听来电时提供的代码列表,因为我找不到一个描述代码含义的代码。
欣赏你的时间。
答案 0 :(得分:2)
SIP响应代码分为6个类
1xx
:Provisional
- 收到请求,继续处理
请求;临时回复,也称为信息回复
回复,表明联系的服务器正在执行某些操作
进一步的行动,还没有明确的回应。一台服务器
如果预计需要超过200毫秒,则发送1xx响应
获得最终答复。请注意,不会传输1xx响应
可靠。它们永远不会导致客户端发送ACK。临时
(1xx)响应可以包含消息体,包括会话
描述
2xx
:Success
- 已成功接收,理解并执行此操作
接受;
3xx
:Redirection
- 需要采取进一步行动
完成请求;
4xx
:Client Error
- 请求包含错误的语法或不能
在此服务器上完成;
5xx
:Server Error
- 服务器未能达到明显有效的效果
请求;
6xx
:Global Failure
- 无法在任何服务器上完成请求。
您可以在此处找到PJSIP struct which holds these codes和SIP codes description
答案 1 :(得分:1)
旧问题,但如果有任何迷惑之处,请在此处发布我的答案:
假设您的铃声是wav文件,则需要创建一个wav播放器并将其端口连接到输出设备。 wav文件将一直循环播放,直到您断开端口的连接为止,然后在重新连接时重新启动。
应在致电init_ringtone_player
之后再致电pjsua_init
。 ringtone_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_call
,on_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
请参阅此处以获取状态码列表:
https://www.pjsip.org/pjsip/docs/html/group__PJSIP__MSG__LINE.htm#
您可以使用200接受,使用603拒绝(使用pjsua_call_answer
)