Setting Up a FreeSWITCH Basic Dialplan
Categories:
3 minute read
Dialplans are the heart of FreeSWITCH, determining how calls are routed and processed within your system. In this comprehensive guide, we’ll explore how to create and configure a FreeSWITCH basic dialplan that handles common calling scenarios. Whether you’re new to FreeSWITCH or looking to enhance your existing setup, this guide will help you understand and implement effective call routing strategies.
Understanding Dialplan Basics
What is a Dialplan?
A dialplan is a set of instructions that tells FreeSWITCH how to handle calls. It’s essentially a routing table that determines what happens when someone makes a call through your system. Dialplans in FreeSWITCH are written in XML and consist of several key components:
Contexts
Extensions
Conditions
Actions
Anti-Actions
Dialplan Structure
Basic XML Structure
<include>
<context name="my_context">
<extension name="my_extension">
<condition field="destination_number" expression="^(\d+)$">
<action application="bridge" data="user/${destination_number}"/>
</condition>
</extension>
</context>
</include>
Key Components Explained
Context: A logical grouping of extensions
Extension: A set of rules for handling specific calls
Condition: Criteria that must be met for actions to execute
Action: What happens when conditions are met
Anti-Action: What happens when conditions are not met
Creating Your First Dialplan
- Basic Internal Calls
Create a new file /usr/local/freeswitch/conf/dialplan/default/01_internal.xml
:
<include>
<context name="default">
<!-- Extension to Extension Calls -->
<extension name="internal">
<condition field="destination_number" expression="^(10[01][0-9])$">
<action application="set" data="ringback=${us-ring}"/>
<action application="bridge" data="user/$1"/>
</condition>
</extension>
<!-- Voicemail Access -->
<extension name="voicemail">
<condition field="destination_number" expression="^(\*98)$">
<action application="answer"/>
<action application="voicemail" data="check default ${domain_name} ${caller_id_number}"/>
</condition>
</extension>
</context>
</include>
- Adding External Calls
Create /usr/local/freeswitch/conf/dialplan/default/02_external.xml
:
<include>
<context name="default">
<!-- Outbound Calls -->
<extension name="outbound">
<condition field="destination_number" expression="^(1?\d{10})$">
<action application="set" data="effective_caller_id_number=${outbound_caller_id_number}"/>
<action application="bridge" data="sofia/gateway/my_provider/$1"/>
</condition>
</extension>
</context>
</include>
Common Dialplan Features
- Time-Based Routing
<extension name="business_hours">
<condition wday="2-6" hour="9-17"> <!-- Monday-Friday, 9 AM-5 PM -->
<action application="bridge" data="user/1000"/>
<anti-action application="voicemail" data="default ${domain_name} 1000"/>
</condition>
</extension>
- IVR (Interactive Voice Response)
<extension name="main_ivr">
<condition field="destination_number" expression="^(5000)$">
<action application="answer"/>
<action application="sleep" data="1000"/>
<action application="ivr" data="main_menu"/>
</condition>
</extension>
- Conference Rooms
<extension name="conferences">
<condition field="destination_number" expression="^(3\d{3})$">
<action application="answer"/>
<action application="conference" data="$1@default"/>
</condition>
</extension>
Advanced Dialplan Techniques
- Call Recording
<extension name="record_calls">
<condition field="destination_number" expression="^(record_\d+)$">
<action application="set" data="RECORD_STEREO=true"/>
<action application="set" data="record_file=/recordings/${strftime(%Y-%m-%d_%H-%M-%S)}_${destination_number}.wav"/>
<action application="record_session" data="${record_file}"/>
<action application="bridge" data="user/$1"/>
</condition>
</extension>
- Call Queues
<extension name="support_queue">
<condition field="destination_number" expression="^(7000)$">
<action application="answer"/>
<action application="set" data="queue_moh=$${hold_music}"/>
<action application="callcenter" data="support@default"/>
</condition>
</extension>
- Failover Routing
<extension name="failover">
<condition field="destination_number" expression="^(2\d{3})$">
<action application="set" data="call_timeout=20"/>
<action application="set" data="hangup_after_bridge=true"/>
<action application="bridge" data="user/$1,user/${default_gateway}"/>
</condition>
</extension>
Best Practices
- Organization
Use numbered files for loading order (01_internal.xml, 02_external.xml, etc.)
Group similar extensions together
Comment your dialplan thoroughly
- Security
<extension name="limit_international">
<condition field="destination_number" expression="^(011\d+)$">
<condition field="${user_data(${caller_id_number} international_allowed)}" expression="^true$">
<action application="bridge" data="sofia/gateway/my_provider/$1"/>
<anti-action application="playback" data="not_authorized.wav"/>
</condition>
</condition>
</extension>
- Error Handling
<extension name="handle_failed_calls">
<condition field="${originate_disposition}" expression="^(BUSY|NO_ANSWER|USER_NOT_REGISTERED)$">
<action application="voicemail" data="default ${domain_name} ${dialed_extension}"/>
</condition>
</extension>
Testing and Debugging
- Log Configuration
Add to /usr/local/freeswitch/conf/autoload_configs/switch.conf.xml
:
<param name="loglevel" value="debug"/>
- Testing Commands
In fs_cli:
reloadxml
show dialplan
eval ${destination_number}
Common Troubleshooting
- Dialplan Not Working
Check these common issues:
XML syntax errors
Regular expression patterns
File permissions
Context names matching the user’s context
- Call Routing Issues
Verify:
Gateway configurations
User directory settings
Network connectivity
SIP profile settings
Monitoring and Maintenance
- Regular Checks
# Check dialplan syntax
/usr/local/freeswitch/bin/fs_cli -x "xml_validate"
# Monitor active calls
/usr/local/freeswitch/bin/fs_cli -x "show calls"```
2. Performance Monitoring
Conclusion
Creating an effective dialplan is crucial for a well-functioning FreeSWITCH system. Start with basic call routing and gradually add more complex features as needed. Remember to:
Keep your dialplan organized and well-documented
Test thoroughly before deploying changes
Monitor performance and logs regularly
Implement security measures
Plan for scalability As your system grows, you can expand your dialplan to include more advanced features like:
Multi-tenant configurations
Advanced IVR systems
Custom applications
Integration with external systems Regular maintenance and updates will ensure your FreeSWITCH system continues to handle calls efficiently and reliably.