如何修改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
相关产品推荐
相关产品推荐

