话不多说，直接开整【使用本站FreeSWITCH镜像库】yum install -y epel-release wget wget -O /etc/yum.repos.d/freeswitch-release.repo http://freeswitch.clx.fun:12130/freeswitch-history-centos7.repo yum clean all && yum makecache yum install -y ffmpeg-3.2.4-1.el7.centos.x86_64 yum install freeswitch-*-1.10.1-4.el7 -x freeswitch-v8 -y --skip-broken systemctl enable freeswitch systemctl start freeswitch systemctl status freeswitch fs_cli --------------------------------------------------- freeswitch@fs-dev> freeswitch -nonat freeswitch@fs-dev> show codec type,name,ikey codec,ADPCM (IMA),mod_spandsp codec,AMR / Bandwidth Efficient,mod_amr codec,AMR / Octet Aligned,mod_amr codec,AMR-WB / Bandwidth Efficient,mod_amrwb codec,AMR-WB / Octet Aligned,mod_amrwb codec,B64 (STANDARD),mod_b64 codec,BroadVoice16 (BV16),mod_bv codec,BroadVoice32 (BV32),mod_bv codec,CODEC2 3200/2400/1400/1200bps,mod_codec2 codec,G.711 alaw,CORE_PCM_MODULE codec,G.711 ulaw,CORE_PCM_MODULE codec,G.722,mod_spandsp codec,G.723.1 6.3k,mod_g723_1 codec,G.726 16k,mod_spandsp codec,G.726 16k (AAL2),mod_spandsp codec,G.726 24k,mod_spandsp codec,G.726 24k (AAL2),mod_spandsp codec,G.726 32k,mod_spandsp codec,G.726 32k (AAL2),mod_spandsp codec,G.726 40k,mod_spandsp codec,G.726 40k (AAL2),mod_spandsp codec,G.729,mod_g729 codec,GSM,mod_spandsp codec,H263 Video,mod_av codec,H263+ Video,mod_av codec,H264 Video,mod_av codec,LPC-10,mod_spandsp codec,MP3,mod_shout codec,OPUS (STANDARD),mod_opus codec,PROXY PASS-THROUGH,CORE_PCM_MODULE codec,PROXY VIDEO PASS-THROUGH,CORE_PCM_MODULE codec,Polycom(R) G722.1/G722.1C,mod_siren codec,RAW Signed Linear (16 bit),CORE_PCM_MODULE codec,Speex,CORE_SPEEX_MODULE codec,VP8 Video,CORE_VPX_MODULE codec,VP9 Video,CORE_VPX_MODULE codec,isac,mod_isac 37 total.
编译安装FreeSWITCH 1.10.8本站FreeSWITCH镜像站：http://freeswitch.clx.fun:12130/每日同步一次。2022年10月14日，freeswitch的1.10.8版本发布了，许久没有编译FreeSWITCH源码了，为防止手生，特来回顾一下。1. 安装源修改系统仓库源为阿里云（解决官方源速度问题）rm -rf /etc/yum.repos.d/* wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo yum clean all && yum makecache官方源（需要开发者帐号，速度尚可）：yum install -y https://files.freeswitch.org/repo/yum/centos-release/freeswitch-release-repo-0-1.noarch.rpm epel-release本站镜像源：yum install -y epel-release wget wget -O /etc/yum.repos.d/freeswitch-release.repo http://freeswitch.clx.fun:12130/freeswitch-release.repo yum clean all && yum makecache2. 安装依赖一般依赖yum install -y yum-plugin-ovl centos-release-scl rpmdevtools yum-utils git yum install -y spandsp3-devel yum-builddep -y freeswitch --skip-broken yum install -y alsa-lib-devel autoconf automake bison broadvoice-devel bzip2 centos-release-scl cmake3 curl-devel devtoolset-7 devtoolset-7-gcc* e2fsprogs-devel erlang flite-devel g722_1-devel gcc-c++ gdbm-devel git gnutls-devel ilbc2-devel lame-devel ldns-devel libatomic libcodec2-devel libcurl-devel libdb4* libdb4-devel libedit-devel libidn-devel libjpeg-devel libmemcached-devel libmpg123-devel libogg-devel libpqxx-devel libshout-devel libsilk-devel libsndfile-devel yum install -y libtheora-devel libtiff-devel libtool libuuid-devel libvorbis-devel libvpx2* libvpx-devel libxml2-devel libyuv-devel lua-devel lzo-devel mongo-c-driver-devel ncurses-devel net-snmp-devel openssl-devel opus-devel pcre-devel perl perl-ExtUtils-Embed pkgconfig portaudio-devel postgresql-devel postgresql-libs python-devel rpmdevtools soundtouch-devel speex-devel sqlite-devel unbound-devel unixODBC unixODBC-devel unixODBC-devel.x86_64 vim wget which yasm yasm-devel yum-plugin-ovl yum-utils zlib-devel yum install -y sofia-sip-devel libks nasmmod_av依赖(以下为官方路径，本站路径请替换为：http://freeswitch.clx.fun:12130/src-releases/libs/)wget -c http://files.freeswitch.org/downloads/libs/libx264.tar.bz2 tar -jxvf libx264.tar.bz2 cd libx264 ./configure --enable-static --enable-shared --prefix=/usr make make install cp /usr/lib/pkgconfig/x264.pc /usr/lib64/pkgconfig/ cp /usr/lib/libx264.so /usr/lib64/ cp /usr/lib/libx264.a /usr/lib64/ cd ../ # download and install libav wget -c http://files.freeswitch.org/downloads/libs/libav-12.tar.bz2 tar -jxvf libav-12.tar.bz2 cd libav ./configure --enable-pic --enable-shared --enable-libx264 --enable-gpl --extra-libs="-ldl" --extra-cflags=-I/usr/include --extra-ldflags=-L/usr/lib64 make # make CXXFLAGS="-fPIC" make install cp /usr/local/lib/pkgconfig/libavcodec.pc /usr/local/lib/pkgconfig/libavdevice.pc /usr/local/lib/pkgconfig/libavfilter.pc /usr/local/lib/pkgconfig/libavformat.pc /usr/local/lib/pkgconfig/libavresample.pc /usr/local/lib/pkgconfig/libavutil.pc /usr/local/lib/pkgconfig/libswscale.pc /usr/lib64/pkgconfig/ cd ../ # 执行刷新，以让FreeSWITCH运行时可以找到库 ldconfig3. 编译FreeSWITCHmodules.conf中注释掉applications/mod_signalwire如果不需要mod_av还需要注释掉applications/mod_avwget http://freeswitch.clx.fun:12130/src-releases/freeswitch/freeswitch-1.10.8.-release.tar.gz tar vzxf freeswitch-1.10.8.-release.tar.gz cd freeswitch-1.10.8.-release ./bootstrap.sh -j ./configure --enable-portable-binary \ --prefix=/usr --localstatedir=/var --sysconfdir=/etc \ --with-gnu-ld --with-openssl \ --enable-core-odbc-support --enable-zrtp make make -j install make -j cd-sounds-install make -j cd-moh-install验证安装[root@fs-dev ~]# freeswitch -nonat .=============================================================. | _____ ______ _____ _____ ____ _ _ | | | ___| __ ___ ___/ ___\ \ / /_ _|_ _/ ___| | | | | | | |_ | '__/ _ \/ _ \___ \\ \ /\ / / | | | || | | |_| | | | | _|| | | __/ __/___) |\ V V / | | | || |___| _ | | | |_| |_| \___|\___|____/ \_/\_/ |___| |_| \____|_| |_| | | | .=============================================================. | Anthony Minessale II, Michael Jerris, Brian West, Others | | FreeSWITCH (http://www.freeswitch.org) | | Paypal Donations Appreciated: paypal@freeswitch.org | | Brought to you by ClueCon http://www.cluecon.com/ | .=============================================================. .=======================================================================================================. | _ _ ____ _ ____ | | / \ _ __ _ __ _ _ __ _| | / ___| |_ _ ___ / ___|___ _ __ | | / _ \ | '_ \| '_ \| | | |/ _` | | | | | | | | |/ _ \ | / _ \| '_ \ | | / ___ \| | | | | | | |_| | (_| | | | |___| | |_| | __/ |__| (_) | | | | | | /_/ \_\_| |_|_| |_|\__,_|\__,_|_| \____|_|\__,_|\___|\____\___/|_| |_| | | | | ____ _____ ____ ____ __ | | | _ \_ _/ ___| / ___|___ _ __ / _| ___ _ __ ___ _ __ ___ ___ | | | |_) || || | | | / _ \| '_ \| |_ / _ \ '__/ _ \ '_ \ / __/ _ \ | | | _ < | || |___ | |__| (_) | | | | _| __/ | | __/ | | | (_| __/ | | |_| \_\|_| \____| \____\___/|_| |_|_| \___|_| \___|_| |_|\___\___| | | | | ____ _ ____ | | / ___| |_ _ ___ / ___|___ _ __ ___ ___ _ __ ___ | | | | | | | | |/ _ \ | / _ \| '_ \ / __/ _ \| '_ ` _ \ | | | |___| | |_| | __/ |__| (_) | | | | _ | (_| (_) | | | | | | | | \____|_|\__,_|\___|\____\___/|_| |_| (_) \___\___/|_| |_| |_| | | | .=======================================================================================================. 2022-10-20 11:32:24.867345 [INFO] switch_core.c:2494 FreeSWITCH Version 1.10.8-release~64bit (-release 64bit) FreeSWITCH Started Max Sessions [1000] Session Rate [30] SQL [Enabled] 2022-10-20 11:32:24.867359 [CONSOLE] switch_core.c:2502 [This app Best viewed at 160x60 or more..] freeswitch@fs-dev>
安装必要软件及官方库官方库： yum install -y https://$(< /etc/yum/vars/signalwireusername):$(< /etc/yum/vars/signalwiretoken)@freeswitch.signalwire.com/repo/yum/centos-release/freeswitch-release-repo-0-1.noarch.rpm epel-release yum install createrepo wget -y创建仓库文件夹cd /www/wwwroot/ mkdir freeswitch-repo使用reposync同步仓库reposync -r freeswitch -np freeswitch-repo/ reposync -r freeswitch-source -np freeswitch-repo/ reposync -r freeswitch-debuginfo -np freeswitch-repo/创建yum仓库数据库文件cd freeswitch-repo/ createrepo -p freeswitch createrepo -p freeswitch-debuginfo createrepo -p freeswitch-source下载仓库Key文件wget https://$(< /etc/yum/vars/signalwireusername):$(< /etc/yum/vars/signalwiretoken)@files.freeswitch.org/repo/yum/centos-release/RPM-GPG-KEY-FREESWITCH搭建yum源文件服务器yum install nginx -y配置网站server { listen 80; server_name freeswitch.clx.fun; index index.php index.html index.htm default.php default.htm default.html; root /www/wwwroot/freeswitch-repo; #SSL-START SSL相关配置，请勿删除或修改下一行带注释的404规则 #error_page 404/404.html; #SSL-END #ERROR-PAGE-START 错误页配置，可以注释、删除或修改 #error_page 404 /404.html; #error_page 502 /502.html; #ERROR-PAGE-END #PHP-INFO-START PHP引用配置，可以注释或修改 include enable-php-00.conf; #PHP-INFO-END #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效 include /www/server/panel/vhost/rewrite/freeswitch.clx.fun.conf; #REWRITE-END #禁止访问的文件或目录 location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md) { return 404; } location / { root /www/wwwroot/freeswitch-repo; autoindex on; autoindex_exact_size off; autoindex_localtime on; charset utf-8,gbk; } #一键申请SSL证书验证目录相关设置 location ~ \.well-known{ allow all; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; error_log off; access_log /dev/null; } location ~ .*\.(js|css)?$ { expires 12h; error_log off; access_log /dev/null; } access_log /www/wwwlogs/freeswitch.clx.fun.log; error_log /www/wwwlogs/freeswitch.clx.fun.error.log; }设置自同步创建shell文件：auto-sync-freeswitch.sh#!/bin/bash #中文-UTF8 mkdir /www/wwwroot/freeswitch-repo/ chmod 755 /www/wwwroot/freeswitch-repo/ wget -O /www/wwwroot/freeswitch-repo/RPM-GPG-KEY-FREESWITCH https://$(< /etc/yum/vars/signalwireusername):$(< /etc/yum/vars/signalwiretoken)@files.freeswitch.org/repo/yum/centos-release/RPM-GPG-KEY-FREESWITCH reposync -r freeswitch -np /www/wwwroot/freeswitch-repo/ reposync -r freeswitch-source -np /www/wwwroot/freeswitch-repo/ reposync -r freeswitch-debuginfo -np /www/wwwroot/freeswitch-repo/ if [ ! -d "/www/wwwroot/freeswitch-repo/freeswitch/repodata/" ];then mkdir /www/wwwroot/freeswitch-repo/freeswitch/repodata/ else echo "文件夹已经存在" fi createrepo -po /www/wwwroot/freeswitch-repo/freeswitch /www/wwwroot/freeswitch-repo/freeswitch/repodata/ if [ ! -d "/www/wwwroot/freeswitch-repo/freeswitch-source/repodata/" ];then mkdir /www/wwwroot/freeswitch-repo/freeswitch-source/repodata/ else echo "文件夹已经存在" fi createrepo -po /www/wwwroot/freeswitch-repo/freeswitch-source /www/wwwroot/freeswitch-repo/freeswitch-source/repodata/ if [ ! -d "/www/wwwroot/freeswitch-repo/freeswitch-debuginfo/repodata/" ];then mkdir /www/wwwroot/freeswitch-repo/freeswitch-debuginfo/repodata/ else echo "文件夹已经存在" fi createrepo -po /www/wwwroot/freeswitch-repo/freeswitch-debuginfo /www/wwwroot/freeswitch-repo/freeswitch-debuginfo/repodata/ crontab -e 0 0 * * * /www/wwwroot/auto-sync-freeswitch.sh crontab -l附：已搭建好的FreeSWITCH仓库：http://freeswitch.clx.fun:12130
WebRTC 直接从更好的 Web 浏览器和设备提供实时通信，无需 Adob​​e Flash 或 Silverlight 等插件。WebRTC始终在安全模式下运行。FreeSWITCH 为其公共会议桥提供了一个WebRTC 门户，以展示通过网页处理电话的可能性；加入我们的每周电话会议。无论是用于经典 WebRTC 还是 FreeSWITCH Verto 端点，使用 WSS 证书配置 FreeSWITCH 的过程都是相同的。Debian 7最小化安装 Debian 7。mkdir -p /usr/local/freeswitch/certs edit /usr/local/freeswitch/conf/sip_profiles/internal.xml # Set these params and save the file: 如果在 NAT 之后，请确保将 vars.xml 中的ext-sip-ip和ext-rtp-ip设置为 FreeSWITCH 的公共 IP 地址。 如果与 NAT 内外的客户端通信，您必须设置local-network-acl为rfc1918.auto，并将ext-sip-ip和ext-rtp-ip前缀为autonat:XXXX安装证书/usr/local/freeswitch/certs/wss.pem的布局:Cert, Key and Chain(s) are all contained in a single file in this order: -----BEGIN CERTIFICATE----- <cert> -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- <key> -----END RSA PRIVATE KEY----- -----BEGIN CERTIFICATE----- <chain> -----END CERTIFICATE-----启动 FreeSWITCH其他方法# Create certificates: wget http://files.freeswitch.org/downloads/ssl.ca-0.1.tar.gz tar zxfv ssl.ca-0.1.tar.gz cd ssl.ca-0.1/ perl -i -pe 's/md5/sha256/g' *.sh perl -i -pe 's/1024/4096/g' *.sh ./new-root-ca.sh ./new-server-cert.sh self.bkw.org ./sign-server-cert.sh self.bkw.org cat self.bkw.org.crt self.bkw.org.key > /usr/local/freeswitch/certs/wss.pem # Setup Apache: # default-ssl: SSLCertificateFile /usr/local/freeswitch/certs/wss.pem SSLCertificateKeyFile /usr/local/freeswitch/certs/wss.pem SSLCertificateChainFile /usr/local/freeswitch/certs/wss.pem # Setup Sofia TLS: cat self.bkw.org.crt self.bkw.org.key > /usr/local/freeswitch/certs/agent.pem cat ca.crt > /usr/local/freeswitch/certs/cafile.pem # vars.xml: <X-PRE-PROCESS cmd="set" data="internal_ssl_enable=true"/> <X-PRE-PROCESS cmd="set" data="external_ssl_enable=true"/> # Restart FreeSWITCH. ## Now make sure your system has ca.crt imported so it will trust your new found hotness. # TEST: openssl s_client -connect self.bkw.org:443 openssl s_client -connect self.bkw.org:5061 openssl s_client -connect self.bkw.org:5081 openssl s_client -connect self.bkw.org:8082 # Depending on what you've setup you'll see: subject=/C=US/ST=Oklahoma/L=McAlester/O=Tonka Truck/OU=Secure Web Server/CN=self.bkw.org/emailAddress=brian@bkw.org issuer=/C=US/ST=Oklahoma/L=McAlester/O=Whizzzzzzy Bang Bang/OU=Certification Services Division/CN=WBB Root CA/emailAddress=brian@bkw.org # Or there abouts.最新版本的 Freeswitch 应该会自动生成自签名证书。但是，自签名证书通常不能很好地工作，因为您需要诱导提示以允许使用不受信任的证书。您应该使用受信任的证书，就像使用您的网站一样。如果您使用 WebRTC url，例如 wss://foo.bar.com:7443并将其更改为https://foo.bar.com:7443，您可以在浏览器中访问它并给它一个永久例外。在 macOS 和 Windows 上，您可以将 ca.crt 导入您的信任库。
每个配置文件可以有多个网关：<gateways> <gateway> elements... </gateway> <gateway> elements... </gateway> </gateways>网关具有可以引用它的属性“名称”。网关描述了如何使用不同的 UA 到达目的地。例如，网关可以提供对 PSTN 或专用 SIP 网络的访问。定义网关的原因大概是因为网关需要某些信息才能接受来自 FreeSWITCH 用户代理的调用。变量可以在网关上定义。入站变量设置在从网关接收到的呼叫的通道上，出站变量设置在发送到网关的呼叫的通道上。示例:<gateway name="gateway012"> <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，如果您启用了它） 注意：网关的用户名参数不要与配置文件设置配置中的用户名参数混淆！ 注意：扩展参数影响通道变量Caller-Destination-Number和destination_number的内容。如果为空，Caller-Destination-Number将始终设置为网关的用户名。如果它有一个值，Caller-Destination-Number将始终设置为此值。如果它的值为auto_to_user，则Caller-Destination-Number将填充值为${sip_to_user}，这意味着在呼入电话的情况下真实拨打的号码。 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 也会启动。当网关关闭时，“正确”的方式就开始了。 当此配置文件充当另一个 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>然后设置参数如下： 后一个参数“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>尝试将这些添加到网关参数 插入后From: "8885551212" <sip:88855512120@8.8.8.8> Contact: <sip:8885551212@7.7.7.7:7080>无用户名/密码的出站呼叫的基本网关设置（因为您具有 ACL 权限）：<include> <gateway name="provider"> </gateway> </include>可以在目录(directory)部分_或_配置(configuration)部分中定义 SIP 网关。在默认配置中，下面定义了示例网关conf/sip_profiles/external/example.xml 文件，如下所示：<include> <!--<gateway name="asterlink.com">--> <!--</gateway>--> </include>以及在用户目录中，conf/directory/default/example.com.xml 以及 brian.xmlconf/directory/default/example.com.xml <include> <user id="$${default_provider}"> <gateways> <gateway name="$${default_provider}"> </gateway> </gateways> <params> </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"> <gateways> <!--<gateway name="asterlink.com">--> <!--</gateway>--> </gateways> <params> </params> <variables> <variable name="user_context" value="default"/> <variable name="effective_caller_id_name" value="Brian West"/> <variable name="effective_caller_id_number" value="1000"/> <variable name="process_cdr" value="true"/> <variable name="rtp_secure_media" value="true"/> <!--<variable name="max_calls" value="2"/>--> <!--<variable name="presence_id" value="1000@$${domain}"/>--> <!--<variable name="numbering_plan" value="US"/>--> <!--<variable name="default_area_code" value="434"/>--> <!--<variable name="default_gateway" value="asterlink.com"/>--> <!--<variable name="sip-force-contact" value="NDLB-connectile-dysfunction"/>--> <!--<variable name="sip-force-expires" value="10"/>--> <!--<variable name="sip-register-gateway" value="cluecon.com"/>--> <!--<variable name="vm_message_ext" value="mp3"/> --> </variables> <vcard> </vcard> </user> </include>为什么它以 3 种不同的方式呈现呢？sip_profile 声明将网关置于该 sip_profile 的上下文中，因为当您停止/启动/重新启动该 sofia 配置文件时，网关将停止/启动/重新启动它。在第二种情况下，default_provider 示例中，网关提供了默认目录（始终）。在最后一个示例中，只有当用户 brian 注册时，才能使网关上下移动。
外部配置文件(external.xml)概述默认情况下，FreeSWITCH 提供在端口 5080 上运行的外部配置文件。外部配置文件处理到 SIP 提供商的外部或出站注册。SIP 提供商向您发送呼叫，您通过外部配置文件向您的提供商发送呼叫。外部配置文件允许匿名呼叫，这是必需的，因为您的提供商永远不会向您进行身份验证以向您发送呼叫。随 FreeSWITCH 提供的 external 配置文件 (conf/sip_profiles/external.xml) 是了解有助于 NAT 穿越的两个非常重要的变量的一个很好的起点。这些都是： external_ 变量在 conf/vars.xml中配置。外部配置文件很重要，因为如果要设置端口转发则必须借助此文件。这使您可以方便的突破 NAT。如果您希望进行这种性质的通信，那么您应该考虑复制外部配置文件并创建特定于您的目的的专用配置文件并设置端口转发，以便该配置文件可以与外部实体发送和接收。除了更改使用的端口外，复制的外部配置文件版本几乎不需要修改。请参阅 一般 NAT 示例方案。请记住，当您更改此引用时，所有希望使用此上下文的设备都必须相应地引用它。例如，如果您创建一个名为 external5090 的配置文件并希望从中拨打电话，那么您应该将其引用为：/sofia/external5090/1234@blah.com参数配置参数包括关于配置文件的其他更一般的信息，包括 STUN 是否在使用中。请注意，配置参数在单词之间使用连字符“-”，而通道变量在单词之间使用下划线“_”。每个配置文件都有自己的设置元素。这不仅方便——可以设置一个配置文件使用 STUN，另一个配置文件使用不同的网关或在防火墙后面工作，而不使用 STUN——但它也很重要。这是因为每个配置文件都定义了一个 SIP 用户代理，并且每个 UA 都必须有自己唯一的“sip-port”。按照惯例，5060 是默认端口，但可以调用例如foo@sip.example.com :5070，因此您可以为每个单独的配置文件定义您喜欢的任何端口。Vanilla 配置包含 sofia.conf.xml 的完整示例以及注释：internal，external基本参数alias 别名 使 SIP 配置文件绑定到此 IP 和端口以及您的 SIP/RTP IP 和端口。shutdown-on-fail 故障关机 如果设置为 true 并且配置文件无法加载，FreeSWITCH 将关闭。如果您正在运行诸如 Pacemaker 和 OpenAIS 之类的管理一对 FreeSWITCH 节点并自动监控、启动、停止、重新启动和待机失败的节点，这将非常有用。它将确保特定节点不能在“部分启动”的情况下使用。user-agent-string 用户代理这会在您的服务器发送的所有 SIP 消息中设置 User-Agent 标头。默认情况下，这可能类似于“FreeSWITCH-mod_sofia/1.0.trunk-12805”。如果您不想宣传详细的版本信息，您可以简单地将其设置为“FreeSWITCH”甚至“Asterisk PBX”作为一个笑话。设置此值时要小心，因为某些字符（例如“@”）可能会导致其他 SIP 代理将您的消息视为无效而拒绝。 log-level 日志级别 debug 调试 sip-trace SIP跟踪 context 拨号方案上下文从 ip:port 来的呼叫将被发送到 此 配置文件 sip-port SIP端口为 SIP 流量绑定的端口： sip-ip SIP IP地址为 SIP 流量绑定的 IP 地址。不要使用主机名，只使用 IP 地址。 或者，从 1.6 版开始，可以指定接口和可选地址族而不是 IP，对于 rtp-ip 也是如此。 rtp-ip rtp流IP地址为 RTP 流量绑定的 IP 地址。不要使用主机名，只使用 IP 地址 多个 rtp-ip 支持：如果添加了更多 rtp-ip 参数，它们将随着新呼叫的进行而循环使用。在撰写本文时，Windows不支持IPv6 地址ext-rtp-ip rtp流公网IP这是从 Internet 上看到 FreeSWITCH 背后的 IP，所以如果 FreeSWITCH 在 NAT 之后，这基本上是应该用于 RTP 的公共 IP。允许的值为：ext-rtp-ip描述例子$${variable}vars.xml 中的任何变量 w.x.y.z特定数字 IP 地址 autonat:w.x.y.z用于 LAN 和 WAN，以避免发送到 LAN 设备的 SIP CONTACT 错误 auto猜测IP（通过查看IP路由表猜测哪个接口是默认路由） auto-natFS 使用 uPNP 或 NAT-PMP 来发现它应该使用的公共 IP 地址 stun:DNS name or IP address of STUN serverFS 使用您选择的 STUN 服务器来发现公共 IP 地址 host:DNS nameFS 将 DNS 名称解析为公共 IP 地址，因此您可以使用动态 DNS 主机 ext-sip-ip 用于 SIP 消息的公网IP用于 SIP 消息的公共 IP可能值与 ext-rtp-ip 相同，通常设置为相同值。 tcp-keepalive 保活时间间隔将此设置为间隔（以毫秒为单位）以向通过 TCP 注册的用户代理 (UA) 发送保持活动数据包；不要设置为禁用。tcp-pingpongtcp-ping2pongdialplan 拨号方案dialplan 参数非常强大。在最简单的配置中，它将使用 XML 拨号方案。这意味着它将从mod_xml_curl XML 拨号计划中读取数据（例如，回调到您的网络服务器），或者从 freeswitch.xml 拨号计划部分中指定的 XML 文件中读取数据。（例如 default_context.xml） 还可以在图中添加枚举查找（因为 mod_enum 提供了拨号方案功能），因此枚举查找会覆盖 XML 拨号方案 或者仅在 XML 查找失败时才解析枚举的顺序 也可以指定一个特定的枚举根 或在自定义文件上使用 XML 它将首先检查特定的 XML 文件，然后点击普通 XML，假设您已配置并工作，该XML 也会执行mod_xml_curl查找。媒体相关参数另请参阅：代理媒体resume-media-on-hold 恢复媒体暂停当呼叫没有媒体时，当您按下保持按钮时，这会将它们带回媒体。要在呼叫未保持后将呼叫返回到 bypass-media，请启用 bypass-media-after-hold。 bypass-media-after-att-xfer 在转接后返回绕过媒体在有人参与转接后返回绕过媒体。 bypass-media-after-hold 保持后绕过媒体这将允许呼叫在保持后返回绕过媒体。只有设置了 resume-media-on-hold 才能启用此选项。可从 git rev 8fa385b 获得。 inbound-bypass-media 入站绕过媒体取消注释以将所有入站呼叫设置为无媒体模式。这意味着 FreeSWITCH 服务器只保持 SIP 消息状态，但让 RTP 流直接从端点传送到端点 inbound-proxy-media 入站代理媒体取消注释以将所有入站呼叫设置为代理媒体模式。这意味着 FreeSWITCH 将 SIP 和 RTP 流量都保留在服务器上，但不与 RTP 流交互。 disable-rtp-auto-adjust 禁用rtp自动调整 ignore-183nosdp 忽略-183nosdp enable-soa 启用 SOA 将值设置为“false”以禁用来自 sofia 的 SIP SOA，以告诉 sofia 不要接触 SDP 的交换t38-passthru t38-直通 以下选项可用'true' 启用 t38 passthru'false' 禁用 t38 通路'once' 启用 t38 passthru，但仅发送 t.38 重新邀请一次（自 2011 年 11 月 9 日提交 08b25a8 起可用）编解码器相关选项inbound-codec-prefs 入站编解码器首选项此参数允许更改每个配置文件允许的入站编解码器。 outbound-codec-prefs 出站编解码器首选项此参数允许更改每个配置文件的出站编解码器。 codec-prefs 编解码器首选项此参数允许同时更改入站编解码器首选项和出站编解码器首选项。 inbound-codec-negotiation 入站编解码器协商如果您希望编解码器列表优先，请设置为“贪婪” 如果“贪婪”对您不起作用，请尝试使用“scrooge”来解决 DID 提供商（例如 CallCentric）误报的 ptime 问题。一个经验法则是：'generous'允许远程编解码器列表具有优先权并“赢得”编解码器协商和选择过程'greedy' 迫使本地 FreeSWITCH 偏好列表获胜'scrooge' 让 'greedy' 更进了一步，因此即使在谈判过程中对方谎称能力时，FreeSWITCH 也会获胜sip_codec_negotiation是此设置的通道变量版本inbound-late-negotiation 入站延迟协商取消注释以在您决定编解码器是否正常之前*让呼叫到达拨号计划。 bitpacking 位打包此设置适用于 G.726 上的 AAL2 位打包。 disable-transcoding 禁用转码如果您想强制网桥的出站支路仅提供发起方正在使用的编解码器，请取消注释 renegotiate-codec-on-reinvite 重新协商编解码器重新邀请 STUN如果您需要使用 STUN 服务器，以下是常见的工作示例：ext-rtp-ip stun.fwdnet.net是一个可公开访问的 STUN 服务器。ext-sip-ip stun-enabled 启用stunUDP over NAT 的简单遍历 (STUN) 用于帮助解决与 NAT 后面的 SIP 客户端相关的问题，在其消息传递中使用私有 IP 地址空间。指定时使用 stun（默认为 true）。 stun-auto-disable 自动禁用stun设置为 true 让配置文件确定 stun 没有用并在全局范围内将其关闭 NATingapply-nat-acl收到 REGISTER 或 INVITE 时，如果 Contact 标头中的 IP 地址与RFC 1918访问列表中定义的条目匹配，则自动启用NAT 模式。在这种情况下，“acl”是用词不当，因为如果用户的联系人 IP 不匹配，访问将不会被拒绝。 aggressive-nat-detection如果接收请求的网络 IP/端口与 SIP Via: 标头中的 IP/端口组合不同，或者 Via: 标头包含接收到的参数（无论它包含什么），这将启用 NAT 模式。 VAD 和 CNGVAD 代表语音活动检测器。FreeSWITCH 能够检测语音，当没有检测到语音时可以停止传输 RTP 数据包。vad 语音检测 suppress-cng 噪声抑制使用“suppress_cng”变量在此配置文件或每次呼叫中抑制舒适噪声发生器 (CNG) NDLBNDLB-force-rport这将强制 FreeSWITCH 将 SIP 响应发送到接收它们的网络端口。使用风险自负！有关详细信息，请参阅NAT 遍历。 safe = 仅在我们知道安全的端点上执行 force-rport 行为的参数。NDLB-broken-auth-hash用于当手机使用哈希中的方法 INVITE 响应挑战 ACK 时 NDLB-received-in-nat-reg-contact回复注册 nat 处理时向联系人添加 received="<ip>:<port>" NDLB-sendrecv-in-session默认情况下，“a=sendrecv”仅包含在 SDP 的媒体部分中。虽然这符合 RFC，但它可能会破坏某些 SIP 设备的功能。要在 SDP 的会话部分中还包括“a=sendrecv”，请将此参数设置为 true。 NDLB-allow-bad-iananame即使给定的字符串不正确，也将允许编解码器匹配各自的名称。例如，Linksys 和 Sipura 手机默认通过 G.729a 而不是 G.729 作为编解码器字符串，因此不匹配。如果您希望允许错误的 IANA 名称与相应的编解码器字符串匹配，请将以下参数添加到您的 SIP 配置文件中。 Call ID 来电显示inbound-use-callid-as-uuid 呼入使用 callid 作为 uuid在入站呼叫中，使会话的 uuid 等于该呼叫的 SIP 呼叫 ID。 outbound-use-uuid-as-callid 呼出使用 uuid 作为 callid在出站呼叫上，将 callid 设置为与会话的 uuid 匹配 这在..sip_profiles/external.xml文件中。TLS请确保在启用以下某些功能之前阅读 SIP TLS ，因为它们可能无法按预期运行。tlsTLS：默认禁用，设置为“true”启用 tls-only默认情况下禁用，启用后会阻止 sofia 侦听此连接的未加密端口。这可以阻止许多暴力破解脚本，如果您的所有客户端都通过 TLS 连接，那么可以帮助减少您的 FreeSWITCH 服务器对世界的暴露。 tls-bind-paramsTLS 的附加绑定参数 tls-sip-port监听 TLS 请求的端口。（如果未指定，将使用 5061） tls-cert-diragent.pem 和 cafile.pem ssl 证书的位置（TLS 服务器需要） tls-versionTLS 版本（“sslv2”、“sslv3”、“sslv23”、“tlsv1”、“tlsv1.1”、“tlsv1.2”）。注意：电话可能无法使用 TLSv1 未设置时默认为：tlsv1,tlsv1.1,tlsv1.2tls-passphrase如果您的 agent.pem 受密码保护，请在此处粘贴密码以启用 FreeSWITCH 解密密钥。 tls-verify-date如果客户端/服务器证书应验证其日期以确保其未过期且当前处于活动状态。 tls-verify-policy设置如何对服务器/客户端证书进行安全检查。验证通常是针对 cafile.pem 检查证书是否有效。in 仅验证传入连接，out 仅验证传出连接，all 验证所有连接，subjects_in、subjects_out 和 subjects_all 用于主题验证（传出连接的主题验证是针对连接到的主机名/IP）。可以使用“|”拆分多个策略 管道，例如subjects_in|subjects_out。默认为无。 tls-verify-depth当启用证书验证 (tls-verify-policy) 时，我们应该尝试在 cafile.pem 文件中再次验证链上证书的深度。默认情况下只有深度 2。 tls-verify-in-subjects如果为传入连接启用了主题验证（tls-verify-policy 设置为“subjects_in”或“subjects_all”），这是允许的主题列表（用“|”管道分隔），请注意这仅影响传入连接始终根据主机名/ips 检查传出连接主题。 DTMF 双音多频rfc2833-ptRFC 2833已被RFC 4733淘汰。 dtmf-duration dtmf持续时间 dtmf-type dtmf类型在 SIP 配置文件中设置参数： 或者 或者 或者在 SIP 网关或用户配置文件中设置变量（不在通道中，它必须在 CS_INIT 之前）：<variables> <variable direction="inbound|outbound|both" name="dtmf_type" value="info"> </variables>pass-rfc2833默认值：假如果为真，它将RFC 2833 DTMF 从桥的一侧传递到另一侧，不受影响。否则，它会在传递它们之前对它们进行解码和重新编码。 liberal-dtmf SIP 相关选项enable-timer 启用定时器这将启用或禁用对RFC 4028 SIP 会话计时器的支持。 session-timeout 会话超时所有呼叫的会话计时器在指定秒后到期然后它将发送另一个邀请（重新邀请）。如果未指定，则默认为 30 分钟。一些网关可能会拒绝少于 30 分钟的值。此值是指RFC 4028中的 Session-Expires （如果事先没有成功的会话刷新事务发生，则元素将认为会话超时的时间）所有呼叫的会话计时器在指定秒后到期然后它将发送另一个邀请（重新邀请）。如果未指定，则默认为 30 分钟。一些网关可能会拒绝少于 30 分钟的值。此值是指RFC 4028中的 Session-Expires （如果事先没有成功的会话刷新事务发生，则元素将认为会话超时的时间） enable-100rel 启用 100rel这启用了对 100rel 的支持（100% 可靠性 - RFC3262中定义的 PRACK 消息）这解决了 SIP 的问题，即“180 Ringing”之类的临时消息没有被确认，因此可能会在连接不佳的情况下被丢弃而无需重新传输。2009-07-08: 启用此功能可能会导致 FreeSWITCH 崩溃，请参阅FSCORE-392。 minimum-session-expires 最小会话过期这将设置来自RFC 4028的“Min-SE”值（以秒为单位）。此值不得小于 90 秒。 sip-options-respond-503-on-busy当设置为 true 时，当 FS 暂停或超过最大会话数时，此参数将使 FreeSWITCH 以 503“Maximum Calls In Progress”响应传入的 SIP OPTIONS。当设置为 false 或根本没有设置（默认行为）时，SIP OPTIONS 总是以 200“OK”响应。 如果您使用诸如 OpenSIPS 或 Kamailio 之类的代理和调度程序模块通过发送 SIP OPTIONS 来探测您的 FreeSWITCH 服务器，则将此参数设置为 true 特别有用。sip-force-expires设置此参数会覆盖 200 OK 中的过期值，以响应针对此 sip_profile 的所有入站 SIP REGISTER。这个参数可以通过设置一个sip-force-expires用户目录变量来覆盖每个用户。sip-expires-max-deviation SIP注册过期时间使用随机偏差设置此参数将随机偏差添加到 200 OK 中的过期值，以响应针对此 sip_profile 的所有入站 SIP REGISTER。结果将是客户端不会在同一时间间隔内重新注册，从而分散系统上的负载。例如，如果您设置： 那么响应的过期时间将在 1800-600=1200 和 1800+600=2400 秒之间。通过设置sip-expires-max-deviation用户目录变量，可以为每个用户覆盖此参数。outbound-proxy 出站代理设置此参数会将所有出站事务发送到由 outbound-proxy 设置的值。 send-display-update 发送显示更新告诉 FreeSWITCH 不要将显示更新发送到调用的分支。 RTP 相关选项auto-jitterbuffer-msec 自动 抖动缓冲器 毫秒数所有呼叫中拥有的jitterbuffer的大小。 rtp-timer-name rtp-rewrite-timestamps如果您不想将时间戳从 1 个 RTP 流传递到另一个 RTP 流，则 rtp-rewrite-timestamps 是您可以在 SIP 配置文件中设置的参数（基于拨号计划中的 rtp_rewrite_timestamps chanvar）。结果是，FreeSWITCH 将使用此 SIP 配置文件重新生成并重写所有 RTP 流中的时间戳，这些流将发送到端点。在向某些偏执狂且不符合 RFC 的网关发送呼叫时，这可能是解决音频问题所必需的（众所周知，Cirpack 需要这样做）。 media_timeout 媒体超时旧称: rtp-timeout-sec (不推荐使用的配置参数)此通道变量配置在 FreeSWITCH 认为呼叫已断开并挂断之前 RTP 不活动（未收到媒体数据包）的毫秒数。建议您改用会话计时器。如果省略此设置，则默认值为“0”，即禁用超时。示例：将媒体超时设置为 30 秒 media_hold_timeout旧称: rtp-hold-timeout-sec (不推荐使用的配置参数)此通道变量配置在 FreeSWITCH 认为呼叫已断开并挂断之前，端点保持呼叫的 RTP 不活动（媒体静默）秒数。建议您改用会话计时器，因为某些电话在保持状态时会停止发送媒体。如果省略此设置，则默认值为“0”，即禁用超时。 rtp-autoflush-during-bridge控制如果 FreeSWITCH 检测到它没有跟上桥接呼叫上的 RTP 媒体（音频）流，会发生什么。（如果 FreeSWITCH 服务器没有足够的可用 CPU 时间，就会发生这种情况。）当设置为“true”（默认值）时，FreeSWITCH 会在传入队列中等待读取多个 RTP 数据包时发出通知。如果这种情况持续超过 5 秒，RTP 数据包将被丢弃以“赶上”音频流。例如，如果队列中总是有五个额外的 20 ms 数据包，则可以通过丢弃数据包来消除 100 ms 的音频延迟。这将导致音频故障，因为一些音频被丢弃，但会在通话的其余部分将延迟提高 100 毫秒。如果 rtp-autoflush-during-bridge 设置为 false，FreeSWITCH 将改为保留桥接呼叫上的所有 RTP 数据包，即使它增加了呼叫者听到的延迟或“滞后”。 rtp-autoflush与“rtp-autoflush-during-bridge”具有相同的效果，但会影响非桥接呼叫（例如传真、IVR 和回声测试）。与“rtp-autoflush-during-bridge”不同，默认值为 false，这意味着非桥接调用上的高延迟数据包不会被丢弃。这会以增加音频延迟（或“滞后”）为代价来产生更流畅的音频。将“rtp-autoflush”设置为 true 将丢弃数据包以尽可能减少延迟。这样做可能会导致 DTMF 识别、传真和其他依赖接收所有数据包的进程出错。 Auth这些设置处理身份验证：将 SIP 端点识别到 FreeSWITCH 的要求。challenge-realm选择realm challenge键。如果未设置，默认为 auto_to。auto_from - 使用 from 字段作为 SIP realm的值。auto_to - 使用 to 字段作为 SIP realm的值。 - 您可以输入用于 SIP realm的任何值。如果您希望 URL 拨号正常工作，您需要将其设置为 auto_from。如果您使用除 auto_to 或 auto_from 之外的任何其他值，您将失去执行多个域的能力。 accept-blind-auth接受任何身份验证而不实际检查（对大多数人来说不是一个好功能） auth-calls目录中的用户可以应用“auth-acl”参数，以限制用户访问预定义的 ACL 或 CIDR。 值可以是“false”以禁用此配置文件上的身份验证，这意味着当调用进入配置文件时，不会*向调用者发送身份验证质询。log-auth-failures在身份验证失败（注册和邀请）时写入日志条目（警告）。对于希望使用 fail2ban 的用户很有用。注意：需要 SVN#15654 或更高版本 auth-all-packets在经过身份验证的调用中，验证 所有 数据包，而不仅仅是 INVITE 和 REGISTER（注意：即使将此选项设置为 true，OPTIONS、SUBSCRIBE、INFO 和 MESSAGE 也不会进行身份验证，请参阅http://jira.freeswitch.org/browse/ FS-2871 ) 注册disable-register在公共软交换中禁用注册 multiple-registrations 多次注册此参数的有效值为“contact”、“true”、“false”。value="true" 是最常见的用法。将此值设置为“contact”将删除基于 sip_user、sip_host 和联系人字段的旧注册，而不是 call_id。 max-registrations-per-extension 每个分机的最大注册数定义每个分机的最大注册数。此参数的有效值是大于 0 的整数。请注意，将其设置为 1 会抵消多次注册的使用。在达到最大值后尝试注册分机时，sofia 将响应 403。以下示例将最大注册数设置为 2 accept-blind-reg该选项允许任何电话注册，而不检查用户和密码及其它设置。 inbound-reg-force-matching-username 入站注册强制匹配用户名强制用户和 auth-user 匹配。 force-publish-expires强制自定义状态更新过期增量（-1 表示无休止） force-register-domain所有入站注册都将在此域中查找用户。注释掉以使用多个域 force-register-db-domain所有入站 reg 将使用此域存储在数据库中。注释掉以使用多个域 send-message-query-on-register 注册时发送消息查询可以设置为“true”、“false”或“first-only”。如果设置为“true”（这是默认行为），mod_sofia 将在注册时发送消息查询事件。mod_voicemail使用它来计算消息。 如果设置为“first-only”，则只有第一个 REGISTER 会触发消息查询（它需要 UA 在后续 REGISTER 上增加 NC。某些手机，例如 snom，不这样做）。消息查询的最终效果是导致向注册 UA 发送 NOTIFY MWI 消息（它用于满足期望 MWI 而不订阅它的终端）。unregister-on-options-fail 当option失败时注销如果使用nat-options-ping设置为 True，如果 OPTIONS 数据包上没有应答，则端点将被注销。 nat-options-ping 向NAT注册发送ping消息设置此选项后，FreeSWITCH 将定期向所有 NATed 注册端点发送一个 OPTIONS 数据包以保持连接。如果使用unregister-on-options-fail设置为 True，如果 OPTIONS 数据包上没有答案，则端点将被取消注册。 all-reg-options-ping 向所有注册发送ping消息设置此选项后，FreeSWITCH 将定期向所有已注册的端点发送一个 OPTIONS 数据包以保持连接。如果使用unregister-on-options-fail设置为 True，如果 OPTIONS 数据包上没有答案，则端点将被取消注册。 registration-thread-frequency控制检查 FreeSWITCH 中的注册是否过期的频率。 inbound-reg-in-new-thread对于每个入站注册，启动一个新线程来处理它，例如在使用较重的后端时 ping-mean-interval控制 FreeSWITCH™ 向注册用户发送 OPTIONS 数据包的平均间隔，默认为 30 秒。 ping-thread-frequency控制同时发送 ping 的频率。默认为 1 秒。 示例：间隔设置为 30，频率设置为 1，对于 1000 个注册用户，FS 将每秒 ping 33 个用户，并且每 30 秒重新启动一次。（1000 除以 30 = 33）订阅force-subscription-expires强制订阅到期的值低于请求的值 force-subscription-domain所有入站订阅都将在此域中查找用户。注释掉以使用多个域 在线状态manage-presence启用状态信息如果您想共享您的状态（请参阅 dbname 和状态主机），请在第一个配置文件上将此设置为“true”并启用共享状态数据库。然后在共享存在的后续配置文件中将此变量设置为“passive”并在那里启用共享存在数据库。 dbname用于在 sofia 个人资料中共享状态信息用于此配置文件的数据库名称 presence-hold-state默认情况下，当呼叫处于保持状态时，监控分机会将该分机显示为振铃。您可以通过指定此参数和以下值之一来更改此行为。自 2012 年 4 月 13 日提交 1145905 起可用。confirmed - 分机出现忙。early（默认）- 分机似乎正在响铃。terminated - 分机出现空闲。 presence-hosts在 dbname 中指定的数据库中具有共享存在的域列表。每个配置文件使用多个域的人无论如何都不能使用此功能，因此在这种情况下，您需要将其设置为“_DISABLED_”之类的内容，以避免将来自相似域的用户全部混合在一起。对于多个域，也称为多租户呼叫 1001 将呼叫所有域中的所有匹配用户。不要将存在主机与多租户一起使用。 presence-privacy 状态隐私可选择在分布式 NOTIFY 消息中全局隐藏呼叫者 ID。例如，“Talk 1002”将是分机 1001 在与分机 1002 通话时的出席信息。如果出席隐私标签设置为 true，那么它将把出席信息分发为“电话中”（不带它所连接的分机）。因此，任何订阅 1001 的用户都无法看到他/她正在与谁交谈。 send-presence-on-register 注册时发送状态指定用户注册时是否发送出席信息。默认是不发送存在信息。有效选项：falsetruefirst-only 来电显示相关选项caller-id-type 来电显示类型选择一个，可以被入站呼叫类型和/或 sip_cid_type 通道变量覆盖Remote-Party-ID 标头： P-*-Identity family of headers: 都不是: pass-callee-id 传递被叫ID（默认为 true）如果您遇到网关出于某种原因讨厌它应该忽略的 X-headers 的内容，则通过将其设置为 false 来禁用 其他hold-music 保持音乐 disable-hold 禁用保持这允许禁用音乐暂停（从 2010 年 4 月 30 日星期五 19:14:39 -0500 开始，在 GIT 提交 e5cc0539ffcbf660637198c698e90c2e30b05c2f 中添加）。当呼叫设备打算发送自己的 MOH，但仍向 FreeSWITCH 发送 REINVITE 以触发其 MOH 时，这可能很有用。这也可以通过拨号计划通过 rtp_disable_hold 通道变量来完成。 apply-inbound-acl 应用入站 acl设置acl.conf.xml中定义的哪些访问控制列表应用于此配置文件 apply-register-acl 启用注册acl apply-proxy-acl 启用代理acl 这允许通过一个或多个代理服务器将流量发送到 FreeSWITCH。代理服务器应添加一个名为 X-AUTH-IP 的标头，其中包含客户端的 IP 地址。FreeSWITCH 信任代理，因为它的 IP 在代理服务器 ACL 中列出，并使用此标头中 IP 的值作为客户端的 IP 进行 ACL 身份验证（acl 在 apply-inbound-acl 中定义）。record-template 录音文件模版 max-proceeding 最大进程正在进行的最大打开通话数 bind-params 绑定参数如果您想发送您自己的任何特殊绑定参数 disable-transfer禁用在公共交换机中可能不受欢迎的传输 manual-redirect 手动重定向 enable-3pccenable-3pcc 确定是否允许第三方呼叫控制。在 SIP 邀请不包含 SDP（延迟媒体协商）的情况下，第三方呼叫控制非常有用。enable-3pcc 可以设置为“true”或“proxy”，true 立即接受呼叫，proxy 等待呼叫被应答然后发送接受 nonce-ttlsip auth 中 nonce 的 TTL 如果此处未设置，此参数设置为 60 秒。用于确定用户注册记录在 sip_authentication 表中存储多长时间。sip_authentication 表中的 expires 字段是这个值加上用户代理设置的 expires。sql-in-transactions 事务中的 sql如果设置为 true（默认），它将指示配置文件等待 500 个 SQL 语句累积或 500 毫秒过去并在事务中执行它们（以提高性能）。 odbc-dsn如果你有ODBC支持和工作 dsn，你可以使用它而不是 SQLite mwi-use-reg-callid username 用户名如果您希望在 SDP 消息中隐藏您正在使用 FreeSWITCH 的事实（特别是 o= 和 s= 字段），请在配置文件下设置用户名参数。当我们处理网关时，这与用户名参数没有任何关系。如果未设置此值，则系统默认使用 FreeSWITCH 作为用户名参数，并带有 o= 和 s= 字段。 Example:. v=0. o=root 1346068950 1346068951 IN IP4 1.2.3.4. s=root. c=IN IP4 1.2.3.4. t=0 0. m=audio 26934 RTP/AVP 18 0 101 13. a=fmtp:18 annexb=no. a=rtpmap:101 telephone-event/8000. a=fmtp:101 0-16. a=ptime:20. when you set
SIP 配置在三个不同的配置文件中进行。vars.xml在此文件中，您只需指定一个参数。该参数是 $${domain}。此参数应包含电话/用户代理在注册时使用的域名（或类似 IP 地址的文本字符串）。此外，您可以将“hold_music”频道变量设置为波形文件路径或“indicate_hold”（在保持时发送重新邀请）。sip_profiles/internal.xml此文件包含 SIP 特定信息，例如您拥有哪些提供商（用于拨打外部电话）以及注册过程应如何工作。默认情况下，所有电话都可以注册。由于我们只想允许注册的手机使用我们的通信能力，我们需要更改名为“accept-blind-reg”的参数。(?) directory/default.xml最后要做的是指定哪些用户可以注册自己。这是在“目录”目录中完成的。密码可以以明文或 A1 哈希（“用户名：域：密码”的 MD5 字符串）形式发送。密码也是可选的，但请注意始终必须指定 params 标签，否则将找不到用户。<domain name="$${domain}"> <user id="arne"> <params></params> </user> <user id="arnepw"> <params> </params> </user> </domain>另请注意，我已将域名更改为 $${domain} 以匹配 FreeSwitch.xml 中的字符串。这样，只需要在更改域时更改FreeSwitch.xml即可。高级用法您可以为 FreeSWITCH 提供您自己的目录（由网络服务器动态生成）。这是通过使用 mod_xml_curl 模块完成的。有关其他信息，请查看此处： mod_xml_curl
添加请求标头您可以通过将字符串sip_h_添加到任何通道变量的前缀来向出站 SIP 呼叫添加任意标头，例如：<action application="set" data="sip_h_X-Answer=42"/> <action application="bridge" data="sofia/mydomain.com/1000@example.com"/>请注意，对于 BYE 请求，您需要在通道变量上使用前缀sip_bye_h_。虽然不是必需的，但您应该在标头前加上“X-”以避免与其他 SIP 堆栈的互操作性问题。所有入站 SIP 呼叫都会将任何 X- 标头安装到本地变量中。这意味着您可以轻松地将任何 X-header 从一个 FreeSWITCH 实例桥接到另一个实例。要访问上面第二个框的标题，请使用通道变量 ${sip_h_X-Answer}重要的是要注意语法 ${sip_h_custom-header}不能用于检索任何不以 X- 开头的自定义标头。这是因为 Sofia 只读取并放入以 X- 开头的自定义标头变量。添加响应标头可以设置三种类型的响应头前缀：响应头sip_rh_临时响应标头sip_ph_Bye响应头sip_bye_h_每个前缀将专门为其给定类型的请求添加标头没有“全局”响应标头前缀将来所有响应消息添加标头。例如：<action application="set" data="sip_rh_X-Reason=Destination Number Not in Footprint"/> <action application="set" data="sip_bye_h_X-Accounting=Some Accounting Data"/>SIP 消息如下：INVITE sip:19099099099@1.2.3.4 SIP/2.0 Via: SIP/2.0/UDP 5.6.7.8:5080;rport;branch=z9hG4bKyg61X9v3gUD4g Max-Forwards: 69 From: "DJB" <sip:2132132132@5.6.7.8>;tag=XQKQ322vQF5gK To: <sip:19099099099@1.2.3.4> Call-ID: b6c776f6-47ed-1230-0085-000f1f659e58 CSeq: 30776798 INVITE Contact: <sip:mod_sofia@5.6.7.8:5080> User-Agent: FreeSWITCH-mod_sofia/1.2.0-rc2+git~20120713T162602Z~0afd7318bd+unclean~20120713T184029Z Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, UPDATE, INFO, REGISTER, REFER, NOTIFY Supported: timer, precondition, path, replaces Allow-Events: talk, hold, conference, refer Content-Type: application/sdp Content-Disposition: session Content-Length: 229 P-Charge-Info: <sip:2132132132@5.6.7.8>;npi=0;noa=3 X-FS-Support: update_display,send_info. Remote-Party-ID: "DJB" <sip:2132132132@5.6.7.8>;party=calling;screen=yes;privacy=off剥离单个 SIP 标头有时 SIP 提供商会添加额外的标头信息。大多数时候，他们这样做是为了自己使用（跟踪呼叫）。但是这些额外的信息会导致很多问题。在某些情况下，我们将此呼叫直接桥接到第三方系统时呼叫被丢弃，因为第三方系统不接受此标头，因此我们必须剥离那些 SIP 标头。<action application="unset" data="sip_h_X-voipnow-did"/> <action application="unset" data="sip_h_X-voipnow-extension"/>剥离所有自定义 SIP 标头如果您希望剥离所有自定义标头，同时仅保留拨号方案中定义的标头：<action application="set" data="sip_copy_custom_headers=false"/> <action application="set" data="sip_h_X-myCustomHeader=${sip_h_X-myCustomHeader}"/>附加通道变量还可以设置其他变量来影响 sofia 处理呼叫的方式。例如，可以通过设置sip_exclude_contact变量来过滤联系人。例子：<anti-action application="set" data="sip_exclude_contact=${network_addr}"/>或者，您可以通过设置sip_auth_username和sip_auth_password变量对拨出呼叫执行 SIP Digest 授权，以避免使用网关进行身份验证。例子：<action application="bridge" data="[sip_auth_username=secretusername,sip_auth_password=secretpassword]sofia/external/00123456789@sip.example.com"/>更改 SIP 联系人用户 FreeSWITCH 通常使用 mod_sofia@ ip:port作为内部 SIP 联系人。要将其更改为 foo@ ip:port，有一个变量 sip_contact_user：{sip_contact_user=foo}sofia/my_profile/1234@192.168.0.1;transport=tcp
同一分机多次注册呼叫一个分机并振铃多个电话您必须在conf/sip_profiles/internal-ipv6.xml和conf/sip_profiles/internal.xml中启用多个注册（在 conf/autoload_configs/switch.conf.xml 中的设置无效）。此参数的有效值为 "contact"、"true"、"false"、" call-id"。 将此值设置为“contact”将删除基于 sip_user、sip_host 和联系人字段的旧注册，而不是 call_id。振铃所有注册的分机在您的拨号方案 ( conf/dialplan/default.xml ) 中，您现在可以使用sofia_contact查找函数返回所有已注册的 sip 配置文件；例如，在<extension name="Local_Extension">和<extension name="extension-intercom">部分中的default.xml替换：<extension name="extension-intercom"> <condition field="destination_number" expression="^8(10[01][0-9])$"> <action application="set" data="dialed_extension=$1"/> <action application="export" data="sip_auto_answer=true"/> <!-- <action application="bridge" data="user/${dialed_extension}@${domain_name}"/> --> <action application="bridge" data="${sofia_contact(${dialed_extension})}"/> </condition> </extension>FreeSWITCH 1.0.1 及更高版本可以通过在目录中将变量sip-allow-multiple-registrations设置为“false”来禁用每个用户的多个注册。在这种情况下，将不允许该单个用户使用多个注册。max-registrations-per-extension 可以设置分机最大注册数< param name="max-registrations-per-extension" value="1"/>更多信息请参见Sofia配置文件终止注册。您可以从 CLI 或任何接受 API 命令的地方终止注册，使用类似于以下的命令：sofia profile <profile_name_here> flush_inbound_reg [optional_callid]
命令呼叫远程 SIP 服务器上的分机基本形式：sofia/<profile>/<extension>@<remoteserver>示例 1：sofia/$${profile}/$1@example.org示例 2：sofia/foo/0@sipphone.com其中<profile>是 sofia.conf.xml 中定义的配置文件之一的名称。默认情况下，有一个配置文件定义为 name="$${domain}"，其中 $${domain} 变量在 freeswitch.xml 中定义，默认为 mydomain.com。因此，如果您没有更改这些配置文件并且正在拨打远程服务器上的分机，那么配置将是sofia/ mydomain.com / <extension> @ <remoteserver> 要列出所有定义的配置文件，请在 CLI 上键入sofia status 。呼叫本地注册的端点基本形式：sofia/<profile>/<extension>%<localserver>示例 1：sofia/$${profile}/$1%$${domain}示例 2：sofia/foo/101%192.168.1.1其中 foo 是 SIP 配置文件，101 是注册端点的用户 ID，192.168.1.1 是 FreeSWITCH 的 IP 地址。如果您的 SIP 配置文件名称设置为您的域，或者在配置文件中设置了域属性（例如，<profile name="internal" domain="$${domain}">），您可以使用以下内容：sofia/<profile>/<extension>并在拨打本地分机时放弃域。刷新和重新启动注册的端点您可以通过从控制台发出 flush_inbound_reg 命令来刷新注册或重新启动特定的注册端点。sofia profile <profile_name> flush_inbound_reg [<call_id>|<user@host>] [reboot]如果您省略 <call_id> 和/或 <user@host>，您将刷新/重新启动配置文件上的每个注册端点。 您还可以使用 check_sync 命令：sofia profile <profile_name> check_sync <call_id> | <user@domain>创建新配置如果您创建了一个新配置文件，您需要从控制台启动它：sofia profile <new_profile_name> start重新加载配置文件和网关您可以通过从控制台发出 killgw 命令来删除特定网关。如果使用 _all_ 作为网关名称，所有网关都将被杀死sofia profile <profile_name> killgw <gateway_name>重启网关您可以通过从控制台发出 killgw 命令，然后重新扫描配置文件来强制重启网关（适用于强制重新注册或类似操作）。在具有活动呼叫的配置文件上执行此操作是安全的。sofia profile <profile_name> killgw <gateway_name> sofia profile <profile_name> rescan添加/更改现有网关假设您在 /usr/local/freeswitch/conf/sip_profiles/external 目录中拥有所有网关，并且您刚刚创建了一个新条目。您可以通过从控制台发出 rescan reloadxml 命令来将新网关添加到 FreeSWITCH，如下例所示。这将加载新创建的网关，并且不会影响当前启动的任何呼叫。sofia profile external rescan reloadxml您现在意识到您搞砸了新网关中的 IP 地址，需要更改它。因此，您编辑网关文件并进行所需的任何更改。然后，您需要发出以下命令来销毁网关，然后让 FreeSWITCH 重新加载更改，同时影响当前启动的任何现有调用。sofia profile external killgw <gateway_name> sofia profile external rescan reloadxml查看 SIP 注册您可以通过从控制台运行以下命令来查看所有已注册的设备。sofia status profile <profile name> reg sofia status profile default reg sofia status profile outbound reg您还可以使用 xmlstatus 来以 XML 格式检索状态。如果您使用 mod_xml_rpc，这将特别有用。sofia xmlstatus profile <profile name> reg sofia xmlstatus profile default reg sofia xmlstatus profile outbound reg列出网关的状态对于服务中的网关：sofia profile <profile> gwlist up对于停止服务的网关：sofia profile <profile> gwlist down查看网关中的变量要检索入站变量的值：sofia_gateway_data <网关名称> ivar <名称>要检索出站变量的值：sofia_gateway_data <网关名称> ovar <名称>要检索任一用途的值：sofia_gateway_data <网关名称> var <名称>这首先检查入站变量，然后在没有匹配的入站时检查出站变量。查看用户状态数据显示来自已注册设备的状态数据，如服务器所见sofia_presence_data [list|status|rpid|user_agent] [profile/]<user>@domain例：sofia_presence_data list */2005 status|rpid|user_agent|network_ip|network_port Away|away|Bria 3 release 3.5.1 stamp 69738|192.168.20.150|21368 +OK 您可以在拨号方案中使用此值，例如<extension name="12005"> <condition field="destination_number" expression="^(12005)$" require-nested="false"> <condition field="${sofia_presence_data status */2005@${domain}}" expression="^(Busy)$"> <action application="playback" data="ivr/8000/ivr-user_busy.wav"/> <action application="hangup"/> </condition> <action application="bridge" data="user/2005@${domain_name}"/> </condition> </extension>