LINUX.ORG.RU

asterisk + pjsip

 , ,


1

1

Добрый день!

Я относительно недавно начал изучать 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";
}

в дереве исходных кодов pjsip есть консольное приложение pjsua - используй его, как неиссякаемый источник вдохновения при разработке своего софтфона :)

aol ★★★★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.