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

如何修改JSSIP代码解决WebSocket URI无效问题以验证SIP登录凭证

问题分析与修改方案

核心问题:WebSocket URI无效

报错的直接原因是构造的WebSocket地址不符合规范,大概率是以下几点导致:

  • 服务器地址为空或格式错误(比如已包含http:///https://前缀)
  • 缺少WebSocket路径(多数SIP服务商的WebSocket端点需要带/ws或/sip这类路径)
  • 未对输入做基础校验,导致拼接出非法URI

具体修改步骤

1. 初始化凭证对象并添加输入校验

先确保UserSIPLoginCredentials是已定义的对象,同时验证必填字段是否为空,避免拼接空URI:

// 初始化凭证对象,填写测试值
const UserSIPLoginCredentials = {
  SIPLoginServer: '', // 示例:sip.your-provider.com:443/ws
  SIPLoginUsername: '',
  SIPLoginPassword: ''
};

// 基础输入校验
if (!UserSIPLoginCredentials.SIPLoginServer || !UserSIPLoginCredentials.SIPLoginUsername || !UserSIPLoginCredentials.SIPLoginPassword) {
  alert('请填写完整的SIP登录凭证');
  return;
}

// 移除服务器地址中可能存在的http/https前缀,避免重复拼接
const cleanServerAddr = UserSIPLoginCredentials.SIPLoginServer.replace(/^https?:\/\//, '');

2. 正确构造WebSocket URI

多数SIP服务商的WebSocket端点需要指定路径,直接使用清理后的地址拼接wss前缀:

const wsUri = `wss://${cleanServerAddr}`;
const TheTestSocket = new window.JsSIP.WebSocketInterface(wsUri);

3. 修正SIP URI格式

SIP URI的服务器部分只需要域名/IP(不需要WebSocket路径),所以拆分地址提取核心部分:

const sipUri = `sip:${UserSIPLoginCredentials.SIPLoginUsername}@${cleanServerAddr.split('/')[0]}`;

4. 补充WebSocket连接失败监听

当前代码缺少WebSocket层面的错误处理,补充后可精准定位连接问题:

TheTestSocket.on('connectingFailed', (error) => {
  alert(`WebSocket连接失败:${error.message}`);
  if (window.TheTestUserAgent) {
    window.TheTestUserAgent.stop();
  }
});

5. 优化事件逻辑

修复alert参数写法错误,同时避免重复调用stop():

TheTestUserAgent.on('registrationFailed', (e) => {
  alert(`注册失败:${e.cause}`);
  TheTestUserAgent.stop();
});

TheTestUserAgent.on('unregistered', () => {
  alert('已从SIP服务器注销');
});

修改后的完整代码

function PhoneTestSIPLogin() {
  // 初始化凭证对象,填写测试值
  const UserSIPLoginCredentials = {
    SIPLoginServer: '', // 示例:sip.your-provider.com:443/ws
    SIPLoginUsername: '',
    SIPLoginPassword: ''
  };

  // 基础输入校验
  if (!UserSIPLoginCredentials.SIPLoginServer || !UserSIPLoginCredentials.SIPLoginUsername || !UserSIPLoginCredentials.SIPLoginPassword) {
    alert('请填写完整的SIP登录凭证');
    return;
  }

  // 清理服务器地址,移除多余前缀
  const cleanServerAddr = UserSIPLoginCredentials.SIPLoginServer.replace(/^https?:\/\//, '');

  // 创建WebSocket接口
  const wsUri = `wss://${cleanServerAddr}`;
  const TheTestSocket = new window.JsSIP.WebSocketInterface(wsUri);

  // 监听WebSocket连接失败
  TheTestSocket.on('connectingFailed', (error) => {
    alert(`WebSocket连接失败:${error.message}`);
    if (window.TheTestUserAgent) {
      window.TheTestUserAgent.stop();
    }
  });

  // 配置UA
  const TheTestConfiguration = {
    sockets: [TheTestSocket],
    uri: `sip:${UserSIPLoginCredentials.SIPLoginUsername}@${cleanServerAddr.split('/')[0]}`,
    password: UserSIPLoginCredentials.SIPLoginPassword,
    register: true
  };

  const TheTestUserAgent = new window.JsSIP.UA(TheTestConfiguration);

  // 注册成功事件
  TheTestUserAgent.on('registered', () => {
    alert('SIP凭证验证通过!');
    TheTestUserAgent.unregister();
    TheTestUserAgent.stop();
  });

  // 注册失败事件
  TheTestUserAgent.on('registrationFailed', (e) => {
    alert(`注册失败:${e.cause}`);
    TheTestUserAgent.stop();
  });

  // 注销成功事件
  TheTestUserAgent.on('unregistered', () => {
    alert('已从SIP服务器注销');
  });

  // 启动UA
  TheTestUserAgent.start();
}

额外注意事项

  • 确认服务商提供的WebSocket端点地址:多数服务商文档会明确给出,比如wss://sip.example.com/ws或wss://sip.example.com:5061
  • 检查浏览器跨域限制:如果你的Web应用域名和SIP服务器不同,需要服务商配置CORS允许你的域名访问
  • 测试时开启浏览器控制台:查看更详细的错误日志,帮助定位问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 18:22:38