You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PJSIP(PjSua2)C++开发如何在呼叫状态中获取对端自定义SIP头

PjSua2层获取200 OK响应中自定义SIP头的实现方法

你要读取的自定义头是Phone2在接听时返回的200 OK响应中携带的内容,PjSua2原生提供了对应接口,无需修改底层pjsip代码,具体实现方式如下:

1. 核心实现方案:重写Call类的onCallState回调

你需要继承PjSua2的Call基类,重写onCallState虚函数,当呼叫状态切换为已接通状态时,直接从通话信息中读取最后一次响应的头字段即可:

void YourCustomCall::onCallState(OnCallStateParam &prm) {
    CallInfo ci = getInfo();
    // 仅当呼叫进入已接通状态时,读取200 OK对应的响应头
    if (ci.state == PJSIP_INV_STATE_CONFIRMED) {
        // lastResponse字段存储了对端返回的最终响应,此处对应接听的200 OK
        SipResponse response = ci.lastResponse;
        try {
            // 替换为你实际使用的自定义SIP头名,头名大小写不敏感
            SipHeader customHeader = response.getHeader("X-Your-Custom-Header");
            std::string headerValue = customHeader.getHValue();
            // 此处已拿到自定义头的数值,可直接用于业务逻辑处理
        } catch (Error &e) {
            // 未找到对应头字段的异常处理逻辑
        }
    }
}

2. 备选方案:重写onCallRxOffer回调

如果你的自定义头可能出现在180、183等临时响应中,也可以重写onCallRxOffer回调,所有入站SIP响应都会触发该回调,你可以直接从回调传入的参数中读取对应头字段,该方案对早期媒体场景也适用。

注意事项

  • 不要在onIncomingCall回调中读取,该回调仅在收到INVITE请求时触发,无法拿到后续响应的头字段
  • 如果你的自定义参数是放在SDP内容中而非SIP头域,需要从CallInfo的remoteSdp字段中解析对应属性

内容的提问来源于stack exchange,提问作者Emre Tufekci

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 01:18:02