<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[blog.dev4telco.mx]]></title><description><![CDATA[Toma el control de la comunicacion]]></description><link>http://blog.dev4telco.mx/</link><image><url>http://blog.dev4telco.mx/favicon.png</url><title>blog.dev4telco.mx</title><link>http://blog.dev4telco.mx/</link></image><generator>Ghost 5.14</generator><lastBuildDate>Mon, 11 May 2026 10:29:28 GMT</lastBuildDate><atom:link href="http://blog.dev4telco.mx/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[FreeSWITCH CDRs]]></title><description><![CDATA[<p>[video]</p><p>freeswitch cuenta con varios modulos para manejar los cdrs (call detail records) y registrar todas las llamadas, en todos ellos es importante tener en cuenta que freeswitch maneja sesiones, y una llamada consta de una sesion de entrada y una de salida, comunmente conocidas como leg-a y leg-b. por</p>]]></description><link>http://blog.dev4telco.mx/freeswitch-cdrs/</link><guid isPermaLink="false">66ed79e40783cd00016fc464</guid><dc:creator><![CDATA[dev4telco]]></dc:creator><pubDate>Fri, 20 Sep 2024 14:30:15 GMT</pubDate><content:encoded><![CDATA[<p>[video]</p><p>freeswitch cuenta con varios modulos para manejar los cdrs (call detail records) y registrar todas las llamadas, en todos ellos es importante tener en cuenta que freeswitch maneja sesiones, y una llamada consta de una sesion de entrada y una de salida, comunmente conocidas como leg-a y leg-b. por default solo se almacena el leg-b, per0 se puede configurar que se almacenen ambos legs.</p><p></p><p>Por esto es una buena opcion segmentar o particionar, un solo equipo de freeswitch entre varios clientes.</p><h3 id="csv">CSV</h3><p>Para activar los cdrs en formato csv es necesario cargar el modulo.</p><pre><code class="language-fs_cli">freeswitch@dev4fs&gt; load mod_cdr_csv</code></pre><p>Previo a esto configuramos el modulo de la siguiente manera:</p><pre><code class="language-xml">&lt;configuration name=&quot;cdr_csv.conf&quot; description=&quot;CDR CSV Format&quot;&gt;
  &lt;settings&gt;
    &lt;param name=&quot;default-template&quot; value=&quot;example&quot;/&gt;
    &lt;param name=&quot;rotate-on-hup&quot; value=&quot;true&quot;/&gt;
    &lt;param name=&quot;legs&quot; value=&quot;ab&quot;/&gt;
  &lt;/settings&gt;
  &lt;templates&gt;
    &lt;template name=&quot;example&quot;&gt;&quot;${caller_id_name}&quot;,&quot;${caller_id_number}&quot;,&quot;${destination_number}&quot;,&quot;${context}&quot;,&quot;${start_stamp}&quot;,&quot;${answer_stamp}&quot;,&quot;${end_stamp}&quot;,&quot;${duration}&quot;,&quot;${billsec}&quot;,&quot;${hangup_cause}&quot;,&quot;${uuid}&quot;,&quot;${bleg_uuid}&quot;,&quot;${accountcode}&quot;,&quot;${read_codec}&quot;,&quot;${write_codec}&quot;&lt;/template&gt;
    &lt;/templates&gt;
&lt;/configuration&gt;</code></pre><h3 id="xml">XML</h3><p>Para activar los cdrs en formato xml es necesario cargar el modulo.</p><pre><code class="language-fs_cli">freeswitch@dev4fs&gt; load mod_xml_cdr</code></pre><p>Previo a esto configuramos el modulo de la siguiente manera:</p><pre><code class="language-xml">&lt;configuration name=&quot;xml_cdr.conf&quot; description=&quot;XML CDR logger&quot;&gt;
  &lt;settings&gt;
    &lt;param name=&quot;log-dir&quot; value=&quot;&quot;/&gt;
    &lt;param name=&quot;log-b-leg&quot; value=&quot;true&quot;/&gt;
    &lt;param name=&quot;prefix-a-leg&quot; value=&quot;true&quot;/&gt;
    &lt;param name=&quot;encode&quot; value=&quot;true&quot;/&gt;
  &lt;/settings&gt;
&lt;/configuration&gt;</code></pre><h3 id="json">JSON</h3><p>Para activar los cdrs en formato json es necesario cargar el modulo.</p><pre><code class="language-fs_cli">freeswitch@dev4fs&gt; load mod_json_cdr</code></pre><p>Previo a esto configuramos el modulo de la siguiente manera:</p><pre><code class="language-xml">&lt;configuration name=&quot;json_cdr.conf&quot; description=&quot;JSON CDR&quot;&gt;
  &lt;settings&gt;
    &lt;param name=&quot;log-b-leg&quot; value=&quot;true&quot;/&gt;
    &lt;param name=&quot;prefix-a-leg&quot; value=&quot;false&quot;/&gt;
    &lt;param name=&quot;encode-values&quot; value=&quot;true&quot;/&gt;
    &lt;param name=&quot;log-http-and-disk&quot; value=&quot;true&quot;/&gt;
    &lt;param name=&quot;log-dir&quot; value=&quot;&quot;/&gt;
    &lt;param name=&quot;rotate&quot; value=&quot;false&quot;/&gt;
    &lt;param name=&quot;url&quot; value=&quot;&quot;/&gt;
    &lt;param name=&quot;auth-scheme&quot; value=&quot;basic&quot;/&gt;
    &lt;param name=&quot;cred&quot; value=&quot;string&quot;/&gt;
    &lt;param name=&quot;encode&quot; value=&quot;base64|true|false&quot;/&gt;
    &lt;param name=&quot;retries&quot; value=&quot;0&quot;/&gt;
    &lt;param name=&quot;delay&quot; value=&quot;5000&quot;/&gt;
    &lt;param name=&quot;disable-100-continue&quot; value=&quot;false&quot;/&gt;
    &lt;param name=&quot;err-log-dir&quot; value=&quot;&quot;/&gt;
    &lt;param name=&quot;ssl-key-path&quot; value=&quot;&quot;/&gt;
    &lt;param name=&quot;ssl-key-password&quot; value=&quot;&quot;/&gt;
    &lt;param name=&quot;ssl-version&quot; value=&quot;&quot;/&gt;
    &lt;param name=&quot;enable-ssl-verifyhost&quot; value=&quot;false&quot;/&gt;
    &lt;param name=&quot;ssl-cert-path&quot; value=&quot;&quot;/&gt;
    &lt;param name=&quot;enable-cacert-check&quot; value=&quot;false&quot;/&gt;
    &lt;param name=&quot;ssl-cacert-file&quot; value=&quot;&quot;/&gt;
  &lt;/settings&gt;
&lt;/configuration&gt;</code></pre><h3 id="sqllite">SQLlite</h3><p>Para que freeswitch almacene los cdrs dentro de una base de datos sqllite cargamos el modulo:</p><pre><code class="language-fs_cli">freeswitch@dev4fs&gt; load mod_cdr_sqlite</code></pre><p>Previo a esto configuramos el modulo de la siguiente manera:</p><pre><code class="language-xml">&lt;configuration name=&quot;cdr_sqlite.conf&quot; description=&quot;SQLite CDR&quot;&gt;
  &lt;settings&gt;
    &lt;param name=&quot;dev4-freeswitch&quot; value=&quot;cdr&quot;/&gt;
    &lt;param name=&quot;db-table&quot; value=&quot;cdr&quot;/&gt;
    &lt;param name=&quot;legs&quot; value=&quot;ab&quot;/&gt;
    &lt;param name=&quot;default-template&quot; value=&quot;example&quot;/&gt;
    &lt;param name=&quot;debug&quot; value=&quot;true&quot;/&gt;
  &lt;/settings&gt;
  &lt;templates&gt;
    &lt;template name=&quot;example&quot;&gt;&quot;${caller_id_name}&quot;,&quot;${caller_id_number}&quot;,&quot;${destination_number}&quot;,&quot;${context}&quot;,&quot;${start_stamp}&quot;,&quot;${answer_stamp}&quot;,&quot;${end_stamp}&quot;,${duration},${billsec},&quot;${hangup_cause}&quot;,&quot;${uuid}&quot;,&quot;${bleg_uuid}&quot;,&quot;${accountcode}&quot;&lt;/template&gt;
  &lt;/templates&gt;
