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
相关产品推荐
相关产品推荐

