如何使用 pjsua2 正确 forward/redirect 调用

How to properly forward/redirect calls with pjsua2

我在网上找不到如何使用 pjsua2 转接电话的信息。 目前我正在尝试使用 xfer 方法,但我得到:

../src/pjsip-ua/sip_inv.c:3942: inv_on_state_null: Assertion `!"Unexpected transaction type"' failed.

没有关于此错误的信息。

这是我正在尝试的代码:

void MyAccount::onIncomingCall(OnIncomingCallParam &iprm)
{
    MyCall *call = new MyCall(*this, iprm.callId);

    ...

    calls.push_back(call);
    ...

    QString fwd_to = fwd(QString::fromStdString(ci.remoteUri));

    if(fwd_to != "NO_FWD")
    {
        info+="*** Xfer Call: ";
        info+=QString::fromStdString(ci.remoteUri);
        info+=" [";
        info+=QString::fromStdString(ci.stateText);
        info+="]\n";
        infoChanged=true;

        CallOpParam prm1;
        prm1.statusCode = (pjsip_status_code)200;
        call->answer(prm1);

        pj_thread_sleep(2000);

        CallOpParam prm2(true);
        call->xfer(fwd_to.toStdString(), prm2);
    }
    else
    {
        // standart incoming
        ...
    }
}

fwd 是我自己的功能,如果需要转接电话,它会搜索数据库

我做了这样的事情并且有效,不知道是否存在其他方法:

(在没有媒体的情况下回答,设置标志并在其他线程中 xfering 调用 fwd_to 字符串)

if(fwd_to != "NO_FWD")
    {
        CallOpParam prm1;
        prm1.statusCode = (pjsip_status_code)200;
        call->answer(prm1);

        call->fwd_to = fwd_to;
        call->fwd=true;
    }
FwdThread *fwd_thread = new FwdThread();
fwd_thread->start();
void FwdThread::run()
{
    static pj_thread_desc s_desc;
    static pj_thread_t *s_thread;
    pj_thread_register("FwdThread", s_desc, &s_thread);
    loop();
}

void FwdThread::loop()
{
    while(1)
    {
        for(auto &call : pjt->v_calls)
        {
            if(call->fwd && call->answered)
            {
                call->fwd=false;
                CallOpParam prm2(true);
                call->xfer(call->fwd_to.toStdString(), prm2);
            }
        }

        if(pjt->Stop)
            break;

        pj_thread_sleep(500);
    }
}