&lt;/configuration&gt;</code></pre><h3 id="mongodb">Mongodb</h3><p>Para que freeswitch almacene los cdrs dentro de una base de datos mongodb cargamos el modulo:</p><pre><code class="language-fs_cli">freeswitch@dev4fs&gt; load mod_cdr_mongodb</code></pre><p>Previo a esto configuramos el modulo de la siguiente manera:</p><pre><code class="language-xml">&lt;configuration name=&quot;cdr_mongodb.conf&quot; description=&quot;MongoDB CDR logger&quot;&gt;
  &lt;settings&gt;
    &lt;param name=&quot;host&quot; value=&quot;127.0.0.1&quot;/&gt;
    &lt;param name=&quot;port&quot; value=&quot;27017&quot;/&gt;
    &lt;param name=&quot;namespace&quot; value=&quot;freeswitch.cdrs&quot;/&gt;
    &lt;param name=&quot;log-b-leg&quot; value=&quot;true&quot;/&gt;
  &lt;/settings&gt;
&lt;/configuration&gt;</code></pre><h3 id="conclusi%C3%B3n">Conclusi&#xF3;n</h3><p>Freeswitch cuenta con soporte para varios formatos y motores de base de datos para almacenar los cdrs, asi como tanbien nos permite customizar los campos/variables que queremos que se guarden, para mas informaci&#xF3;n se recomienda consultar la &#xA0;<a href="https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Examples/Multi-tenant_13173521/">documentacion oficial de freeswitch</a>.</p><hr><blockquote class="kg-blockquote-alt">Julio Carranza</blockquote>]]></content:encoded></item><item><title><![CDATA[FreeSWITCH multi-tenant]]></title><description><![CDATA[<p>[video]</p><p>Cuando tenemos varios clientes que envian poco trafico, es una buena idea colocarlos todos en el mismo equipo, el problema viene cuando queremos aplicar diferentes reglas de negocio para cada uno de ellos, se vuelve complicado el ruteo de llamadas y la separacion de trafico. pudiendo ocacionar problemas de</p>]]></description><link>http://blog.dev4telco.mx/freeswitch-multi-tenant/</link><guid isPermaLink="false">66d725710783cd00016fc32c</guid><dc:creator><![CDATA[dev4telco]]></dc:creator><pubDate>Sat, 14 Sep 2024 01:19:09 GMT</pubDate><content:encoded><![CDATA[<p>[video]</p><p>Cuando tenemos varios clientes que envian poco trafico, es una buena idea colocarlos todos en el mismo equipo, el problema viene cuando queremos aplicar diferentes reglas de negocio para cada uno de ellos, se vuelve complicado el ruteo de llamadas y la separacion de trafico. pudiendo ocacionar problemas de ruteo (y cobro) de trafico de diferentes clientes. </p><p>Por esto es una buena opcion segmentar o particionar, un solo equipo de freeswitch entre varios clientes.</p><h3 id="dominios">Dominios</h3><p>Para este ejemplo usaremos los siguientes subdominios.</p><pre><code class="language-xml">coca.dev4telco.mx
pepsi.dev4telco.mx</code></pre><h2 id="coca-directory">Coca Directory</h2><p>coca.dev4telco.mx.xml</p><pre><code class="language-xml">&lt;include&gt;
  &lt;domain name=&quot;coca.dev4telco.mx&quot;&gt;
    &lt;params&gt;
      &lt;param name=&quot;dial-string&quot; value=&quot;{^^:sip_invite_domain=${dialed_domain}:presence_id=${dialed_user}@${dialed_domain}}${sofia_contact(*/${dialed_user}@${dialed_domain})},${verto_contact(${dialed_user}@${dialed_domain})}&quot;/&gt;
      &lt;param name=&quot;jsonrpc-allowed-methods&quot; value=&quot;verto&quot;/&gt;
    &lt;/params&gt;

    &lt;variables&gt;
      &lt;variable name=&quot;record_stereo&quot; value=&quot;true&quot;/&gt;
      &lt;variable name=&quot;default_gateway&quot; value=&quot;$${default_provider}&quot;/&gt;
      &lt;variable name=&quot;default_areacode&quot; value=&quot;$${default_areacode}&quot;/&gt;
      &lt;variable name=&quot;transfer_fallback_extension&quot; value=&quot;operator&quot;/&gt;
      &lt;variable name=&quot;user_context&quot; value=&quot;coca.dev4telco.mx&quot;/&gt;
    &lt;/variables&gt;


    &lt;groups&gt;
      &lt;group name=&quot;coca.dev4telco.mx&quot;&gt;
	&lt;users&gt;
	  &lt;X-PRE-PROCESS cmd=&quot;include&quot; data=&quot;coca.dev4telco.mx/*.xml&quot;/&gt;
	&lt;/users&gt;
      &lt;/group&gt;
    &lt;/groups&gt;

  &lt;/domain&gt;
&lt;/include&gt;</code></pre><h2 id="pepsi-directory">Pepsi Directory</h2><p>/etc/freeswitch/directory# cat pepsi.dev4telco.mx.xml</p><pre><code class="language-xml">&lt;include&gt;
  &lt;domain name=&quot;pepsi.dev4telco.mx&quot;&gt;
    &lt;params&gt;
      &lt;param name=&quot;dial-string&quot; value=&quot;{^^:sip_invite_domain=${dialed_domain}:presence_id=${dialed_user}@${dialed_domain}}${sofia_contact(*/${dialed_user}@${dialed_domain})},${verto_contact(${dialed_user}@${dialed_domain})}&quot;/&gt;
      &lt;param name=&quot;jsonrpc-allowed-methods&quot; value=&quot;verto&quot;/&gt;
    &lt;/params&gt;

    &lt;variables&gt;
      &lt;variable name=&quot;record_stereo&quot; value=&quot;true&quot;/&gt;
      &lt;variable name=&quot;default_gateway&quot; value=&quot;$${default_provider}&quot;/&gt;
      &lt;variable name=&quot;default_areacode&quot; value=&quot;$${default_areacode}&quot;/&gt;
      &lt;variable name=&quot;transfer_fallback_extension&quot; value=&quot;operator&quot;/&gt;
      &lt;variable name=&quot;user_context&quot; value=&quot;pepsi.dev4telco.mx&quot;/&gt;
    &lt;/variables&gt;

    &lt;groups&gt;
      &lt;group name=&quot;pepsi.dev4telco.mx&quot;&gt;
	&lt;users&gt;
	  &lt;X-PRE-PROCESS cmd=&quot;include&quot; data=&quot;pepsi.dev4telco.mx/*.xml&quot;/&gt;
	&lt;/users&gt;
      &lt;/group&gt;
    &lt;/groups&gt;

  &lt;/domain&gt;
&lt;/include&gt;</code></pre><h3 id="usuarios-extensiones">Usuarios / extensiones</h3><p>/etc/freeswitch/autoload_configs/acl.conf.xml</p><pre><code class="language-xml">vane@coca.dev4telco.mx
vivi@coca.dev4telco.mx

angy@pepsi.dev4telco.mx
pame@pepsi.dev4telco.mx</code></pre><h2 id="extensiones-coca">Extensiones Coca</h2><p><a>vane@pepsi.dev4telco.mx</a></p><pre><code class="language-xml">&lt;include&gt;
  &lt;user id=&quot;vane&quot;&gt;
    &lt;params&gt;
      &lt;param name=&quot;password&quot; value=&quot;20240913&quot;/&gt;
      &lt;param name=&quot;vm-password&quot; value=&quot;1000&quot;/&gt;
    &lt;/params&gt;
    &lt;variables&gt;
      &lt;variable name=&quot;callgroup&quot; value=&quot;coca&quot;/&gt;
    &lt;/variables&gt;
  &lt;/user&gt;
&lt;/include&gt;</code></pre><p><br><a>vivi@pepsi.dev4telco.mx</a></p><pre><code class="language-xml">&lt;include&gt;
  &lt;user id=&quot;vivi&quot;&gt;
    &lt;params&gt;
      &lt;param name=&quot;password&quot; value=&quot;20240913&quot;/&gt;
      &lt;param name=&quot;vm-password&quot; value=&quot;1000&quot;/&gt;
    &lt;/params&gt;
    &lt;variables&gt;
      &lt;variable name=&quot;callgroup&quot; value=&quot;coca&quot;/&gt;
    &lt;/variables&gt;
  &lt;/user&gt;
&lt;/include&gt;</code></pre><h2 id="extensiones-pepsi">Extensiones Pepsi</h2><p><a>angy@pepsi.dev4telco.mx</a></p><pre><code class="language-xml">&lt;include&gt;
  &lt;user id=&quot;angy&quot;&gt;
    &lt;params&gt;
      &lt;param name=&quot;password&quot; value=&quot;20240913&quot;/&gt;
      &lt;param name=&quot;vm-password&quot; value=&quot;1000&quot;/&gt;
    &lt;/params&gt;
    &lt;variables&gt;
      &lt;variable name=&quot;callgroup&quot; value=&quot;pepsi&quot;/&gt;
    &lt;/variables&gt;
  &lt;/user&gt;
&lt;/include&gt;</code></pre><p><br><a>pame@pepsi.dev4telco.mx</a></p><pre><code class="language-xml">&lt;include&gt;
  &lt;user id=&quot;pame&quot;&gt;
    &lt;params&gt;
      &lt;param name=&quot;password&quot; value=&quot;20240913&quot;/&gt;
      &lt;param name=&quot;vm-password&quot; value=&quot;1000&quot;/&gt;
    &lt;/params&gt;
    &lt;variables&gt;
      &lt;variable name=&quot;callgroup&quot; value=&quot;pepsi&quot;/&gt;
    &lt;/variables&gt;
  &lt;/user&gt;
&lt;/include&gt;</code></pre><h2 id="sip-profile">SIP Profile</h2><p>asas</p><pre><code class="language-xml">&lt;profile name=&quot;trunk&quot;&gt;
  &lt;aliases&gt;
  &lt;/aliases&gt;
  &lt;gateways&gt;
  &lt;/gateways&gt;

  &lt;domains&gt;
    &lt;domain name=&quot;all&quot; alias=&quot;true&quot; parse=&quot;false&quot;/&gt;
  &lt;/domains&gt;

  &lt;settings&gt;
    &lt;param name=&quot;debug&quot; value=&quot;0&quot;/&gt;
    &lt;param name=&quot;sip-trace&quot; value=&quot;no&quot;/&gt;
    &lt;param name=&quot;sip-capture&quot; value=&quot;no&quot;/&gt;
    &lt;param name=&quot;watchdog-enabled&quot; value=&quot;no&quot;/&gt;
    &lt;param name=&quot;watchdog-step-timeout&quot; value=&quot;30000&quot;/&gt;
    &lt;param name=&quot;watchdog-event-timeout&quot; value=&quot;30000&quot;/&gt;
    &lt;param name=&quot;log-auth-failures&quot; value=&quot;false&quot;/&gt;
    &lt;param name=&quot;forward-unsolicited-mwi-notify&quot; value=&quot;false&quot;/&gt;
    &lt;param name=&quot;context&quot; value=&quot;dp_pepsicola&quot;/&gt;
    &lt;param name=&quot;rfc2833-pt&quot; value=&quot;101&quot;/&gt;
    &lt;param name=&quot;sip-port&quot; value=&quot;$${internal_sip_port}&quot;/&gt;
    &lt;param name=&quot;dialplan&quot; value=&quot;XML&quot;/&gt;
    &lt;param name=&quot;dtmf-duration&quot; value=&quot;2000&quot;/&gt;
    &lt;param name=&quot;inbound-codec-prefs&quot; value=&quot;$${global_codec_prefs}&quot;/&gt;
    &lt;param name=&quot;outbound-codec-prefs&quot; value=&quot;$${global_codec_prefs}&quot;/&gt;
    &lt;param name=&quot;rtp-timer-name&quot; value=&quot;soft&quot;/&gt;
    &lt;param name=&quot;rtp-ip&quot; value=&quot;192.168.5.234&quot;/&gt;
    &lt;param name=&quot;sip-ip&quot; value=&quot;192.168.5.234&quot;/&gt;
    &lt;param name=&quot;hold-music&quot; value=&quot;$${hold_music}&quot;/&gt;
    &lt;param name=&quot;apply-nat-acl&quot; value=&quot;nat.auto&quot;/&gt;
    &lt;param name=&quot;apply-inbound-acl&quot; value=&quot;domains&quot;/&gt;
    &lt;param name=&quot;local-network-acl&quot; value=&quot;localnet.auto&quot;/&gt;
    &lt;param name=&quot;record-path&quot; value=&quot;$${recordings_dir}&quot;/&gt;
    &lt;param name=&quot;record-template&quot; value=&quot;${caller_id_number}.${target_domain}.${strftime(%Y-%m-%d-%H-%M-%S)}.wav&quot;/&gt;
    &lt;param name=&quot;manage-presence&quot; value=&quot;true&quot;/&gt;
    &lt;param name=&quot;presence-hosts&quot; value=&quot;$${domain},192.168.5.234&quot;/&gt;
    &lt;param name=&quot;presence-privacy&quot; value=&quot;$${presence_privacy}&quot;/&gt;
    &lt;param name=&quot;inbound-codec-negotiation&quot; value=&quot;generous&quot;/&gt;
    &lt;param name=&quot;tls&quot; value=&quot;$${internal_ssl_enable}&quot;/&gt;
    &lt;param name=&quot;tls-only&quot; value=&quot;false&quot;/&gt;
    &lt;param name=&quot;tls-bind-params&quot; value=&quot;transport=tls&quot;/&gt;
    &lt;param name=&quot;tls-sip-port&quot; value=&quot;$${internal_tls_port}&quot;/&gt;
    &lt;param name=&quot;tls-passphrase&quot; value=&quot;&quot;/&gt;
    &lt;param name=&quot;tls-verify-date&quot; value=&quot;true&quot;/&gt;
    &lt;param name=&quot;tls-verify-policy&quot; value=&quot;none&quot;/&gt;
    &lt;param name=&quot;tls-verify-depth&quot; value=&quot;2&quot;/&gt;
    &lt;param name=&quot;tls-verify-in-subjects&quot; value=&quot;&quot;/&gt;
    &lt;param name=&quot;tls-version&quot; value=&quot;$${sip_tls_version}&quot;/&gt;
    &lt;param name=&quot;tls-ciphers&quot; value=&quot;$${sip_tls_ciphers}&quot;/&gt;
    &lt;param name=&quot;inbound-late-negotiation&quot; value=&quot;true&quot;/&gt;
    &lt;param name=&quot;nonce-ttl&quot; value=&quot;60&quot;/&gt;
    &lt;param name=&quot;auth-calls&quot; value=&quot;$${internal_auth_calls}&quot;/&gt;
    &lt;param name=&quot;auth-subscriptions&quot; value=&quot;true&quot;/&gt;
    &lt;param name=&quot;inbound-reg-force-matching-username&quot; value=&quot;true&quot;/&gt;
    &lt;param name=&quot;auth-all-packets&quot; value=&quot;false&quot;/&gt;
    &lt;param name=&quot;ext-rtp-ip&quot; value=&quot;192.168.5.234&quot;/&gt;
    &lt;param name=&quot;ext-sip-ip&quot; value=&quot;192.168.5.234&quot;/&gt;
    &lt;param name=&quot;rtp-timeout-sec&quot; value=&quot;300&quot;/&gt;
    &lt;param name=&quot;rtp-hold-timeout-sec&quot; value=&quot;1800&quot;/&gt;
    &lt;!--
    &lt;param name=&quot;force-register-domain&quot; value=&quot;$${domain}&quot;/&gt;
    &lt;param name=&quot;force-subscription-domain&quot; value=&quot;$${domain}&quot;/&gt;
    &lt;param name=&quot;force-register-db-domain&quot; value=&quot;$${domain}&quot;/&gt;
    --&gt;
    &lt;param name=&quot;ws-binding&quot;  value=&quot;:5066&quot;/&gt;
    &lt;param name=&quot;wss-binding&quot; value=&quot;:7443&quot;/&gt;
    &lt;param name=&quot;challenge-realm&quot; value=&quot;auto_from&quot;/&gt;
  &lt;/settings&gt;
&lt;/profile&gt;</code></pre><h3 id="coca-dialplan">Coca Dialplan</h3><pre><code class="language-xml">&lt;include&gt;
  &lt;context name=&quot;coca.dev4telco.mx&quot;&gt;
  &lt;/context&gt;
&lt;/include&gt;</code></pre><h3 id="pepsi-dialplan">Pepsi Dialplan</h3><pre><code class="language-xml">&lt;include&gt;
  &lt;context name=&quot;pepsi.dev4telco.mx&quot;&gt;
  &lt;/context&gt;
&lt;/include&gt;</code></pre><h3 id="conclusi%C3%B3n">Conclusi&#xF3;n</h3><p>Freeswitch nos permite separar el trafico por dominios, esto facilita la aplicaciones de reglas de ruteo y separacion de trafico en equipos compartidos por varios clientes, para mas informaci&#xF3;n se recomienda consultar la &#xA0;<a href="https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Examples/Multi-tenant_13173521/">documentacion oficial de freeswitch</a>.</p><hr><blockquote class="kg-blockquote-alt">Julio Carranza</blockquote>]]></content:encoded></item><item><title><![CDATA[FreeSWITCH endpoints]]></title><description><![CDATA[<p>[video]</p><p>El trafico entrante a freeswitch puede hacerse por ip o por medio de registro, en cuanto al trafico saliente puede enviarese directamente a la ip del equipo mediante dialplan o bien por gw, este gw puede ser con o sin registro. cabe mencionar que hay mas de una forma</p>]]></description><link>http://blog.dev4telco.mx/freeswitch-endpoints/</link><guid isPermaLink="false">66d5f4550783cd00016fc275</guid><dc:creator><![CDATA[dev4telco]]></dc:creator><pubDate>Sat, 07 Sep 2024 02:26:28 GMT</pubDate><content:encoded><![CDATA[<p>[video]</p><p>El trafico entrante a freeswitch puede hacerse por ip o por medio de registro, en cuanto al trafico saliente puede enviarese directamente a la ip del equipo mediante dialplan o bien por gw, este gw puede ser con o sin registro. cabe mencionar que hay mas de una forma de gestionar el trafico entrante / saliente, esta es solo una guia de referencia de un manera de hacerlo. </p><h3 id="register">Register</h3><p>Para permitir el registro de extensiones creamos el archivo de la extension /etc/freeswitch/directory/default/9999.xml prestando especial atenci&#xF3;n al id y password que corresponden a las credenciales de nuestra extension:</p><pre><code class="language-xml">&lt;user id=&quot;9999&quot;&gt;
  &lt;params&gt;
    &lt;param name=&quot;password&quot; value=&quot;secret&quot;/&gt;
    &lt;param name=&quot;vm-password&quot; value=&quot;9999&quot;/&gt;
  &lt;/params&gt;
  &lt;variables&gt;
    &lt;variable name=&quot;toll_allow&quot; value=&quot;domestic,international,local&quot;/&gt;
    &lt;variable name=&quot;accountcode&quot; value=&quot;9999&quot;/&gt;
    &lt;variable name=&quot;user_context&quot; value=&quot;default&quot;/&gt;
    &lt;variable name=&quot;effective_caller_id_name&quot; value=&quot;User&quot;/&gt;
    &lt;variable name=&quot;effective_caller_id_number&quot; value=&quot;9999&quot;/&gt;
    &lt;variable name=&quot;callgroup&quot; value=&quot;core&quot;/&gt;
    &lt;variable name=&quot;max_calls&quot; value=&quot;2&quot;/&gt;
  &lt;/variables&gt;
&lt;/user&gt;
</code></pre><p>para aplicar los cambios hacemos un reload: </p><pre><code class="language-bash">fs_cli -x reloadxml</code></pre><h3 id="acl">ACL</h3><p>Para permitir el trafico entrante desde un peer/ip agregamos la ip o segmento al archivo /etc/freeswitch/autoload_configs/acl.conf.xml</p><pre><code class="language-xml">&lt;list name=&quot;domains&quot; default=&quot;deny&quot;&gt;
  &lt;node type=&quot;allow&quot; domain=&quot;$${domain}&quot;/&gt;
  &lt;node type=&quot;allow&quot; cidr=&quot;2.2.2.2/32&quot;/&gt;
&lt;/list&gt;</code></pre><p>para aplicar los cambios hacemos un reload del modulo acl: </p><pre><code class="language-bash">fs_cli -x reloadacl</code></pre><h3 id="sip-profile">SIP Profile</h3><p>El sip profile se asocia a una direccion ip-puerto del host, podemos tener multiples sip profiles. para esto basta con agregar nuestro archivo a la ruta: /etc/freeswitch/sip_profiles/troncal.xml</p><pre><code class="language-xml">&lt;profile name=&quot;troncal&quot;&gt;
  &lt;aliases&gt;
  &lt;/aliases&gt;

  &lt;gateways&gt;
    &lt;X-PRE-PROCESS cmd=&quot;include&quot; data=&quot;troncal/*.xml&quot;/&gt;
  &lt;/gateways&gt;

  &lt;domains&gt;
    &lt;domain name=&quot;all&quot; alias=&quot;true&quot; parse=&quot;false&quot;/&gt;
  &lt;/domains&gt;

  &lt;settings&gt;
    &lt;param name=&quot;debug&quot; value=&quot;0&quot;/&gt;
    &lt;param name=&quot;sip-trace&quot; value=&quot;yes&quot;/&gt;
    &lt;param name=&quot;sip-capture&quot; value=&quot;yes&quot;/&gt;
    &lt;param name=&quot;watchdog-enabled&quot; value=&quot;no&quot;/&gt;
    &lt;param name=&quot;watchdog-step-timeout&quot; value=&quot;30000&quot;/&gt;
    &lt;param name=&quot;watchdog-event-timeout&quot; value=&quot;30000&quot;/&gt;
    &lt;param name=&quot;log-auth-failures&quot; value=&quot;true&quot;/&gt;
    &lt;param name=&quot;forward-unsolicited-mwi-notify&quot; value=&quot;false&quot;/&gt;
    &lt;param name=&quot;context&quot; value=&quot;public&quot;/&gt;
    &lt;param name=&quot;rfc2833-pt&quot; value=&quot;101&quot;/&gt;
    &lt;param name=&quot;sip-port&quot; value=&quot;5060&quot;/&gt;
    &lt;param name=&quot;dialplan&quot; value=&quot;XML&quot;/&gt;
    &lt;param name=&quot;dtmf-duration&quot; value=&quot;2000&quot;/&gt;
    &lt;param name=&quot;inbound-codec-prefs&quot; value=&quot;$${global_codec_prefs}&quot;/&gt;
    &lt;param name=&quot;outbound-codec-prefs&quot; value=&quot;$${global_codec_prefs}&quot;/&gt;
    &lt;param name=&quot;rtp-timer-name&quot; value=&quot;soft&quot;/&gt;
    &lt;param name=&quot;rtp-ip&quot; value=&quot;2.2.2.2&quot;/&gt;
    &lt;param name=&quot;sip-ip&quot; value=&quot;2.2.2.2&quot;/&gt;
    &lt;param name=&quot;hold-music&quot; value=&quot;$${hold_music}&quot;/&gt;
    &lt;param name=&quot;apply-nat-acl&quot; value=&quot;nat.auto&quot;/&gt;
    &lt;param name=&quot;apply-inbound-acl&quot; value=&quot;domains&quot;/&gt;
    &lt;param name=&quot;local-network-acl&quot; value=&quot;localnet.auto&quot;/&gt;
    &lt;param name=&quot;record-path&quot; value=&quot;$${recordings_dir}&quot;/&gt;
    &lt;param name=&quot;record-template&quot; value=&quot;${caller_id_number}.${target_domain}.${strftime(%Y-%m-%d-%H-%M-%S)}.wav&quot;/&gt;
    &lt;param name=&quot;manage-presence&quot; value=&quot;true&quot;/&gt;
    &lt;param name=&quot;presence-hosts&quot; value=&quot;$${domain},2.2.2.2&quot;/&gt;
    &lt;param name=&quot;presence-privacy&quot; value=&quot;$${presence_privacy}&quot;/&gt;
    &lt;param name=&quot;inbound-codec-negotiation&quot; value=&quot;generous&quot;/&gt;
    &lt;param name=&quot;tls&quot; value=&quot;$${internal_ssl_enable}&quot;/&gt;
    &lt;param name=&quot;tls-only&quot; value=&quot;false&quot;/&gt;
    &lt;param name=&quot;tls-bind-params&quot; value=&quot;transport=tls&quot;/&gt;
    &lt;param name=&quot;tls-sip-port&quot; value=&quot;5061&quot;/&gt;
    &lt;param name=&quot;tls-passphrase&quot; value=&quot;&quot;/&gt;
    &lt;param name=&quot;tls-verify-date&quot; value=&quot;true&quot;/&gt;
    &lt;param name=&quot;tls-verify-policy&quot; value=&quot;none&quot;/&gt;
    &lt;param name=&quot;tls-verify-depth&quot; value=&quot;2&quot;/&gt;
    &lt;param name=&quot;tls-verify-in-subjects&quot; value=&quot;&quot;/&gt;
    &lt;param name=&quot;tls-version&quot; value=&quot;$${sip_tls_version}&quot;/&gt;
    &lt;param name=&quot;tls-ciphers&quot; value=&quot;$${sip_tls_ciphers}&quot;/&gt;
    &lt;param name=&quot;inbound-late-negotiation&quot; value=&quot;true&quot;/&gt;
    &lt;param name=&quot;inbound-zrtp-passthru&quot; value=&quot;true&quot;/&gt;
    &lt;param name=&quot;nonce-ttl&quot; value=&quot;60&quot;/&gt;
    &lt;param name=&quot;auth-calls&quot; value=&quot;$${internal_auth_calls}&quot;/&gt;
    &lt;param name=&quot;inbound-reg-force-matching-username&quot; value=&quot;true&quot;/&gt;
    &lt;param name=&quot;auth-all-packets&quot; value=&quot;false&quot;/&gt;
    &lt;param name=&quot;ext-rtp-ip&quot; value=&quot;2.2.2.2&quot;/&gt;
    &lt;param name=&quot;ext-sip-ip&quot; value=&quot;2.2.2.2&quot;/&gt;
    &lt;param name=&quot;rtp-timeout-sec&quot; value=&quot;300&quot;/&gt;
    &lt;param name=&quot;rtp-hold-timeout-sec&quot; value=&quot;1800&quot;/&gt;
    &lt;param name=&quot;force-register-domain&quot; value=&quot;$${domain}&quot;/&gt;
    &lt;param name=&quot;force-subscription-domain&quot; value=&quot;$${domain}&quot;/&gt;
    &lt;param name=&quot;force-register-db-domain&quot; value=&quot;$${domain}&quot;/&gt;
    &lt;param name=&quot;ws-binding&quot;  value=&quot;:5066&quot;/&gt;
    &lt;param name=&quot;wss-binding&quot; value=&quot;:7443&quot;/&gt;
    &lt;param name=&quot;challenge-realm&quot; value=&quot;auto_from&quot;/&gt;
  &lt;/settings&gt;
&lt;/profile&gt;</code></pre><p>para que el servicio tome la nueva configuraci&#xF3;n, es necesario reiniciar el servicio de freeswitch </p><pre><code class="language-bash">systemctl restart freeswitch</code></pre><h3 id="gateways">Gateways</h3><p>Para agregar un gw, basta con agregarlo al directorio que corresponde de acuerdo al sip propfile/troncal donde deseamos agregarlo, es decir, si nuestro sip profile se llama troncal, hay que agregar el siguiente archivo en /etc/freeswitch/sip_profiles/troncal/gw1.xml</p><pre><code class="language-xml">&lt;gateway name=&quot;gw1&quot;&gt;
  &lt;param name=&quot;realm&quot; value=&quot;asterisk.com&quot;/&gt;
  &lt;!--&lt;param name=&quot;username&quot; value=&quot;usuario&quot;/&gt;--&gt;
  &lt;!--&lt;param name=&quot;password&quot; value=&quot;contrasena&quot;/&gt;--&gt;
  &lt;param name=&quot;register&quot; value=&quot;false&quot;/&gt;
  &lt;param name=&quot;ping&quot; value=&quot;25&quot;/&gt;
&lt;/gateway&gt;
</code></pre><h3 id="conclusi%C3%B3n">Conclusi&#xF3;n</h3><p>Existen varios metodos para recibir y enviar trafico a travez de freeswitch, &#xA0;para mas informaci&#xF3;n sobre endpoints, acl, registro, etc. consultar la &#xA0;<a href="https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Directory/">documentacion oficial de freeswitch</a>.</p><hr><blockquote class="kg-blockquote-alt">Julio Carranza</blockquote>]]></content:encoded></item><item><title><![CDATA[FreeSWITCH dialplan snippets]]></title><description><![CDATA[<p>[video]</p><p>El m&#xF3;dulo de dialplan nos permite configurar diferentes reglas para el tratamiento de las llamadas entrantes y salientes. A continuaci&#xF3;n se muestran algunos de los casos mas comunes que pueden servir como referencia y punto de partida para casos mas complejos en el manejo de</p>]]></description><link>http://blog.dev4telco.mx/freeswitch-dialplan-snippets/</link><guid isPermaLink="false">66cfe5fe0783cd00016fc148</guid><category><![CDATA[freeswitch]]></category><category><![CDATA[dialplan]]></category><category><![CDATA[snippet]]></category><category><![CDATA[lua]]></category><dc:creator><![CDATA[dev4telco]]></dc:creator><pubDate>Sat, 31 Aug 2024 02:03:19 GMT</pubDate><content:encoded><![CDATA[<p>[video]</p><p>El m&#xF3;dulo de dialplan nos permite configurar diferentes reglas para el tratamiento de las llamadas entrantes y salientes. A continuaci&#xF3;n se muestran algunos de los casos mas comunes que pueden servir como referencia y punto de partida para casos mas complejos en el manejo de traslaciones / plan de marcaci&#xF3;n.</p><h3 id="expresi%C3%B3n-regular-para-n%C3%BAmero-marcado">Expresi&#xF3;n regular para n&#xFA;mero marcado </h3><pre><code class="language-xml">&lt;extension name=&quot;by-dialed&quot;&gt;
  &lt;condition field=&quot;destination_number&quot; expression=&quot;^(+52)(\d+)$&quot;&gt;
    &lt;action application=&quot;bridge&quot; data=&quot;{}sofia/external/1000@2.2.2.2&quot;/&gt;
  &lt;/condition&gt;
&lt;/extension&gt;</code></pre><h3 id="horario-de-marcaci%C3%B3n">Horario de marcaci&#xF3;n</h3><pre><code class="language-xml">&lt;extension name=&quot;by-hour&quot; continue=&quot;true&quot;&gt;
  &lt;condition wday=&quot;1-7&quot; minute-of-day=&quot;560-1261&quot; break=&quot;never&quot;&gt;
    &lt;action application=&quot;set&quot; data=&quot;status=open&quot; inline=&quot;true&quot;/&gt;
    &lt;anti-action application=&quot;set&quot; data=&quot;status=closed&quot; inline=&quot;true&quot;/&gt;
  &lt;/condition&gt;
&lt;/extension&gt;

&lt;extension name=&quot;inbound&quot;&gt;
  &lt;condition field=&quot;destination_number&quot; expression=&quot;^(2020)$&quot;&gt;
    &lt;action application=&quot;execute_extension&quot; data=&quot;2020_${status}&quot;/&gt;
  &lt;/condition&gt;
&lt;/extension&gt;

&lt;extension name=&quot;open-office&quot;&gt;
  &lt;condition field=&quot;destination_number&quot; expression=&quot;^(2020)_open$&quot;&gt;
    &lt;action application=&quot;answer&quot;/&gt;
    &lt;action application=&quot;playback&quot; data=&quot;/audio/welcome.wav&quot;/&gt;
  &lt;/condition&gt;
&lt;/extension&gt;

&lt;extension name=&quot;closed-office&quot;&gt;
  &lt;condition field=&quot;destination_number&quot; expression=&quot;^(2020)_closed$&quot;&gt;
    &lt;action application=&quot;hangup&quot; data=&quot;GATEWAY_DOWN&quot;/&gt;
  &lt;/condition&gt;
&lt;/extension&gt;</code></pre><h3 id="validaci%C3%B3n-de-ip-origen">Validaci&#xF3;n de IP origen</h3><pre><code class="language-xml">&lt;extension name=&quot;moh long calll duration&quot;&gt;
  &lt;condition field=&quot;network_addr&quot; expression=&quot;^2\.2\.2\.2$&quot;/&gt;
  &lt;condition field=&quot;destination_number&quot; expression=&quot;^2021(\d+)$&quot;&gt;
    &lt;action application=&quot;answer&quot;/&gt;
     &lt;action application=&quot;park&quot;/&gt;
  &lt;/condition&gt;
&lt;/extension&gt;</code></pre><h3 id="forzar-n%C3%BAmero-de-origen">Forzar n&#xFA;mero de origen</h3><pre><code class="language-xml">&lt;action application=&quot;bridge&quot; data=&quot;{sip_invite_from_uri=&lt;sip:+525553259000@2.2.2.2&gt;}sofia/external/$1@2.2.2.2&quot;/&gt;
</code></pre><h3 id="forzar-la-lista-de-codecs">Forzar la lista de codecs</h3><pre><code class="language-xml">&lt;action application=&quot;bridge&quot; data=&quot;{absolute_codec_string=&apos;PCMU,PCMA,G729&apos;}sofia/external/$1@2.2.2.2&quot;/&gt;
</code></pre><h3 id="grabaci%C3%B3n-de-llamadas">Grabaci&#xF3;n de llamadas</h3><pre><code class="language-xml">&lt;extension name=&quot;Grabar llamada&quot;&gt;
  &lt;condition field=&quot;destination_number&quot; expression=&quot;^2022(\d+)$&quot;&gt;
    &lt;action application=&quot;set&quot; data=&quot;RECORD_TITLE=Titulo&quot;/&gt;
    &lt;action application=&quot;set&quot; data=&quot;RECORD_SOFTWARE=FreeSWITCH&quot;/&gt;
    &lt;action application=&quot;set&quot; data=&quot;RECORD_STEREO=true&quot;/&gt;
    &lt;action application=&quot;record_session&quot; data=&quot;/recordings/${strftime(%Y-%m-%d-%H-%M-%S)}_${destination_number}_${caller_id_number}.wav&quot;/&gt;
  &lt;/condition&gt;
&lt;/extension&gt;</code></pre><h3 id="ejecuci%C3%B3n-de-scripts-otros-lenguajes">Ejecuci&#xF3;n de scripts (otros lenguajes)</h3><pre><code class="language-xml">&lt;extension name=&quot;script-execution&quot;&gt;
  &lt;condition field=&quot;destination_number&quot; expression=&quot;^(2023)(\d+)$&quot;&gt;
    &lt;action application=&quot;set&quot; data=&quot;variable=valor&quot;/&gt;
    &lt;action application=&quot;lua&quot; data=&quot;/scripts/example.lua $1 $2 &quot;/&gt;
  &lt;/condition&gt;
&lt;/extension&gt;</code></pre><h3 id="conclusi%C3%B3n">Conclusi&#xF3;n</h3><p>Estos son algunos ejemplos de lo que se puede lograr configurando el dialplan, &#xA0;para mas informaci&#xF3;n se recomienda consultar la &#xA0;<a href="https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Dialplan/">documentacion oficial de freeswitch</a>.</p><hr><blockquote class="kg-blockquote-alt">Julio Carranza</blockquote>]]></content:encoded></item><item><title><![CDATA[Instalación FreeSWITCH en Debian 12 (bookworm)]]></title><description><![CDATA[<p>[video]</p><h1 id="1-preparativos">1. Preparativos</h1><h3 id="11-obtner-token">1.1 Obtner token</h3><p>Para realizar la instalacion de freeswitch se requiere un token, mismo que se puede obtener creando una cuenta gratuita en la pagina de signalwire.</p><p>Una vez que obtenemos el token, lo seteamos en una variable de ambiente</p><pre><code class="language-bash">export TOKEN=XXXXXXXXXXXXXXXXXXXXXX</code></pre><h3 id="12-instalar-dependencias-basicas">1.2 Instalar</h3>]]></description><link>http://blog.dev4telco.mx/instalacion-freeswitch-en-debian12/</link><guid isPermaLink="false">66c6cedc0783cd00016fbf10</guid><dc:creator><![CDATA[dev4telco]]></dc:creator><pubDate>Thu, 22 Aug 2024 06:40:57 GMT</pubDate><content:encoded><![CDATA[<p>[video]</p><h1 id="1-preparativos">1. Preparativos</h1><h3 id="11-obtner-token">1.1 Obtner token</h3><p>Para realizar la instalacion de freeswitch se requiere un token, mismo que se puede obtener creando una cuenta gratuita en la pagina de signalwire.</p><p>Una vez que obtenemos el token, lo seteamos en una variable de ambiente</p><pre><code class="language-bash">export TOKEN=XXXXXXXXXXXXXXXXXXXXXX</code></pre><h3 id="12-instalar-dependencias-basicas">1.2 Instalar dependencias basicas</h3><p>Instalamos los paquetes necesarios previo a la instalaci&#xF3;n de freeswitch.</p><pre><code class="language-bash">apt-get update &amp;&amp; apt-get install -y gnupg2 wget lsb-release sngrep iproute2 net-tools less vim nano tcpdump cmake git</code></pre><h3 id="13-configurar-repositorios">1.3 Configurar repositorios</h3><p>Descargamos la llave <strong>gpg</strong> del repositorio de freeswitch </p><pre><code class="language-bash">wget --http-user=signbalwire \
--http-password=$TOKEN \
-O /usr/share/keyrings/signalwire-freeswitch-repo.gpg \
https://freeswitch.signalwire.com/repo/deb/debian-release/signalwire-freeswitch-repo.gpg</code></pre><p>Agregamos al archivo auth.conf nuestro TOKEN para que las descargas que hagamos con apt-get se autentiquen en el portal de signalwire</p><pre><code class="language-bash">echo &quot;machine freeswitch.signalwire.com login signalwire password $TOKEN&quot; &gt; /etc/apt/auth.conf</code></pre><p>Configuramos el repositorio freeswitch.list en nuestro directorio /etc/apt/sources.list.d/</p><pre><code class="language-bash">echo &quot;deb [signed-by=/usr/share/keyrings/signalwire-freeswitch-repo.gpg] https://freeswitch.signalwire.com/repo/deb/debian-release/ `lsb_release -sc` main&quot; &gt; /etc/apt/sources.list.d/freeswitch.list

echo &quot;deb-src [signed-by=/usr/share/keyrings/signalwire-freeswitch-repo.gpg] https://freeswitch.signalwire.com/repo/deb/debian-release/ `lsb_release -sc` main&quot; &gt;&gt; /etc/apt/sources.list.d/freeswitch.list</code></pre><h2 id="2-instalacion-de-freeswitch">2. Instalacion de FreeSWITCH</h2><h3 id="21-instalacion-de-dependencias">2.1 Instalacion de dependencias</h3><p>Instalamos todas las dependencias que requiere freeswitch</p><pre><code class="language-bash">apt-get update &amp;&amp; apt-get build-dep freeswitch -y</code></pre><h3 id="22-descarga-de-freeswitch">2.2 Descarga de FreeSWITCH</h3><p>Descargamos de github el c&#xF3;digo fuente de freeswitch</p><pre><code class="language-bash">git clone https://github.com/signalwire/freeswitch.git /usr/src/freeswitch
</code></pre><p>Nos desplazamos al directorio donde descargamos los fuentes, y &#xA0;configuramos nuestra instalaci&#xF3;n</p><pre><code class="language-bash">cd /usr/src/freeswitch \
&amp;&amp; git config pull.rebase true \
&amp;&amp; ./bootstrap.sh -j \
&amp;&amp; ./configure</code></pre><p>Compilamos e instalamos</p><pre><code class="language-bash">make &amp;&amp; make install</code></pre><h3 id="23-pos-instalaci%C3%B3n">2.3 Pos instalaci&#xF3;n</h3><p>Agregamos el grupo y usuario freeswitch</p><pre><code class="language-bash">groupadd freeswitch

adduser --quiet --system --home /usr/local/freeswitch --gecos &quot;FreeSWITCH&quot; --ingroup freeswitch freeswitch --disabled-password</code></pre><p>Otorgamos permisios y privilegios a los directorios</p><pre><code class="language-bash">chown -R freeswitch:freeswitch /usr/local/freeswitch/
chmod -R ug=rwX,o= /usr/local/freeswitch/
chmod -R u=rwx,g=rx /usr/local/freeswitch/bin/*</code></pre><p>Copiamos el archivo service y lo ponemos en el directorio systemd</p><pre><code class="language-bash">cp /usr/src/freeswitch/debian/freeswitch-systemd.freeswitch.service /etc/systemd/system/freeswitch.service

editar: /etc/systemd/system/freeswitch.service
PIDFile=/usr/local/freeswitch/run/freeswitch.pid</code></pre><p>Creamos los directorios requeridos</p><pre><code class="language-bash">mkdir /var/log/freeswitch
mkdir /var/lib/freeswitch
mkdir /var/run/freeswitch
mkdir /usr/share/freeswitch</code></pre><p>Y creamos las ligas simb&#xF3;licas a los directorios est&#xE1;ndar (etc, bin, sbin)</p><pre><code class="language-bash">
ln -s /usr/local/freeswitch/conf/ /etc/freeswitch
ln -s /usr/local/freeswitch/bin/freeswitch /usr/sbin/freeswitch
ln -s /usr/local/freeswitch/bin/freeswitch /usr/bin/freeswitch
ln -s /usr/local/freeswitch/bin/fs_cli /sbin/fs_cli</code></pre><p>Por ultimo recargamos systemd e iniciamos el servicio</p><pre><code class="language-bash">systemctl daemon-reload
systemctl start freeswitch</code></pre><h3 id="conclusi%C3%B3n">Conclusi&#xF3;n</h3><p>Siguiendo estos pasos tendremos nuestra instalaci&#xF3;n de freeswitch funcionando, para mas opciones de instalaci&#xF3;n o versi&#xF3;n de linux puedes consultar la <a href="https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Installation/">gu&#xED;a oficial de instalaci&#xF3;n de freeswitch</a>.</p><hr><blockquote class="kg-blockquote-alt">Julio Carranza</blockquote>]]></content:encoded></item><item><title><![CDATA[Taller VoIP Freeswitch 11/11]]></title><description><![CDATA[<p>Fecha: &#xA0; 11-Nov-23 &#xA0; &#xA0; | &#xA0; &#xA0; Costo: &#xA0;$# &#xA0; &#xA0; | &#xA0; &#xA0; 10 Lugares &#xA0; &#xA0; | &#xA0; &#xA0; <a href="  https://forms.gle/FweBF9LXUBbGEJgBA">Registrarme</a> </p><!--kg-card-begin: html--><h1 style="color:red"><center>Cerrado</center></h1><!--kg-card-end: html--><p>Practica en un laboratorio la configuracion de un Servidor VoIP FreeSwitch, da de alta varios dominios (FQDN), registra diferentes extensiones, crea planes de marcacion entre diferentes rutas, registra GWs</p>]]></description><link>http://blog.dev4telco.mx/taller-voip-freeswitch/</link><guid isPermaLink="false">652d66dc26e5c0000113f510</guid><dc:creator><![CDATA[dev4telco]]></dc:creator><pubDate>Mon, 16 Oct 2023 17:23:52 GMT</pubDate><content:encoded><![CDATA[<p>Fecha: &#xA0; 11-Nov-23 &#xA0; &#xA0; | &#xA0; &#xA0; Costo: &#xA0;$# &#xA0; &#xA0; | &#xA0; &#xA0; 10 Lugares &#xA0; &#xA0; | &#xA0; &#xA0; <a href="  https://forms.gle/FweBF9LXUBbGEJgBA">Registrarme</a> </p><!--kg-card-begin: html--><h1 style="color:red"><center>Cerrado</center></h1><!--kg-card-end: html--><p>Practica en un laboratorio la configuracion de un Servidor VoIP FreeSwitch, da de alta varios dominios (FQDN), registra diferentes extensiones, crea planes de marcacion entre diferentes rutas, registra GWs por IP / Usuario y Password. Configura distintos flujos de voz y genera diferentes tipos de cdrs (csv, xml, json).</p><p>El taller se llevara acabo el 11 de Noviembre del 2023, de 17:00 -20:00, incluye material, sesion de taller y acceso a un VPS con freeswitch instalado para realizar las pruebas de laboratorio. Para brindar una mejor atencion a los que atiendan al taller el cupo es limitado por lo que solo hay 10 lugares disponibles.</p><p>Los puntos que realizaras durante el taller son los siguientes:</p><!--kg-card-begin: html--><ul>
    <li>Multi-Tenant
        <ul>
            <li>Registro de extensiones</li>
            <li>Access List</li>
            <li>Configuracion de GWs (por IP/Registro)</li>
            <li>Configuracion de Profiles (internal/external/custom)</li>
        </ul>
    </li>
    <li>Dialplan
        <ul>
            <li>Condiciones (hora, ip origen, sip header, patron de marcacion)</li>
            <li>Grabacion de llamadas</li>
            <li>Custom headers</li>
        </ul>
    </li>
    <li>Media
        <ul>
            <li>Codecs (PCMU/PCMA/G729) /  (Early negotiation/Late negotiation)</li>
            <li>Bypass media</li>
            <li>Proxy media</li>
        </ul>
    </li>
    <li>CDRs
        <ul>
            <li>CSV</li>
            <li>XML</li>
            <li>JSON</li>
        </ul>
    </li>    
</ul><!--kg-card-end: html--><p>Conocimientos previos:</p><ul><li>Basicos de protocolo SIP</li><li>Comandos basicos de Linux</li></ul><p>Si deseas registrarte por favor llena el siguiente formulario: <a href="  https://forms.gle/FweBF9LXUBbGEJgBA">Registrarme</a></p><hr><blockquote class="kg-blockquote-alt">Julio Carranza</blockquote>]]></content:encoded></item><item><title><![CDATA[sipalive / montando un cluster de voz de alta disponibilidad]]></title><description><![CDATA[<figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/tpKCNOgYZrU?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen title="Tutorial sipalive / Crea un cluster HA de alta disponibilidad"></iframe></figure><p><a href="https://gitlab.com/dev4telcomx/siptools/sipalive">sipalive</a> es un servicio que nos permite crear un cluster voip de alta disponibilidad con ip flotante, independientemente del core de voz, ya sea Asterisk / FreeSWITCH / Opensips / Kamailio.</p><p>Funciona actualmente en sistemas basados en Debian. y esta probado en la ultima version 12.1 bookworm</p><p>Este servicio esta basado en</p>]]></description><link>http://blog.dev4telco.mx/sipalive-easiest-ha-voip-cluster-app/</link><guid isPermaLink="false">6513847f26e5c0000113f3e5</guid><dc:creator><![CDATA[dev4telco]]></dc:creator><pubDate>Sat, 07 Oct 2023 03:10:44 GMT</pubDate><media:content url="http://blog.dev4telco.mx/content/images/2023/10/Portada2.png" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/tpKCNOgYZrU?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen title="Tutorial sipalive / Crea un cluster HA de alta disponibilidad"></iframe></figure><img src="http://blog.dev4telco.mx/content/images/2023/10/Portada2.png" alt="sipalive / montando un cluster de voz de alta disponibilidad"><p><a href="https://gitlab.com/dev4telcomx/siptools/sipalive">sipalive</a> es un servicio que nos permite crear un cluster voip de alta disponibilidad con ip flotante, independientemente del core de voz, ya sea Asterisk / FreeSWITCH / Opensips / Kamailio.</p><p>Funciona actualmente en sistemas basados en Debian. y esta probado en la ultima version 12.1 bookworm</p><p>Este servicio esta basado en el trabajo de <strong>Laurie Odgers</strong> creador de <em><a href="https://github.com/laurieodgers/sipping.git">sipping</a></em> a quien corresponden todos los creditos de esta libreria.</p><p><strong>sipalive</strong> utiliza las siguientes reglas para decidir cuando switchear entre un nodo y otro</p><figure class="kg-card kg-image-card"><img src="http://blog.dev4telco.mx/content/images/2023/09/Screenshot-from-2023-09-26-20-39-18.png" class="kg-image" alt="sipalive / montando un cluster de voz de alta disponibilidad" loading="lazy" width="1816" height="922" srcset="http://blog.dev4telco.mx/content/images/size/w600/2023/09/Screenshot-from-2023-09-26-20-39-18.png 600w, http://blog.dev4telco.mx/content/images/size/w1000/2023/09/Screenshot-from-2023-09-26-20-39-18.png 1000w, http://blog.dev4telco.mx/content/images/size/w1600/2023/09/Screenshot-from-2023-09-26-20-39-18.png 1600w, http://blog.dev4telco.mx/content/images/2023/09/Screenshot-from-2023-09-26-20-39-18.png 1816w" sizes="(min-width: 720px) 720px"></figure><h2 id="1instalacion">1- Instalacion</h2><p>Descargamos sipalive del repositorio oficial</p><pre><code class="language-bash">cd /usr/local/
git clone http://gitlab.com/dev4telco/sipalive.git
</code></pre><p>Instalamos en ambos nodos (master/slave) o (activo/pasivo)</p><pre><code class="language-bash">cd /usr/local/sipalive/
./install</code></pre><h2 id="2configuracion-de-nodo-masteractivo">2- Configuracion de nodo master/activo </h2><p>Para esto editamos los valores del arvhivo /usr/local/sipalive/.env</p><pre><code class="language-.env">ROL=&quot;master&quot;
IFACE=&quot;eth0:1&quot;
MASK=&quot;24&quot;
IP=&quot;192.168.5.99&quot;
IP_PORT=5060
COUNT=1
INTERVAL=1
TIMEOUT=3
FAILURES=5</code></pre><h2 id="3configuracion-de-nodo-slavepasivo">3- Configuracion de nodo slave/pasivo </h2><p>Para esto editamos los valores del arvhivo /usr/local/sipalive/.env</p><pre><code class="language-.env">ROL=&quot;slave&quot;
IFACE=&quot;eth0:1&quot;
MASK=&quot;24&quot;
IP=&quot;192.168.5.99&quot;
IP_PORT=5060
COUNT=1
INTERVAL=1
TIMEOUT=3
FAILURES=5</code></pre><h2 id="4inicializacion-del-cluster">4- Inicializacion del cluster</h2><p>Procedemos a iniciar el servicio en el nodo master/activo</p><pre><code class="language-bash">systemctl start sipalive</code></pre><p>Y luego en el nodo slave/pasivo</p><pre><code class="language-bash">systemctl start sipalive</code></pre><h2 id="5monitoreo">5- Monitoreo</h2><p>Los logs del servicio podemos encontrarlos en: </p><pre><code class="language-bash">tail /usr/local/sipalive/${hostname}_node.log</code></pre><hr><p>sipalive &#xA9; 2023 is licensed under Attribution-ShareAlike 4.0 International. To view a copy of this license, <a href="https://creativecommons.org/licenses/by-sa/4.0/">visit</a>.</p><hr><blockquote class="kg-blockquote-alt">Julio Carranza</blockquote>]]></content:encoded></item><item><title><![CDATA[Dockerizando Asterisk - Dockerfile]]></title><description><![CDATA[<figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/VFdq0Qe49_k?start=700&amp;feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen title="Asterisk-Docker Instalacion y primeros pasos"></iframe></figure><p>Creamos un archivo Dockerfile para generar la imagen</p><pre><code class="language-Dockerfile">FROM debian:bullseye
USER root
RUN apt update &amp;&amp; apt upgrade -y
RUN apt install -y asterisk vim sngrep
COPY config/*conf /etc/asterisk/
RUN /etc/init.d/asterisk start
CMD [&quot;/usr/sbin/asterisk&quot;, &quot;-cvvvvv&quot;]</code></pre><p>Creamos la</p>]]></description><link>http://blog.dev4telco.mx/dockerizando-asterisk-2/</link><guid isPermaLink="false">632581b260cced0001b8fc10</guid><category><![CDATA[asterisk]]></category><category><![CDATA[docker]]></category><dc:creator><![CDATA[dev4telco]]></dc:creator><pubDate>Sat, 17 Sep 2022 08:18:49 GMT</pubDate><media:content url="http://blog.dev4telco.mx/content/images/2022/09/docker-asterisk-1.png" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/VFdq0Qe49_k?start=700&amp;feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen title="Asterisk-Docker Instalacion y primeros pasos"></iframe></figure><img src="http://blog.dev4telco.mx/content/images/2022/09/docker-asterisk-1.png" alt="Dockerizando Asterisk - Dockerfile"><p>Creamos un archivo Dockerfile para generar la imagen</p><pre><code class="language-Dockerfile">FROM debian:bullseye
USER root
RUN apt update &amp;&amp; apt upgrade -y
RUN apt install -y asterisk vim sngrep
COPY config/*conf /etc/asterisk/
RUN /etc/init.d/asterisk start
CMD [&quot;/usr/sbin/asterisk&quot;, &quot;-cvvvvv&quot;]</code></pre><p>Creamos la imagen apartir de nuestro archivo Dockerfile</p><pre><code class="language-bash">docker build -t dev4-asterisk:2.0 .</code></pre><p>Creamos el contenedor</p><pre><code class="language-bash">docker run -itd --name=PBX2 -p 5063:5060/tcp -p 5063:5060/udp -p 10100-10110:10100-10110/udp dev4-asterisk:2.0</code></pre><p>Con esto nuestro asterisk PBX2 ya esta arriba y listo para conectarnos, en otra terminal abrimos una conexion cli y una sesion sngrep para monitorear nuestro asterisk</p><pre><code class="language-bash">docker exec -it PBX2 /usr/sbin/asterisk -rvvvvv
docker exec -it PBX2 sngrep</code></pre><hr><blockquote class="kg-blockquote-alt">Julio Carranza</blockquote>]]></content:encoded></item><item><title><![CDATA[Dockerizando Asterisk - Instalación manual]]></title><description><![CDATA[<figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/VFdq0Qe49_k?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen title="Asterisk-Docker Instalacion y primeros pasos"></iframe></figure><p>Crearemos dos instancias de Asterisk PBX1 y PBX utilizando contenedores Docker<br></p><p>Para no estar ejecutando sudo docker todo el tiempo crearemos un alias temporal</p><pre><code class="language-cmd">alias docker=&apos;sudo docker&apos;</code></pre><p>bien ahora procedemos a descar la imagen de debian para usarla de base para la instalacion de nuestro servidor asterisk</p>]]></description><link>http://blog.dev4telco.mx/dockerizando-asterisk-1/</link><guid isPermaLink="false">6325680e60cced0001b8fa66</guid><category><![CDATA[asterisk]]></category><category><![CDATA[docker]]></category><dc:creator><![CDATA[dev4telco]]></dc:creator><pubDate>Sat, 17 Sep 2022 06:24:14 GMT</pubDate><media:content url="http://blog.dev4telco.mx/content/images/2022/09/docker-asterisk.png" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/VFdq0Qe49_k?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen title="Asterisk-Docker Instalacion y primeros pasos"></iframe></figure><img src="http://blog.dev4telco.mx/content/images/2022/09/docker-asterisk.png" alt="Dockerizando Asterisk - Instalaci&#xF3;n manual"><p>Crearemos dos instancias de Asterisk PBX1 y PBX utilizando contenedores Docker<br></p><p>Para no estar ejecutando sudo docker todo el tiempo crearemos un alias temporal</p><pre><code class="language-cmd">alias docker=&apos;sudo docker&apos;</code></pre><p>bien ahora procedemos a descar la imagen de debian para usarla de base para la instalacion de nuestro servidor asterisk </p><pre><code class="language-bash">docker run -it --name=demo-asterisk  debian:bullseye</code></pre><p>Una vez descargada la imagen de debian estaremos posicionados en el prompt dentro de nuestro contenedor, ahi procedemos a actualizar el sistema base e instalar asterisk y las demas dependencias que vamos a utilizar</p><pre><code class="language-bash">apt update; apt upgrade -y; apt -y install asterisk vim sngrep</code></pre><p>Una vez instalado asterisk procedemos a editar los siguientes archivos:</p><pre><code class="language-/etc/asterisk/users.conf">[700]
secret=secret
callerid=&quot;Marcos&quot; &lt;700&gt;
host=dynamic</code></pre><pre><code class="language-/etc/asterisk/rtp.conf">rtpstart=10000
rtpend=10010</code></pre><pre><code class="language-/etc/asterisk/extensions.conf">[public]
;include =&gt; demo
exten =&gt; 800,1,Answer()
  same =&gt; n,Playback(please-try-call-later)
  same =&gt; n,Hangup()</code></pre><pre><code class="language-/etc/asterisk/sip.conf">udpbindaddr=0.0.0.0:5080</code></pre><p>Posteriormente iniciamos el servidor asterisk y nos conectamos a la consola cli para validar que no hay errores </p><pre><code class="language-bash">/etc/init.d/asterisk startrasterisk</code></pre><p>Ahora, nos detachamos del contenedor utilizando la secuencia de teclas:</p><pre><code class="language-bash">ctrl + p + q</code></pre><p>Ahora hacemos commit de los cambios que realizamos en la imagen de debian que descargamos y etieutamos la nueva imagen como dev4-asterisk:1.0</p><pre><code class="language-bash">docker commit -m &quot;asterisk dentro de debian&quot; -a &quot;demo-asterisk&quot; 77672fdd6b54 dev4-asterisk:1.0</code></pre><p>Ahora creamos un contenedor con la nueva imagen que acabamos de crear y lo etiquetamos como PBX1 haciendo enfasis en el mapeo de puertos tanto para se;alizacion como para el flujo de RTP:</p><pre><code class="language-bash">docker run -itd --name=PBX1 -p 5062:5060/tcp -p 5062:5060/udp -p 10000-10010:10000-10010/udp dev4-asterisk:1.0</code></pre><p>Ahora podemos listar los contenedores que tenemos corriendo </p><pre><code class="language-bash">docker ps</code></pre><p>Ahora arrancamos el servidor asterisk dentro del contenedor y nos conectamos a la consola asterisk cli</p><pre><code class="language-bash">docker exec -it PBX1 /usr/sbin/asteriskdocker exec -it PBX1 /usr/sbin/asterisk -rvvvvv</code></pre><p>En otra consola ejectuamos el sngrep para ver la se&#xF1;alizacion del softphone y el flujo de media al hacer la llamada de prueba</p><pre><code class="language-bash">docker exec -it PBX1 sngrep</code></pre><p>Configuramos nuestro softphone utilizando la siguiente informacion y podemos ver como se registra en nuestra consola de asterisk</p><pre><code class="language-zoiper">sip user: 700@localhost:5062
sip pass: secret</code></pre><p>Por ultimo marcamos el numero 800 desde nuestra extension registrada y validamos que se vean los intentos de registro y de llamada tanto en la consola asterisk-cli &#xA0;como en nuestra captura sngrep</p><hr><blockquote class="kg-blockquote-alt">Julio Carranza</blockquote>]]></content:encoded></item></channel></rss>