Freeswitch Integration with Telecom Carrier

This articles is a follow up of the earlier freeswitch capability introduction and some generic usecases around dialplans and contexts. This post contains instructions on how to integrate your SIP VOIP Freeswitch server to ITSP ( Internet Telephony Service Providers) which are basically part of large telecommunications companies.

First we check the external profile via sofia status . We should’ve configured the internal ip to listen to domain address or public ip. The external profile on port 5080 is used for outgoing and incoming connections .

Screen Shot 2018-09-28 at 9.32.31 AM

Create a user profile for interacting with outside world

<include>
<user id="1001">
<params>
<param name="password" value="pass1234"/>
</params>
</user>
</include>

Next we should try and register any sip softphone with the freeswitch server . I used Xlite , screenshot below

Screen Shot 2018-09-28 at 9.30.07 AM

Configuring a SIP gateway  in sip_profiles -> external

Goto /usr/src/freeswitch-debs/freeswitch/conf/vanilla/sip_profiles/external and create a profile such as telco_profile.xml

<include>
<gateway name="telcoCompany">
<param name="realm" value="sip.2600hz.com"/>
<param name="username" value="admin"/>
<param name="password" value="123456"/>
<param name="register" value="true"/>
</gateway>
</include>

and add the bridge to dialplan under usage

<extension name="telco gateway bridge">
<condition field="destination_number" expression="^(\d{10})$">
<action application="bridge" data="sofia/gateway/telcoCompany/$1"/>
</condition>
</extension>

note $1 contains the dialled number which will be passed to bridge to telcoCompany gateway. Therefore to add prefix for USA use +1$1 or for India +91$1 (  E.164 format) or some inline variable such as ${customercode}$1

After adding reloadxml and also run sofia profile external rescan to let freeswitch find the gateways

Monitoring gateways using OPTIONS

<param name="ping" value="20"/>

Codec Negotiation 

Late negotiations reduces re-sampling and codec changes

<param name="inbound-late-negotiation" value="true"/>

Other dial plan variables can also be set such as absolute_codec_string, inherit_codec , ep_codec_string. To avoid any codec negotiation on SDP use bypass_media=true .

<param name="inbound-codec-prefs" value="${global_codec_prefs}"/>
<param name="outbound-codec-prefs" value="${outbound_codec_prefs}"/>
<param name="inbound-codec-negotiation" value="generous"/>

CDR ( Call Detail Records )

can be used with modules mod_xml_cdr , mod_csv_cdr , mod_cdr_mongodb, mod_odbc_cdr , mod_cdr_pg_csv , mod_cdr_sqlite , mod_json_cdr , mod_radius_cdr

<configuration name="cdr_csv.conf" description="CDR CSV Format">
<settings>
<!-- 'cdr-csv' will always be appended to log-base -->
<!--<param name="log-base" value="/var/log"/>-->
<param name="default-template" value="example"/>
<!-- This is like the info app but after the call is hung up -->
<!--<param name="debug" value="true"/>-->
<param name="rotate-on-hup" value="true"/>
<!-- may be a b or ab -->
<param name="legs" value="a"/>
<!-- Only log in Master.csv -->
<!-- <param name="master-file-only" value="true"/> -->
</settings>
<templates>
<template name="sql">INSERT INTO cdr VALUES ("${caller_id_name}","${caller_id_number}","${destination_number}","${context}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${uuid}","${bleg_uuid}", "${accountcode}");</template>
...
</templates>
</configuration>

event socket library (ESL)

tbd

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.