如何用linphone-sdk-android实现freePBX账号来电正常接听?
Linphone SDK Android 5.1.2 无法接听FreePBX来电解决方案
不存在linphone-android-sdk默认不支持第三方SIP账号来电接入的限制。该SDK基于标准SIP协议实现,你遇到的两类FreePBX作为被叫的场景无法接听,均为配置项未适配FreePBX的SIP转发规则导致,按以下步骤配置即可修复:
修正账号注册阶段的域匹配配置
5.1.2版本SDK默认开启SIP URI主机名自动猜测,且对SIP请求的域匹配校验逻辑严格,FreePBX转发的INVITE请求头域和本地注册域不一致时会被直接拦截。注册FreePBX分机账号时按如下逻辑配置:LinphoneProxyConfig proxyConfig = core.createProxyConfig(); // 身份信息、服务器地址中的域字段必须和FreePBX后台分机配置的域完全一致,不能留空 proxyConfig.setIdentity("sip:" + yourExtensionNumber + "@" + freePBXDomain); proxyConfig.setServerAddr("sip:" + freePBXServerAddress + ";transport=udp"); // 传输协议和FreePBX后台配置保持一致 proxyConfig.setRegistrarAddr("sip:" + freePBXServerAddress); proxyConfig.setDomain(freePBXDomain); proxyConfig.enableRegister(true); core.addProxyConfig(proxyConfig); // 关闭主机名自动猜测,避免SDK误判请求域 core.setGuessHostnameForSipUri(false); // 关闭严格UA匹配,兼容FreePBX转发时添加的额外UA标识 core.setStrictSipUaMatching(false);关闭默认的来电拦截规则
SDK默认开启「仅接受已注册联系人来电」限制,FreePBX下的其他分机不在本地已注册联系人列表时,来电会被直接丢弃,添加如下配置解除限制:// 允许非本地联系人的来电请求 core.setAcceptOnlyRegisteredContacts(false); // 允许FreePBX中继转发的跨域重定向INVITE请求 core.setAcceptCrossDomainRedirects(true);适配NAT与媒体协商规则
FreePBX默认未强制开启SRTP加密,且NAT转发场景要求客户端适配rport规则,否则会出现信令可达但接听请求无法路由回服务器、或者协商失败直接拒接的问题:LinphoneNatPolicy natPolicy = core.createNatPolicy(); // 客户端在私网、FreePBX在公网场景下开启ICE适配 natPolicy.enableIce(true); natPolicy.enableStun(true); // 有可用STUN服务就填写地址,无可用STUN则配合FreePBX侧的nat=force_rport,comedia配置开启rport适配 natPolicy.setStunServer(stunServerAddress); core.setNatPolicy(natPolicy); // 先关闭强制媒体加密测试兼容性,FreePBX侧未开SRTP时强制加密会直接返回488拒接 core.setMediaEncryption(LinphoneMediaEncryption.None); // 确认通话正常后再按需开启SRTP等加密配置快速定位异常原因
以上配置完成后仍无法接听时,直接开启SIP日志抓取具体错误码,无需盲目调整参数:// 开启SIP报文级日志 core.setLogLevel(LinphoneLogLevel.Message); core.addListener(new LinphoneCoreListener() { @Override public void onCallStateChanged(LinphoneCore core, LinphoneCall call, LinphoneCallState state, String message) { if (state == LinphoneCallState.Error) { LinphoneErrorInfo errorInfo = call.getErrorInfo(); Log.i("LinphoneSIPDebug", "来电错误信息:" + message + " 错误码:" + errorInfo.getReasonCode() + " SIP码:" + errorInfo.getProtocolCode()); } } });常见错误码对应问题如下:
- SIP 403 Forbidden:域配置不匹配或者INVITE请求未携带正确鉴权信息
- SIP 488 Not Acceptable Here:媒体加密、编码集协商不匹配,检查SRTP配置和双方支持的编码交集
- SIP 408 Request Timeout:NAT配置错误,接听后的200OK报文无法路由回FreePBX,检查rport、STUN/ICE配置
内容的提问来源于stack exchange,提问作者moorker
相关产品推荐
相关产品推荐

