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

Android Kotlin下基于PjSip的TCP协议SIP注册失败求助

Android Kotlin下PjSip TCP模式SIP注册解决方案及问题排查

一、核心注册代码实现

以下是基于PjSip库完成TCP模式SIP注册的Kotlin代码示例,适配分机号1110的账号配置:

1. 初始化PjSip端点与TCP传输

import org.pjsip.pjsua2.*
import android.util.Log

private lateinit var endpoint: Endpoint

fun initPjsip() {
    try {
        endpoint = Endpoint()
        endpoint.libCreate()
        
        // 配置日志(便于排查问题)
        val epConfig = EpConfig()
        epConfig.logConfig.level = 5
        epConfig.logConfig.consoleLevel = 5
        endpoint.libInit(epConfig)
        
        // 创建TCP传输通道
        val tcpConfig = TransportConfig()
        tcpConfig.port = 0 // 自动分配本地端口
        endpoint.transportCreate(PJSIP_TRANSPORT_TCP, tcpConfig)
        
        // 启动PjSip库
        endpoint.libStart()
    } catch (e: Exception) {
        Log.e("PjSipInit", "初始化失败: ${e.message}")
        e.printStackTrace()
    }
}

2. 注册SIP账号(分机1110)

fun registerSipAccount() {
    val username = "1110"
    val password = "你的密码"
    val domain = "你的SIP服务器域名/IP"
    
    try {
        val accConfig = AccountConfig()
        // 设置账号ID
        accConfig.idUri = "sip:$username@$domain"
        // 指定TCP模式注册服务器
        accConfig.regConfig.registrarUri = "sip:$domain;transport=tcp"
        
        // 添加认证凭证
        val authCred = AuthCredInfo()
        authCred.scheme = "digest"
        authCred.username = username
        authCred.data = password
        authCred.realm = "*"
        accConfig.sipConfig.authCreds.add(authCred)
        
        // 暂时禁用媒体(优先确保注册成功)
        accConfig.mediaConfig.enableAudio = false
        accConfig.mediaConfig.enableVideo = false
        
        // 创建账号并监听注册状态
        val sipAccount = object : Account() {
            override fun onRegState(prm: OnRegStateParam) {
                super.onRegState(prm)
                when (prm.code) {
                    200 -> Log.d("PjSipReg", "注册成功!状态码: ${prm.code}")
                    else -> Log.e("PjSipReg", "注册失败,状态码: ${prm.code},原因: ${prm.reason}")
                }
            }
        }
        sipAccount.create(accConfig)
    } catch (e: Exception) {
        Log.e("PjSipReg", "注册请求异常: ${e.message}")
        e.printStackTrace()
    }
}

二、TCP传输无响应问题排查

针对发送注册请求后无200 OK响应、TCP模式失效的问题,按以下步骤逐一排查:

  • 验证服务器TCP配置:确认SIP服务器已开启TCP监听(默认端口5060,TLS为5061),且服务器防火墙允许客户端IP访问该端口。
  • 检查网络权限:确保AndroidManifest.xml中已添加必要权限:
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
  • 抓包分析TCP连接:使用tcpdump或Wireshark抓取设备网络包,确认TCP三次握手是否完成、SIP注册请求(REGISTER)是否发送至服务器。
  • 核对账号参数:确认用户名、密码、域名完全匹配服务器配置,避免因大小写、特殊字符导致认证失败。
  • 查看PjSip日志:通过日志排查连接超时、认证错误、传输层异常等具体问题,重点关注包含"TCP"、"REGISTER"、"auth"关键词的日志条目。

三、后续WebRTC集成铺垫

完成SIP注册后,可将PjSip作为信令层对接WebRTC实现音视频通话与屏幕共享:

  1. 通过PjSip接收/发送SIP INVITE消息,解析其中的SDP信息
  2. 将SDP与WebRTC的PeerConnection绑定,完成媒体协商
  3. 基于Android的MediaProjection API实现屏幕共享流的采集与传输

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:32:51