每个配置文件可以有多个网关:
<gateways>
<gateway>
elements...
</gateway>
<gateway>
elements...
</gateway>
</gateways>
网关具有可以引用它的属性“名称”。网关描述了如何使用不同的 UA 到达目的地。例如,网关可以提供对 PSTN 或专用 SIP 网络的访问。定义网关的原因大概是因为网关需要某些信息才能接受来自 FreeSWITCH 用户代理的调用。
变量可以在网关上定义。入站变量设置在从网关接收到的呼叫的通道上,出站变量设置在发送到网关的呼叫的通道上。
示例:
<gateway name="gateway012">
<param name="realm" value="sip.voipcarrier.com" />
<param name="username" value="WBrandes" />
<param name="password" value="myvoiceismypassword" />
<param name="register" value="true" />
<param name="caller-id-in-from" value="true" />
<param name="ping" value="5" />
<param name="ping-max" value="3" />
<param name="retry-seconds" value="5" />
<param name="expire-seconds" value="60" />
<variables>
<variable name="verbose_sdp" value="true"/>
<variable name="absolute_codec_string" value="PCMU,PCMA" direction="outbound"/>
<variable name="customer_id" value="3532" direction="inbound"/>
</variables>
</gateway>
要从拨号计划访问特定网关,请使用
sofia/gateway/<gateway_name>/<dialstring>
网关参数
以下是作为 gateway 元素的子元素的 param 元素列表:
- register true或false (例如当您不想注册但想对网关进行身份验证时)
- schema (目前应留空,默认为摘要)
- realm (在某些情况下您可能需要设置授权领域)
- username (这是注册中的授权和来自用户名,除非设置了 from-user。)
- auth-username (这将是出站注册的身份验证用户名)
- password (以及密码)
- caller-id-in-from (当遥控器不执行 rpid 或 p-asserted 时,callerid 位于 from 中)
- extension (这是遥控器要联系的联系人分机号)
- extension-in-contact (这将在 SIP Contact 标头中发送扩展名)
- proxy (默认为网关名称,除非您设置此参数)
- context (此网关所在的上下文)
- expire-seconds (如果留空,默认注册多少秒为 3600)
- retry-seconds (设置重试注册的秒数)
- from-user (在 from 字段中使用的用户名默认为用户名,如果留空)
- from-domain (在 from 字段中使用的域)
- register-proxy (在那些时候你有一个你注册的代理和一个不同的代理来发送调用到默认网关名称或代理,如果留空)
- contact-params (额外的联系人参数,即 tport=tcp)
- register-transport (udp、tcp 或 tls,如果您启用了它)
<!-- /// 账户用户名 *必填* /// -->
<param name="用户名" value="foo"/>
注意:网关的用户名参数不要与配置文件设置配置中的用户名参数混淆!
<!--/// auth realm: *optional* 与网关名称相同,如果为空 ///-->
<!-- 领域-->
<param name="realm" value="sip.example.com[:port]"/>
<!--/// 账号密码 *必填* ///-->
<param name="password" value="密码"/>
<!--/// 要使用的用户名 from: *optional* 与用户名相同,如果为空 ///-->
<param name="from-user" value="fooman"/>
<!--/// 要使用的域 from: *可选* 与领域相同,如果为空;也可以设置为“auto-aleg-full”或“auto-aleg-domain” ///-->
<param name="from-domain" value="asterlink.com"/>
<!--/// 用频道的caller-id替换来自用户的INVITE ///-->
<!--/// 默认为false,因为呼出一般需要INVITE中的用户名 ///-->
<!--在通过此网关的呼出字段的from字段中使用呼入呼叫的callerid -->
<param name="caller-id-in-from" value="false"/>
<!--/// 呼入呼叫扩展名:*可选* 与用户名相同,如果为空。要使用 ${sip_to_user} 中的内容,请将其设置为值“auto_to_user” ///-->
<param name="extension" value=""/>
注意:扩展参数影响通道变量Caller-Destination-Number和destination_number的内容。如果为空,Caller-Destination-Number将始终设置为网关的用户名。如果它有一个值,Caller-Destination-Number将始终设置为此值。如果它的值为auto_to_user,则Caller-Destination-Number将填充值为${sip_to_user},这意味着在呼入电话的情况下真实拨打的号码。
<!--/// 代理主机:*可选* 与领域相同,如果为空 ///-->
<param name="proxy" value="proxy.example.com"/>
<!--/// 秒过期:*可选* 3600,如果为空 ///-->
<param name="expire-seconds" value="3600"/>
<!-- 在此配置文件或每次调用中使用 'suppress_cng' 变量抑制 CNG -->
<param name="suppress-cng" value="true"/>
<!--/// false:不注册。true: 注册 (默认) ///-->
<param name="register" value="false"/>
<!-- 使用哪个传输来注册 -->
<param name="register-transport" value="udp"/>
<!-- 发送联系人的额外 sip 参数-->
<param name="contact-params" value="tport=tcp"/>
<!-- 检查网关可用性:*可选* -->
<param name="ping" value="15"/>
<!-- *可选* -->
<param name="ping-max" value="10"/>
<!-- *可选* -->
<param name="ping-min" value="1"/>
ping-min 的意思是“在宣布网关启动之前我们必须有多少成功的 ping”。
ping-min和ping-max之间的间隔是网关标记为 UP 的“安全区域”。因此,例如,如果我们有 min 3 和 max 6,如果网关启动并且我们在 3、4、5、6 之间移动计数器,则网关将启动。
如果从 6 开始,我们连续释放 4 个(所以计数器 == 2)ping,则网关将被宣布关闭。
请注意,在 sofia 启动时,网关始终以 UP 启动,因此即使 ping-min > 1 也会启动。当网关关闭时,“正确”的方式就开始了。
<!-- *可选* - 默认为 false-->
<param name="extension-in-contact" value="true"/>
<!-- *可选* -->
<param name="cid-type" value="rpid"/>
当此配置文件充当另一个 UA 的客户端时,使用参数“注册”。通过注册,FreeSWITCH 通知其他 UA 其下落。这通常在 FreeSWITCH 希望其他 UA 发送 FreeSWITCH 调用,而其他 UA 期望这种注册时使用。如果 FreeSWITCH 仅将其他 UA 用作网关(例如,到 PSTN),则通常不需要注册。
当您希望 FS 为标头 To 使用 distict AOR 注册时,使用参数“distinct-to”。需要正确设置相关参数。例如,如果您希望 REGISTER 与:
From:<sip:someuser@somedomain.com>
To:<sip:anotheruser@anotherdomain.com>
然后设置参数如下:
<param name="distinct-to" value="true"/>
<param name="auth-username" value="someuser"/>
<param name="from-user" value="someuser"/>
<param name="from-domain" value="somedomain.com"/>
<param name="password" value="somepassword"/>
<param name="username" value="anotheruser"/>
<param name="realm" value="anotherdomain.com"/>
后一个参数“ping”用于检查网关可用性。通过设置此选项,FreeSWITCH 将向网关发送 SIP OPTIONS 数据包。如果网关以 200 或 404 响应,则网关发音为向上,否则为向下。[NB 似乎可以返回其他错误消息并且仍然导致网关被标记为“up”?] 如果任何呼叫被路由到状态为 down 的网关,FreeSWITCH 将生成 NETWORK_OUT_OF_ORDER 挂断原因。Ping 频率以秒为单位(值属性)定义,最小值为 5 秒。
参数“extension-in-contact”用于强制注册中的联系信息。如果您在默认注册为 gw+gateway_name@ip 时遇到问题,您可以将其设置为 true 以使用 extension@ip。如果扩展名是空白的,它将使用 username@ip。
您需要在向网关发送呼叫时将 FROM 数字插入到联系人 URI 用户部分
插入前
From: "8885551212" <sip:88855512120@8.8.8.8>
Contact: <sip:gw+mygateway@7.7.7.7:7080>
尝试将这些添加到网关参数
<param name="extension" value="8885551212"/>
<param name="extension-in-contact" value="true"/>
插入后
From: "8885551212" <sip:88855512120@8.8.8.8>
Contact: <sip:8885551212@7.7.7.7:7080>
无用户名/密码的出站呼叫的基本网关设置(因为您具有 ACL 权限):
<include>
<gateway name="provider">
<param name="proxy" value="199.96.248.140"/>
<param name="register" value="false"/>
<param name="caller-id-in-from" value="true"/> <!--Most gateways seem to want this-->
<param name="username" value="not-used"/>
<param name="password" value="not-used"/>
</gateway>
</include>
可以在目录(directory)部分_或_配置(configuration)部分中定义 SIP 网关。在默认配置中,下面定义了示例网关
conf/sip_profiles/external/example.xml
文件,如下所示:
<include>
<!--<gateway name="asterlink.com">-->
<!--/// account username *required* ///-->
<!--<param name="username" value="cluecon"/>-->
<!--/// auth realm: *optional* same as gateway name, if blank ///-->
<!--<param name="realm" value="asterlink.com"/>-->
<!--/// username to use in from: *optional* same as username, if blank ///-->
<!--<param name="from-user" value="cluecon"/>-->
<!--/// domain to use in from: *optional* same as realm, if blank; can also be set to "auto-aleg-full" or "auto-aleg-domain" ///-->
<!--<param name="from-domain" value="asterlink.com"/>-->
<!--/// account password *required* ///-->
<!--<param name="password" value="2007"/>-->
<!--/// extension for inbound calls: *optional* same as username, if blank. To use what's in ${sip_to_user}, set it to the value "auto_to_user" ///-->
<!--<param name="extension" value="cluecon"/>-->
<!--/// proxy host: *optional* same as realm, if blank ///-->
<!--<param name="proxy" value="asterlink.com"/>-->
<!--/// send calls via this proxy: *optional* ///-->
<!-- <param name="outbound-proxy" value="your-proxy.com"/> -->
<!--/// send register to this proxy: *optional* same as proxy, if blank ///-->
<!--<param name="register-proxy" value="mysbc.com"/>-->
<!--/// expire in seconds: *optional* 3600, if blank ///-->
<!--<param name="expire-seconds" value="60"/>-->
<!--/// do not register ///-->
<!--<param name="register" value="false"/>-->
<!-- which transport to use for register -->
<!--<param name="register-transport" value="udp"/>-->
<!--How many seconds before a retry when a failure or timeout occurs -->
<!--<param name="retry-seconds" value="30"/>-->
<!--Use the callerid of an inbound call in the from field on outbound calls via this gateway -->
<!--<param name="caller-id-in-from" value="false"/>-->
<!--extra sip params to send in the contact-->
<!--<param name="contact-params" value="tport=tcp"/>-->
<!--send an options ping every x seconds, failure will unregister and/or mark it down-->
<!--<param name="ping" value="25"/>-->
<!--</gateway>-->
</include>
以及在用户目录中,conf/directory/default/example.com.xml
以及 brian.xml
conf/directory/default/example.com.xml
<!--
Shell provider account should work with most providers.
-->
<include>
<user id="$${default_provider}">
<gateways>
<gateway name="$${default_provider}">
<param name="username" value="$${default_provider_username}"/>
<param name="password" value="$${default_provider_password}"/>
<param name="from-user" value="$${default_provider_username}"/>
<param name="from-domain" value="$${default_provider_from_domain}"/>
<param name="expire-seconds" value="600"/>
<param name="register" value="$${default_provider_register}"/>
<param name="retry-seconds" value="30"/>
<param name="extension" value="$${default_provider_contact}"/>
<!--<param name="contact-params" value="domain_name=$${domain}"/>-->
<param name="context" value="public"/>
</gateway>
</gateways>
<params>
<param name="password" value="$${default_provider_password}"/>
</params>
</user>
</include>
conf/directory/default/brian.xml
-------------------------------------------
<include>
<!--
ipauth if you have an cidr= in the user attributes ie cidr="1.2.3.4/32"
see <node type="allow" domain="$${domain}"/> in default acl.conf.xml
-->
<user id="brian" cidr="192.0.2.0/24">
<!-- Outbound Registrations Related to this user -->
<gateways>
<!--<gateway name="asterlink.com">-->
<!--/// account username *required* ///-->
<!--<param name="username" value="cluecon"/>-->
<!--/// auth realm: *optional* same as gateway name, if blank ///-->
<!--<param name="realm" value="asterlink.com"/>-->
<!--/// username to use in from: *optional* same as username, if blank ///-->
<!--<param name="from-user" value="cluecon"/>-->
<!--/// domain to use in from: *optional* same as realm, if blank ///-->
<!--<param name="from-domain" value="asterlink.com"/>-->
<!--/// account password *required* ///-->
<!--<param name="password" value="2007"/>-->
<!--/// replace the INVITE from user with the channel's caller-id ///-->
<!--<param name="caller-id-in-from" value="false"/>-->
<!--/// extension for inbound calls: *optional* same as username, if blank ///-->
<!--<param name="extension" value="cluecon"/>-->
<!--/// proxy host: *optional* same as realm, if blank ///-->
<!--<param name="proxy" value="asterlink.com"/>-->
<!--/// send register to this proxy: *optional* same as proxy, if blank ///-->
<!--<param name="register-proxy" value="mysbc.com"/>-->
<!--/// expire in seconds: *optional* 3600, if blank ///-->
<!--<param name="expire-seconds" value="60"/>-->
<!--/// do not register ///-->
<!--<param name="register" value="false"/>-->
<!-- which transport to use for register -->
<!--<param name="register-transport" value="udp"/>-->
<!--How many seconds before a retry when a failure or timeout occurs -->
<!--<param name="retry-seconds" value="30"/>-->
<!--Use the callerid of an inbound call in the from field on outbound calls via this gateway -->
<!--<param name="caller-id-in-from" value="false"/>-->
<!--extra sip params to send in the contact-->
<!--<param name="contact-params" value="tport=tcp"/>-->
<!--send an options ping every x seconds, failure will unregister and/or mark it down-->
<!--<param name="ping" value="25"/>-->
<!--</gateway>-->
</gateways>
<params>
<!-- omit password for authless registration -->
<param name="password" value="$${default_password}"/>
<param name="vm-password" value="9999"/><!--if vm-password is omitted password param is used-->
<!--<param name="email-addr" value="me@mydomain.com"/>-->
<!--<param name="vm-delete-file" value="true"/>-->
<!--<param name="vm-attach-file" value="true"/>-->
<!--<param name="vm-mailto" value="me@mydomain.com"/>-->
<!--<param name="vm-email-all-messages" value="true"/>-->
<!-- optionally use this instead if you want to store the hash of user:domain:pass-->
<!--<param name="a1-hash" value="c6440e5de50b403206989679159de89a"/>-->
<!-- What this user is allowed to acces -->
<!--<param name="http-allowed-api" value="jsapi,voicemail,status"/> -->
</params>
<variables>
<!--all variables here will be set on all inbound calls that originate from this user -->
<variable name="user_context" value="default"/>
<variable name="effective_caller_id_name" value="Brian West"/>
<variable name="effective_caller_id_number" value="1000"/>
<!-- Don't write a CDR if this is false valid values are: true, false, a_leg and b_leg -->
<variable name="process_cdr" value="true"/>
<!-- sip_secure_media will offer mandatory SRTP on invite AES_CM_128_HMAC_SHA1_32, AES_CM_128_HMAC_SHA1_80 or true-->
<variable name="rtp_secure_media" value="true"/>
<!-- limit the max number of outgoing calls for this user -->
<!--<variable name="max_calls" value="2"/>-->
<!-- send presence information if FS is configured to do so -->
<!--<variable name="presence_id" value="1000@$${domain}"/>-->
<!-- set these to take advantage of a dialplan localized to this user -->
<!--<variable name="numbering_plan" value="US"/>-->
<!--<variable name="default_area_code" value="434"/>-->
<!--<variable name="default_gateway" value="asterlink.com"/>-->
<!--
NDLB-connectile-dysfunction - Rewrite contact ip and port
NDLB-tls-connectile-dysfunction - Rewrite contact port only.
-->
<!--<variable name="sip-force-contact" value="NDLB-connectile-dysfunction"/>-->
<!--<variable name="sip-force-expires" value="10"/>-->
<!--<variable name="sip-register-gateway" value="cluecon.com"/>-->
<!-- Set the file format for a specific user -->
<!--<variable name="vm_message_ext" value="mp3"/> -->
</variables>
<vcard>
<!-- insert optional compliant vcard xml here-->
</vcard>
</user>
</include>
为什么它以 3 种不同的方式呈现呢?
sip_profile
声明将网关置于该sip_profile
的上下文中,因为当您停止/启动/重新启动该 sofia 配置文件时,网关将停止/启动/重新启动它。- 在第二种情况下,
default_provider
示例中,网关提供了默认目录(始终)。 - 在最后一个示例中,只有当用户 brian 注册时,才能使网关上下移动。
- 分类: FreeSWITCH FreeSWITCH学习 呼叫中心
- 标签: FreeSWITCH