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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.13 16:15:55