V5

XSwitch v5.0.1 版发布

更新和 Bug 修复

XSwitch 更新:

  • 使用1.10.9-dev git 356d3f9 2022-11-23 07:22:41Z 64bit
  • mod_verto新增nativeapi
  • mod_verto修复stream write返回值Bug
  • mod_conference完善avatar
  • mod_conference修复border height
  • JWT相关优化;
  • mod_opus修复fec崩溃问题;
  • 调整核心bandwitch字符串解析;
  • mod_lua支持更大的curl header
  • mod_lua POST支持获取响应headers
  • 同步官方1.10.8,具体参见:https://github.com/signalwire/freeswitch/releases/tag/v1.10.8
  • 同步官方master,具体参见:https://github.com/signalwire/freeswitch/compare/v1.10.8...master (至 347b7f53,18 commits);

XUI 更新:

  • 使用xui-lua-4.0.1-20221125125712-9efad50d版本;
  • 数据库更新至4.0.0版本;
  • 增加阿里ASR语音识别测试;
  • 增加SIP参数中文说明;
  • 增加ccexitqueue接口;
  • 优化队列坐席显示;
  • 分组权限增加删除功能;
  • 修复媒体文件tts功能;
  • 优化路由分机用户等页面默认值;

升级建议

可以按照部署文档重新从头搭建。

如果系统中使用的5.0.0版本,需要修改镜像名称和版本号以及更新数据库,具体操作如下:

Linux 修改docker-compose.yml文件,Mac 修改docker-compose-mac.yml文件,将文件中servicexswitchimage一行的版本号由5.0.0改为5.0.1

ccr.ccs.tencentyun.com/free/xswitch-lua-js-free:5.0.0

修改为

ccr.ccs.tencentyun.com/free/xswitch-lua-js-free:5.0.1

如果用 Nginx,还需要按照上边把servicexswitch-nginx-xuiimage一行的镜像名称和版本号也修改为5.0.1

此次更新数据库操作。

INSERT INTO routes (name, description, prefix, dnc, context, dest_type, body) VALUES ('ali-asr', '阿里语音识别测试', 'asr', '', 'context-1', 'FS_DEST_SYSTEM', '');
INSERT INTO xparams (realm, k, v, ref_id, disabled) VALUES ('ROUTE', 'lua', 'xui/ali_asr.lua', (SELECT id FROM routes WHERE name = 'asr'), 0);
INSERT INTO dicts (realm, k, v, d) VALUES ('XUI_SCRIPTS', 'ALI-ASR', 'xui/ali_asr.lua', '阿里语音识别测试');

UPDATE dicts SET v = '3.0.15' WHERE realm = 'XUI' and k = 'DBVER';
INSERT INTO logs (resource, action, user_id, user_name, summary, message)
	VALUES('XUI', 'UPDATE', 0, 'SYSTEM', '3.0.15', '{"DEVER": "3.0.15"}');

CREATE TABLE lparams (
	id SERIAL PRIMARY KEY,
	lang VARCHAR NOT NULL,
	realm VARCHAR NOT NULL,
	k VARCHAR NOT NULL,
	v VARCHAR,

	created_at TIMESTAMP(0) DEFAULT now(),
	updated_at TIMESTAMP(0) DEFAULT now(),
	deleted_at TIMESTAMP(0)
);
CREATE INDEX lparams_realm ON lparams(realm);
CREATE INDEX lparams_deleted_at ON lparams(deleted_at);
--所有键值对的的根节点
INSERT INTO lparams (realm, k, v) VALUES ('REALMS', 'SIP_PROFILE', 'All SIP');

