Добрый день!
Я относительно недавно начал изучать asterisk и появилась необходимость написать свой софтфон. И первое на что я наткнулся это библиотека pjsip на C++. Но проблема в том, что никак не могу подключиться к своему Asterisk (стоит на виртуальной машине Ubuntu), с других софтфонов все подключается, звонки проходят, все ок, но с помощью библиотеки pjsip никак не выходит - функция pjsua_acc_set_registration всегда выдает FALSE, a asterisk даже не показывает попытку подключения.
Надеюсь, что кто-то сможет подсказать, потому что ситуация правда патовая, бьюсь уже не певрый день…
void SipAgent::addAccount(const std::string& user, const std::string& password, const std::string& domain) {
std::string id = "sip:" + user + "@" + domain;
std::string uri = "sip:" + domain;
char cid[150], curi[100], cuser[100], cpassword[100], cdomain[100];
strcpy(cid, id.c_str());
strcpy(curi, uri.c_str());
strcpy(cuser, user.c_str());
strcpy(cpassword, password.c_str());
strcpy(cdomain, domain.c_str());
pjsua_acc_config cfg;
pjsua_acc_config_default(&cfg);
cfg.id = pj_str(cid);
std::cout << cid << "\n";
cfg.reg_uri = pj_str(curi);
std::cout << curi << "\n";
cfg.cred_count = 1;
cfg.cred_info[0].realm = pj_str(cdomain);
cfg.cred_info[0].username = pj_str(cuser);
cfg.cred_info[0].scheme = pj_str((char*)"digest"); // ?
cfg.cred_info[0].username = pj_str(cuser);
cfg.cred_info[0].data_type = PJSIP_CRED_DATA_PLAIN_PASSWD; // Plain text password
cfg.cred_info[0].data = pj_str(cpassword);
_status = pjsua_acc_add(&cfg, PJ_TRUE, &_id);
if (_status != PJ_SUCCESS) {
std::cout << "error adding account";
return;
}
std::cout << "account " << getAccountId() << " added\n";
Sleep(2000);
_status = pjsua_start();
if (_status != PJ_SUCCESS) {
std::cout << "error starting pjsua";
return;
}
_status = pjsua_acc_set_registration(_id, PJ_TRUE);
Sleep(2000);
if (_status != PJ_SUCCESS) {
std::cout << "error in registration account\n";
return;
}
std::cout << "online status:" << pjsua_acc_set_online_status(_id, PJ_TRUE) << "\n";
}