pjisp开发关于使用UDP/TCP通信问题
在PJSIP中,如果想指定使用TCP而不是默认的UDP传输协议,可以在URI中添加适当的参数。假设有一个URI字符串 “uri”,需要将它转换为 “pj_str_t” 类型,并在其中包含指定的传输协议参数。具体实现如下:
假设原始URI是 “sip:user@domain”,需要将其修改为 “sip:user@domain:5060;transport=tcp”。可以通过字符串操作来完成。
启动注册
这是我们提前启动并初始化相关的通信协议的相关配置,这里启动的协议类型主要是为了等待连接进行准备,创建成功后可启动wireshark进行抓包查看连接情况,wireshark抓包的使用可参考本人前文。
/* Add TCP transport. */
{
pjsua_transport_config cfg;
pjsua_transport_config_default(&cfg);
cfg.port = 5060;
status = pjsua_transport_create(PJSIP_TRANSPORT_TCP, &cfg, NULL);
if (status != PJ_SUCCESS) error_exit("Error creating transport", status);
}
/* Initialization is done, now start pjsua */
status = pjsua_start();
if (status != PJ_SUCCESS) error_exit("Error starting pjsua", status);
/* Register to SIP server by creating SIP account. */
{
pjsua_acc_config cfg;
pjsua_acc_config_default(&cfg);
cfg.id = pj_str("sip:" SIP_USER "@" SIP_DOMAIN":5060;transport=tcp");
cfg.reg_uri = pj_str("sip:" SIP_DOMAIN":5060;transport=tcp");
cfg.cred_count = 1;
cfg.cred_info[0].realm = pj_str(SIP_REALM);
cfg.cred_info[0].scheme = pj_str("digest");
cfg.cred_info[0].username = pj_str(SIP_USER);
cfg.cred_info[0].data_type = PJSIP_CRED_DATA_PLAIN_PASSWD;
cfg.cred_info[0].data = pj_str(SIP_PASSWD);
status = pjsua_acc_add(&cfg, PJ_TRUE, &acc_id);
if (status != PJ_SUCCESS) error_exit("Error adding account", status);
}
请求消息
开始请求消息的进行,这要需要注意UDP和TCP的请求sip命令存在差异,TCP协议需要进行特别处理才能使用TCP协议请求成功。
if (option[0] == 'm') {
puts("Enter SIP URI to call: ");
if (fgets(uri, sizeof(uri), stdin) == NULL) {
puts("Error reading SIP URI");
continue;
}
add_tcp_transport_suffix(uri);
pj_str_t pj_uri = pj_str(uri);
status = pjsua_call_make_call(acc_id, &pj_uri, 0, NULL, NULL, NULL);
if (status != PJ_SUCCESS)
puts("Error making call");
}
这里的make call请求设计可参考本人前文。
void add_tcp_transport_suffix(char* uri) {
const char* tcp_suffix = ":5060;transport=tcp";
// Remove newline character if present
size_t len = strlen(uri);
if (len > 0 && uri[len - 1] == '\n') {
uri[len - 1] = '\0';
}
// Check if there's enough space to add the suffix
if (len + strlen(tcp_suffix) < MAX_URI_LEN) {
strcat(uri, tcp_suffix);
}
else {
puts("URI too long to add TCP transport suffix");
}
}