--SIP参数中文说明
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'rtp-digit-delay', 'RTP数字间隔时间(ms)');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'media-option:1', '媒体选项');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'media-option:2', '媒体选项');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'user-agent-string', '设置SIP消息中显示的User-Agent字段');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'debug', 'debug日志级别');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'shutdown-on-fail', '由于各种原因(如端口被占用,IP地址错误等),都可能造成UA在初始化时失败,该参数在失败时会停止FreeSWITCH');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'sip-trace', '是否开启SIP消息跟踪,跟踪消息会打印到日志中');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'sip-capture', '是否开启SIP消息捕获,开启后会将SIP消息会通过HEP或HEP3协议发送到Homer服务器');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'presence-proto-lookup', '状态呈现协议查询');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'liberal-dtmf', '使用原生DTMF,不对DTMF进行任何处理');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'watchdog-enabled', '是否启用看门狗');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'watchdog-step-timeout', '看门狗监测超时时间');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'watchdog-event-timeout', '看门狗事件超时时间');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'log-auth-failures', '是否将认证错误写入日志,可以配合Fail2Ban使用');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'forward-unsolicited-mwi-notify', '是否转发MWI通知消息(NOTIFY)');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'rfc2833-pt', '设置SDP中RFC2833的PT值。RFC2833是传递DTMF的标准');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'sip-port', 'SIP端口号');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'dtmf-duration', '设置DTMF的时长');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'inbound-codec-prefs', '来话语音编码列表,用于语音编码协商');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'outbound-codec-prefs', '去话语音编码列表,用于语音编码协商');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'rtp-timer-name', 'RTP时钟名称');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'rtp-ip', 'RTP的IP地址,仅支持IP地址而不支持域名。虽然RTP标准说应该域名,但实际情况是域名解析有时不可靠');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'sip-ip', 'RTP的IP地址,仅支持IP地址而不支持域名。');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'hold-music', '进行Hold状态时默认播放的音乐');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'apply-nat-acl', '使用哪个NAT ACL');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'cid-in-1xx', '是否在1xx消息中包含CallerID');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'extended-info-parsing', '扩展INFO解析支持,开启后可以支持解析更多的INFO消息。');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'aggressive-nat-detection', 'NAT穿越,深度检测SIP消息中的IP地址与实际的IP地址是否相符。');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'enable-100rel', '是否启用100%高可靠支持(PRACK消息)');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'disable-srv503', '出错时禁用503错误');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'enable-compact-headers', '是否支持压缩SIP头');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'enable-timer', '启用SIP时钟,Session Timer支持');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'minimum-session-expires', 'SIP会话超时值,在SIP消息中设置Min-SE');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'apply-inbound-acl', '对来话IP采用哪个ACL检测');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'local-network-acl', '默认情况下,Switch会自动检测本地网络,并创建一条localnet.auto ACL规则');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'apply-register-acl', '对注册请求采用哪个ACL检测');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'dtmf-type', 'DTMF收号的类型。有三种方式。info:是采用SIP的INFO消息传送DTMF按键信息的,由于SIP和RTP是分开走的,所以,可能会造成不同步;inband:是在RTP包中像普通语音数据那样进行带内传送,由于需要对所有包进行鉴别和提取,需要占用更多的资源;rfc2833:也是在带内传送,但它的RTP包有特殊的标记,因而比inband方式节省资源。它是在RFC2833中定义的');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'send-message-query-on-register', '如何发送MWI通知消息。true是每次都发送,而first-only只是首次注册时发送');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'send-presence-on-register', '在注册时是否发送状态呈现消息');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'caller-id-type', '设置来电显示的类型,rpid将会在SIP消息中设置Remote-Party-ID,而pid则会设置P-*-Identity,如果不需要这些,可以设置成none');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'record-path', '录音文件的默认存放路径');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'record-template', '录音文件名模板字符串');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'manage-presence', '是否支持状态呈现,影响Allow-Events头域');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'presence-probe-on-register', '在注册时是否检查状态呈现');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'manage-shared-appearance', '是否支持SLA(Shared Line Apperance,共享线路呈现');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'dbname', '和presence-hosts参数用以在多个profile间共享状态呈现信息');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'presence-hosts', '和dbname配合用以在多个profile间共享状态呈现信息');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'presence-privacy', '状态呈现隐私设置');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'bitpacking', '用于G726上的AAL2位打包');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'max-proceeding', '最大对话(SIP Dialog)数');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'session-timeout', '会话超时时间');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'multiple-registrations', '是否支持多点注册,可以是contact或true。开启多点注册后多个终端可以注册上来,有人呼叫这些时所有终端都会同时振铃');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'inbound-codec-negotiation', 'SDP中的语音编协商,如果设成greedy,则自己提供的语音编码列表会有优先权,否则优先使用对方的列表。');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'bind-params', '在SIP Contact地址上添加更多绑定参数');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'unregister-on-options-fail', '为了NAT穿越或keep alive,如果Switch向其它网关注册时,可以周期性地发一些OPTIONS包,相当于ping功能。该参数说明当ping失败时是否自动取消注册');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'all-reg-options-ping', '对所有注册上来的客户端定期发送OPTIONS消息,保活');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'nat-options-ping', '在NAT环境下周期性发送OPTIONS消息');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'sip-options-respond-503-on-busy', '在系统忙时对OPTIONS请求回复503响应消息');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'sip-messages-respond-200-ok', '对SIP MESSAGE请求响应200 OK,否则响应202 Accepted');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'sip-subscribe-respond-200-ok', '对SIP SUBSCRIBE请求响应200 OK,否则响应202 Accepted');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'tls', '是否支持TLS');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'tls-only', '是否仅支持TLS,禁用TCP和UDP');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'tls-bind-params', 'TLS绑定参数');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'tls-sip-port', 'TLS注册端口');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'tls-cert-dir', 'TLS证书路径');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'tls-passphrase', 'TLS证书密码');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'tls-verify-date', 'TLS检查证书有效期');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'tls-verify-policy', 'TLS检查策略');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'tls-verify-depth', 'TLS检查深度');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'tls-verify-in-subjects', 'TLS检查证书主题');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'tls-version', 'TLS支持的版本');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'tls-ciphers', 'TLS支持的加密算法');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'rtp-autoflush-during-bridge', '该选项默认为true。即在桥接电话是是否自动flush媒体数据(如果套接字上已有数据时,它会忽略定时器睡眠,能有效减少延迟)');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'rtp-rewrite-timestamps', '是否透传RTP时间戳');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'pass-rfc2833', '是否透传RFC2833 DTMF包');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'odbc-dsn', 'ODBC数据库DSN,默认为内置的SQLite');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'inbound-bypass-media', '将所有来电设置为媒体绕过');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'inbound-proxy-media', '将所有来电设置为媒体透传');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'inbound-late-negotiation', '对所有来电来讲,晚协商有助于在协商媒体编码之前,先前电话送到路由,因而在路由中可以进行个性化的媒体协商');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'inbound-zrtp-passthru', 'ZRTP透传(Deprecated)');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'accept-blind-reg', '该选项允许任何分机成功注册(REGISTER),而不检查用户和密码及其它设置');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'accept-blind-auth', '与上一条类似,该选项允许任何通话(INVITE)通过认证');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'suppress-cng', '抑制CNG');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'nonce-ttl', 'SIP认证中nonce的生存时间');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'disable-transcoding', '禁止转码,如果该项为true则在bridge其它电话时,只提供与a-leg兼容或相同的语音编码列表进行协商,以最大限度避免转码,不是真的不能转码,如果最终b-leg协商的编码a-leg的编码不一致,还是会转码');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'manual-redirect', '允许在路由中进行人工转向(处理REFER信息)');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'disable-transfer', '禁止转移');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'disable-register', '禁止注册');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'NDLB-broken-auth-hash', '兼容旧设备不完善的认证算法');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'NDLB-received-in-nat-reg-contact', '兼容不规范的设备将received参数放在Contact头域中');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'auth-calls', '是否对通话进行认证');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'inbound-reg-force-matching-username', '强制From用户名与鉴权用户名必须相同');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'auth-all-packets', '在认证时,对所有SIP消息都进行认证,而不是仅针对INVITE消息');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'ext-rtp-ip', '设置NAT环境中外网的RTP IP。该设置会影响SDP中的IP地址');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'ext-sip-ip', '设置NAT环境中外网SIP IP地址');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'rtp-timeout-sec', '指定的时间内RTP没有数据传送,则挂机');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'rtp-hold-timeout-sec', 'RTP处理保持状态的最大时长');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'vad', '语音活动状态检测,有三种可能,可设为入、出,或双向,通常来说“出”(out)是一个比较好的选择');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'alias', '给本SIP Profile设置别名');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'force-register-domain', '会在注册及订阅时在数据库中写入同样的域信息。如果你在使用一个FreeSWITCH支持多个域时,不要选这些选项');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'force-subscription-domain', '会在注册及订阅时在数据库中写入同样的域信息。如果你在使用一个FreeSWITCH支持多个域时,不要选这些选项');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'force-register-db-domain', '会在注册及订阅时在数据库中写入同样的域信息。如果你在使用一个FreeSWITCH支持多个域时,不要选这些选项');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'ws-binding', 'ws(Websocket)绑定端口');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'wss-binding', 'wss(安全Websocket)绑定端口');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'delete-subs-on-register', '在注册时禁用订阅功能');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'inbound-reg-in-new-thread', '在新线程中处理注册请求');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'rtcp-audio-interval-msec', 'RTCP音频报告时间间隔,若设置为passthru则透传RTCP');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'rtcp-video-interval-msec', 'RTCP视频报告时间间隔,若设置为passthru则透传RTCP');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'force-subscription-expires', '注册及订阅时设置间隔。如果你在使用一个FreeSWITCH支持多个域时,不要选这些选项');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'sip-subscription-max-deviation', '订阅消息最大偏差(秒),防止同时发送大量订阅消息');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'enable-3pcc', '该选项有两个值,true或proxy。 true则直接接受3pcc来电;如果选proxy,则会一直等待电话应答后才回送接受');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'NDLB-force-rport', '在NAT时强制rport功能,轻易不要动');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'challenge-realm', '设置SIP Challenge是使用的realm字段是从哪个域获取,auto_from和auto_to分别是从from和to中获取,除了这两者,也可以是任意的值');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'disable-rtp-auto-adjust', '大多数情况下,为了更好的穿越NAT,FreeSWITCH会自动调整RTP包的IP地址,但在某些情况下(尤其是在mod_dingaling中会有多个候选IP),FreeSWITCH可能会改变本来正确的IP地址。该参数禁用此功能');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'inbound-use-callid-as-uuid', '每一个Channel都有一个UUID, 该UUID是由系统生成的全局唯一的。对于来话,你可以使用SIP中的Call-ID头域来做UUID. 在某些情况下对于信令的跟踪分析比较有用,不推荐使用');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'outbound-use-uuid-as-callid', '与上一个参数差不多,只是在去话时可以使用UUID作为SIP Call-ID,推荐使用');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'rtp-autofix-timing', 'RTP自动定时。如果语音质量有问题,可以尝试将该值设成false');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'pass-callee-id', '默认情况下Switch会设置额外的“X-”,SIP消息头,在SIP标准中,所有X-打头的消息头都是应该忽略的。但并不是所有的实现都符合标准,所以在对方的网关不支持这种SIP头时,该选项允许你关掉它');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'auto-rtp-bugs', '某些运营商的设备不符合标准。为了最大限度的支持这些设备,FreeSWITCH 在这方面进行了妥协。使用该参数时要小心');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'disable-srv', '禁用SRV解析。可以规避DNS中某些错误的SRV记录');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'disable-naptr', '禁用NAPTR解析。可以规避DNS中某些错误的NAPTR记录');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'timer-T1', '初始重传间隔T1');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'timer-T1X64', '事务超时间隔,一般为64个T1');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'timer-T2', '最大重传间隔T2');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'timer-T4', '事务生存期T3');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'auto-jitterbuffer-msec', '动态调整抖动缓冲区大小(ms)');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'renegotiate-codec-on-hold', '在Hold时重新协商编码');
INSERT INTO lparams (lang, realm, k, v) VALUES('zh', 'SIP_PROFILE', 'context', '指定来话要落到路由的呼叫源。需要指出,如果用户注册到该Profile上(或是经过认证的分机,即本地分机),则分机中设置的呼叫源优先级高于该设置');

UPDATE dicts SET v = '3.0.16' WHERE realm = 'XUI' and k = 'DBVER';
INSERT INTO logs (resource, action, user_id, user_name, summary, message)
	VALUES('XUI', 'UPDATE', 0, 'SYSTEM', '3.0.16', '{"DEVER": "3.0.16"}');

UPDATE dicts SET v = '4.0.0' WHERE realm = 'XUI' and k = 'DBVER';
INSERT INTO logs (resource, action, user_id, user_name, summary, message)
	VALUES('XUI', 'UPDATE', 0, 'SYSTEM', '4.0.0', '{"DEVER": "4.0.0"}');

修改后,执行make down关闭服务。

再执行make up重新启动服务,如果想用 nginx 则执行make up-nginx

结语

如果您刚接触 XSwitch,可以先阅读XSwitch 快速入门

如果大家在使用过程中遇到什么问题,可以参考https://xswitch.cn/pages/howto/trouble-shoot/

如果大家对我们的产品有好的意见或建议,欢迎给我们反馈。感谢您使用 XSwitch。

5.0.2