📜 ⬆️ ⬇️

FusionPBX, or cool again, FreeSWITCH

In the same river


Relatively recently, I wrote myself a cheat sheet for setting up FreeSWITCH. The configuration process described there led to a configuration that worked in a test environment. The test was necessary for drawing up a preliminary idea of ​​what will have to be dealt with after moving the organization and launching telephony into production. However, when the move took place and the connection started in the working mode, the very first switch-on showed the inoperability of the configuration: the internal calls stopped going.

This was a complete surprise for me, since from the moment of the final configuration and performance check, based on which the cheat sheet was written, no changes were made to the config until the operating mode was activated. There were only massively added internal numbers and routes for incoming and outgoing calls for those employees for whom direct city numbers were assigned (about 60 with a tail of numbers).

Debug was performed, the joint was detected, and it all worked. However, the feeling of a crutch remained. I will not describe it, as I remain confident that the solution used is not the right one, although it has led to the desired result. In addition, it turned out the nuances: for outgoing calls, only the number that was specified in the SIP trunk setting in the default_provider_username field was determined from the outside:

<X-PRE-PROCESS cmd="set" data="default_provider_username=3435555555"/> 

and not the one specified in the subscriber number configuration:
')
 <variable name="outbound_caller_id_name" value="3435555566"/> 

The provider’s technical support reported that all the calls arriving to them from us in the From field have the number 3435555555 , that is, the cant is on my side. Plus, I'm suddenly completely hung up with the task of forwarding calls. And the cherry on the cake was the removal of the brain with the Ericsson Dialog 4422, which refused to perform the call transfer, and the Cisco 7945g, who decided that their connection duration was 90-100 seconds in the absence of the slightest hint of a similar setting in the config. At the same time, Yealink T21 E2 devices worked completely without any complaints.

At this stage, I realized that I had reached the limit of my competence in the field of telephony and took time out to ensure that everything in my head was settled and completed. This decision was also very powerful contributed to the general fatigue after a completely wild two working weeks without days off and with irregular working hours, which followed immediately after arrival at the new location of the organization.

Fusionpbx


Despite my lack of sympathy for graphical interfaces where the console and text configs reigns, I still began to look towards a solution with a web-snout called FusionPBX. The first reason for such betrayal of our own principles was the desire to see the entire amount of settings for each functional element, collected in one place in the form of a workable out-of-the-box configuration. This is exactly what the graphical interface gives. An added bonus of a thoughtful graphical interface is a visual representation of the relationships between modules and functions. For a beginner (for me personally), a lower level of abstraction with a specific implementation method contributes to faster learning and coming to understand how this thing works. The second reason was www.pbxforums.com , to which I got a link through one when searching for information on FreeSWITCH, and, ironically, it was on the screenshots of the FusionPBX settings pages.

FusionPBX is a FreeSWITCH with a web snout and with settings stored in a database. The automatic installation script installs both FreeSWITCH, Nginx, PostgreSQL, and, in fact, the web interface of FusionPBX itself. I will not stop at this moment, everything without hesitation is put according to the instructions from the documentation. I put everything on the recommended 64-bit Debian 8 by developers.

Subscriber number import

The process of setting up subscriber numbers and incoming routes will not be considered here. This process is described in the official documentation.

Instead, it will be described the procedure for importing a crowd. Descriptions, manuals and tips for performing this procedure were not found by me.

After the installation is completed, we enable automatic login to the Adminer (analogous to phpMyAdmin):
Advanced → Default settings :
auto_login
Value : true
Enabled : true
After changing the values ​​on the current page, click Save , on the Reload settings default page.

Go to Adminer: Advanced → Adminer .

The following tables are of interest to us:

v_extensions - subscriber numbers.
v_destinations — routes for incoming calls to fixed numbers assigned to internal subscriber numbers.
v_dialplans - dialplan reference.
v_dialplan_details - incoming call dialplan settings.
v_voicemails - voice mail settings.

The task formulation was as follows: unload the full name of employees and their internal phone numbers from AD, save the unloading to a CSV file and import it into the database in the table of subscriber numbers and voice mail settings (voice mail should be disabled).
Using the directory of the correspondence of city numbers to internal numbers, create CSV files for import into tables with routes and dialplans of incoming calls.

I will not consider this problem in detail, I simply hide the finished scripts under the spoiler.
Attention!

You use the proposed scripts at your own risk and risk; the author is not responsible for their incorrect use or the unexpected side effects of their correct use.

  • Set the $ nums variable to match your numbers.
  • Before using scripts, you must replace the domain UUID everywhere with the value assigned to the domain during installation (the domain_uuid field).
  • It is also necessary to replace the IP address of the domain (172.18.253.1) with yours.
  • Do not forget to correct the value of the -SearchBase key, specifying your sample area instead of "OU = Ekaterinburg, DC = dc, DC = domain, DC = local"
  • The UUID of the Voicemail application ( app_uuid field) is also replaced with the UUID assigned during installation.
  • Values ​​of UUIDs can be viewed, for example, in the v_dialplans table.
  • All subscriber numbers will be assigned a password for registration “12345”, a password for voice mail and other services - the same as the subscriber number.
  • The script appends files line by line! Therefore, do not forget to delete files before each launch of the script or to clear their contents!
.
Subscriber numbers and voice mail
 $Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False $nums=@{"1111"="5555555";"1112"="5555566"} [System.IO.File]::AppendAllText("d:\v_extensions.csv", "extension_uuid;domain_uuid;extension;number_alias;password;accountcode;effective_caller_id_name;effective_caller_id_number;outbound_caller_id_name;outbound_caller_id_number;emergency_caller_id_name;emergency_caller_id_number;directory_full_name;directory_visible;directory_exten_visible;limit_max;limit_destination;missed_call_app;missed_call_data;user_context;toll_allow;call_timeout;call_group;call_screen_enabled;user_record;hold_music;auth_acl;cidr;sip_force_contact;nibble_account;sip_force_expires;mwi_account;sip_bypass_media;unique_id;dial_string;dial_user;dial_domain;do_not_disturb;forward_all_destination;forward_all_enabled;forward_busy_destination;forward_busy_enabled;forward_no_answer_destination;forward_no_answer_enabled;follow_me_uuid;enabled;description;forward_caller_id_uuid;absolute_codec_string;forward_user_not_registered_destination;forward_user_not_registered_enabled;force_ping`r`n", $Utf8NoBomEncoding) [System.IO.File]::AppendAllText("d:\v_voicemails.csv", "domain_uuid;voicemail_uuid;voicemail_id;voicemail_password;greeting_id;voicemail_alternate_greet_id;voicemail_mail_to;voicemail_sms_to;voicemail_attach_file;voicemail_file;voicemail_local_after_email;voicemail_enabled;voicemail_description;voicemail_name_base64`r`n", $Utf8NoBomEncoding) Get-ADUser -Filter * -SearchBase "OU=Ekaterinburg,DC=dc,DC=domain,DC=local" -Properties Telephonenumber,sn,initials,cn|%{ if(-not $_.Telephonenumber -eq ""){ if($nums.Get_Item($_.Telephonenumber) -eq $null) {$outn = "5555555"} else {$outn = $nums.Get_Item($_.Telephonenumber)} $extension_uuid = (New-Guid).Tostring() $domain_uuid = "ffffffff-ffff-ffff-ffff-ffffffffffff" ## !!! $extension = $_.Telephonenumber $number_alias = "" $password = "12345" $accountcode = "172.18.253.1" $effective_caller_id_name = $_.sn + " " + $_.initials $effective_caller_id_number = $extension $outbound_caller_id_name = $outn $outbound_caller_id_number = $outn $emergency_caller_id_name = $effective_caller_id_name $emergency_caller_id_number = $extension $directory_full_name = $_.cn $directory_visible = "true" $directory_exten_visible = "true" $limit_max = "1" $limit_destination = "error/user_busy" $missed_call_app = "" $missed_call_data = "" $user_context = "172.18.253.1" $toll_allow = "domestic,international,local" $call_timeout = "30" $call_group = "" $call_screen_enabled = "false" $user_record = "" $hold_music = "local_stream://default" $auth_acl = "" $cidr = "" $sip_force_contact = "" $nibble_account = "" $sip_force_expires = "3600" $mwi_account = "" $sip_bypass_media = "" $unique_id = "" $dial_string = "" $dial_user = "" $dial_domain = "" $do_not_disturb = "" $forward_all_destination = "" $forward_all_enabled = "" $forward_busy_destination = "" $forward_busy_enabled = "" $forward_no_answer_destination = "" $forward_no_answer_enabled = "" $follow_me_uuid = "" $enabled = "true" $description = $_.sn + " " + $_.initials $forward_caller_id_uuid = "" $absolute_codec_string = "" $forward_user_not_registered_destination = "" $forward_user_not_registered_enabled = "" $force_ping = "" $csv="$extension_uuid;$domain_uuid;$extension;$number_alias;$password;$accountcode;$effective_caller_id_name;$effective_caller_id_number;$outbound_caller_id_name;$outbound_caller_id_number;$emergency_caller_id_name;$emergency_caller_id_number;$directory_full_name;$directory_visible;$directory_exten_visible;$limit_max;$limit_destination;$missed_call_app;$missed_call_data;$user_context;`"$toll_allow`";$call_timeout;$call_group;$call_screen_enabled;$user_record;$hold_music;$auth_acl;$cidr;$sip_force_contact;$nibble_account;$sip_force_expires;$mwi_account;$sip_bypass_media;$unique_id;$dial_string;$dial_user;$dial_domain;$do_not_disturb;$forward_all_destination;$forward_all_enabled;$forward_busy_destination;$forward_busy_enabled;$forward_no_answer_destination;$forward_no_answer_enabled;$follow_me_uuid;$enabled;$description;$forward_caller_id_uuid;$absolute_codec_string;$forward_user_not_registered_destination;$forward_user_not_registered_enabled;`"$force_ping`"`r`n" [System.IO.File]::AppendAllText("d:\v_extensions.csv", $csv, $Utf8NoBomEncoding) $voicemail_uuid = (New-Guid).Tostring() $voicemail_id = $extension $voicemail_password = $extension $greeting_id $voicemail_alternate_greet_id $voicemail_mail_to = "" $voicemail_sms_to $voicemail_attach_file $voicemail_file = "" $voicemail_local_after_email = "true" $voicemail_enabled = "false" $voicemail_description = $description $voicemail_name_base64 [System.IO.File]::AppendAllText("d:\v_voicemails.csv", "$domain_uuid;$voicemail_uuid;$voicemail_id;$voicemail_password;$greeting_id;$voicemail_alternate_greet_id;$voicemail_mail_to;$voicemail_sms_to;$voicemail_attach_file;$voicemail_file;$voicemail_local_after_email;$voicemail_enabled;$voicemail_description;$voicemail_name_base64`r`n", $Utf8NoBomEncoding)}} ; user_context; toll_allow; call_timeout; call_group; call_screen_enabled; user_record; hold_music; auth_acl; cidr; sip_force_contact; nibble_account; sip_force_expires; mwi_account; sip_bypass_media; unique_id; dial_string; dial_user; dial_domain; do_not_disturb; forward_all_destination; forward_all_enabled $Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False $nums=@{"1111"="5555555";"1112"="5555566"} [System.IO.File]::AppendAllText("d:\v_extensions.csv", "extension_uuid;domain_uuid;extension;number_alias;password;accountcode;effective_caller_id_name;effective_caller_id_number;outbound_caller_id_name;outbound_caller_id_number;emergency_caller_id_name;emergency_caller_id_number;directory_full_name;directory_visible;directory_exten_visible;limit_max;limit_destination;missed_call_app;missed_call_data;user_context;toll_allow;call_timeout;call_group;call_screen_enabled;user_record;hold_music;auth_acl;cidr;sip_force_contact;nibble_account;sip_force_expires;mwi_account;sip_bypass_media;unique_id;dial_string;dial_user;dial_domain;do_not_disturb;forward_all_destination;forward_all_enabled;forward_busy_destination;forward_busy_enabled;forward_no_answer_destination;forward_no_answer_enabled;follow_me_uuid;enabled;description;forward_caller_id_uuid;absolute_codec_string;forward_user_not_registered_destination;forward_user_not_registered_enabled;force_ping`r`n", $Utf8NoBomEncoding) [System.IO.File]::AppendAllText("d:\v_voicemails.csv", "domain_uuid;voicemail_uuid;voicemail_id;voicemail_password;greeting_id;voicemail_alternate_greet_id;voicemail_mail_to;voicemail_sms_to;voicemail_attach_file;voicemail_file;voicemail_local_after_email;voicemail_enabled;voicemail_description;voicemail_name_base64`r`n", $Utf8NoBomEncoding) Get-ADUser -Filter * -SearchBase "OU=Ekaterinburg,DC=dc,DC=domain,DC=local" -Properties Telephonenumber,sn,initials,cn|%{ if(-not $_.Telephonenumber -eq ""){ if($nums.Get_Item($_.Telephonenumber) -eq $null) {$outn = "5555555"} else {$outn = $nums.Get_Item($_.Telephonenumber)} $extension_uuid = (New-Guid).Tostring() $domain_uuid = "ffffffff-ffff-ffff-ffff-ffffffffffff" ## !!! $extension = $_.Telephonenumber $number_alias = "" $password = "12345" $accountcode = "172.18.253.1" $effective_caller_id_name = $_.sn + " " + $_.initials $effective_caller_id_number = $extension $outbound_caller_id_name = $outn $outbound_caller_id_number = $outn $emergency_caller_id_name = $effective_caller_id_name $emergency_caller_id_number = $extension $directory_full_name = $_.cn $directory_visible = "true" $directory_exten_visible = "true" $limit_max = "1" $limit_destination = "error/user_busy" $missed_call_app = "" $missed_call_data = "" $user_context = "172.18.253.1" $toll_allow = "domestic,international,local" $call_timeout = "30" $call_group = "" $call_screen_enabled = "false" $user_record = "" $hold_music = "local_stream://default" $auth_acl = "" $cidr = "" $sip_force_contact = "" $nibble_account = "" $sip_force_expires = "3600" $mwi_account = "" $sip_bypass_media = "" $unique_id = "" $dial_string = "" $dial_user = "" $dial_domain = "" $do_not_disturb = "" $forward_all_destination = "" $forward_all_enabled = "" $forward_busy_destination = "" $forward_busy_enabled = "" $forward_no_answer_destination = "" $forward_no_answer_enabled = "" $follow_me_uuid = "" $enabled = "true" $description = $_.sn + " " + $_.initials $forward_caller_id_uuid = "" $absolute_codec_string = "" $forward_user_not_registered_destination = "" $forward_user_not_registered_enabled = "" $force_ping = "" $csv="$extension_uuid;$domain_uuid;$extension;$number_alias;$password;$accountcode;$effective_caller_id_name;$effective_caller_id_number;$outbound_caller_id_name;$outbound_caller_id_number;$emergency_caller_id_name;$emergency_caller_id_number;$directory_full_name;$directory_visible;$directory_exten_visible;$limit_max;$limit_destination;$missed_call_app;$missed_call_data;$user_context;`"$toll_allow`";$call_timeout;$call_group;$call_screen_enabled;$user_record;$hold_music;$auth_acl;$cidr;$sip_force_contact;$nibble_account;$sip_force_expires;$mwi_account;$sip_bypass_media;$unique_id;$dial_string;$dial_user;$dial_domain;$do_not_disturb;$forward_all_destination;$forward_all_enabled;$forward_busy_destination;$forward_busy_enabled;$forward_no_answer_destination;$forward_no_answer_enabled;$follow_me_uuid;$enabled;$description;$forward_caller_id_uuid;$absolute_codec_string;$forward_user_not_registered_destination;$forward_user_not_registered_enabled;`"$force_ping`"`r`n" [System.IO.File]::AppendAllText("d:\v_extensions.csv", $csv, $Utf8NoBomEncoding) $voicemail_uuid = (New-Guid).Tostring() $voicemail_id = $extension $voicemail_password = $extension $greeting_id $voicemail_alternate_greet_id $voicemail_mail_to = "" $voicemail_sms_to $voicemail_attach_file $voicemail_file = "" $voicemail_local_after_email = "true" $voicemail_enabled = "false" $voicemail_description = $description $voicemail_name_base64 [System.IO.File]::AppendAllText("d:\v_voicemails.csv", "$domain_uuid;$voicemail_uuid;$voicemail_id;$voicemail_password;$greeting_id;$voicemail_alternate_greet_id;$voicemail_mail_to;$voicemail_sms_to;$voicemail_attach_file;$voicemail_file;$voicemail_local_after_email;$voicemail_enabled;$voicemail_description;$voicemail_name_base64`r`n", $Utf8NoBomEncoding)}} 

Routes and Dialplans
 $Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False [System.IO.File]::AppendAllText("d:\v_destinations.csv", "domain_uuid;destination_uuid;dialplan_uuid;fax_uuid;destination_type;destination_number;destination_number_regex;destination_caller_id_name;destination_caller_id_number;destination_cid_name_prefix;destination_context;destination_app;destination_data;destination_enabled;destination_description;destination_accountcode`r`n", $Utf8NoBomEncoding) [System.IO.File]::AppendAllText("d:\v_dialplans.csv", "domain_uuid;dialplan_uuid;app_uuid;dialplan_context;dialplan_name;dialplan_number;dialplan_continue;dialplan_order;dialplan_enabled;dialplan_description`r`n", $Utf8NoBomEncoding) [System.IO.File]::AppendAllText("d:\v_dialplan_details.csv", "domain_uuid;dialplan_uuid;dialplan_detail_uuid;dialplan_detail_tag;dialplan_detail_type;dialplan_detail_data;dialplan_detail_break;dialplan_detail_inline;dialplan_detail_group;dialplan_detail_order`r`n", $Utf8NoBomEncoding) $nums="1111=5555555;1112=5555566" $nums.Split(";")|%{ $innum = $_.Split("=")[0] $outnum = $_.Split("=")[1] $domain_uuid = "ffffffff-ffff-ffff-ffff-ffffffffffff" ## !!! $destination_uuid = (New-Guid).Tostring() $dialplan_uuid = (New-Guid).Tostring() $fax_uuid $destination_type = "inbound" $destination_number = "343$outnum" $destination_number_regex = "^(343$outnum)$" $destination_caller_id_name $destination_caller_id_number $destination_cid_name_prefix $destination_context = "public" $destination_app $destination_data $destination_enabled = "true" $destination_description = "$outnum-$innum" $destination_accountcode [System.IO.File]::AppendAllText("d:\v_destinations.csv", "$domain_uuid;$destination_uuid;$dialplan_uuid;$fax_uuid;$destination_type;$destination_number;$destination_number_regex;$destination_caller_id_name;$destination_caller_id_number;$destination_cid_name_prefix;$destination_context;$destination_app;$destination_data;$destination_enabled;$destination_description;$destination_accountcode`r`n", $Utf8NoBomEncoding) $app_uuid = "ffffffff-ffff-ffff-ffff-ffffffffffff" ## !!! $dialplan_context = "public" $dialplan_name = $destination_number $dialplan_number = $destination_number $dialplan_continue = "false" $dialplan_order = "100" $dialplan_enabled = "true" $dialplan_description = $destination_description [System.IO.File]::AppendAllText("d:\v_dialplans.csv", "$domain_uuid;$dialplan_uuid;$app_uuid;$dialplan_context;$dialplan_name;$dialplan_number;$dialplan_continue;$dialplan_order;$dialplan_enabled;$dialplan_description`r`n", $Utf8NoBomEncoding) $dialplan_detail_break $dialplan_detail_inline $dialplan_detail_group $dialplan_detail_uuid = (New-Guid).Tostring() $dialplan_detail_tag = "condition" $dialplan_detail_type = "destination_number" $dialplan_detail_data = "^(343$outnum)$" $dialplan_detail_order = 20 [System.IO.File]::AppendAllText("d:\v_dialplan_details.csv", "$domain_uuid;$dialplan_uuid;$dialplan_detail_uuid;$dialplan_detail_tag;$dialplan_detail_type;$dialplan_detail_data;$dialplan_detail_break;$dialplan_detail_inline;$dialplan_detail_group;$dialplan_detail_order`r`n", $Utf8NoBomEncoding) $dialplan_detail_uuid = (New-Guid).Tostring() $dialplan_detail_tag = "action" $dialplan_detail_type = "transfer" $dialplan_detail_data = "$innum XML 172.18.253.1" $dialplan_detail_order = 30 [System.IO.File]::AppendAllText("d:\v_dialplan_details.csv", "$domain_uuid;$dialplan_uuid;$dialplan_detail_uuid;$dialplan_detail_tag;$dialplan_detail_type;$dialplan_detail_data;$dialplan_detail_break;$dialplan_detail_inline;$dialplan_detail_group;$dialplan_detail_order`r`n", $Utf8NoBomEncoding) } 

Testing the connection to randomly selected numbers showed the operability of the import.

Gateway Setup
Accounts → Gateways
Gateway : 172.16.253.3
Username : 3435555555
Password : not-used
From User : 3435555555
From Domain : 172.16.253.3
Proxy : 172.16.253.3
Register : False
Caller ID In From : True
Note!
The FusionPBX documentation explicitly states that when making settings, fields in bold text are required.
However, for some unknown reason, I did not see the fat content of the Proxy field and did not give it any meaning. As a result, I received working incoming external calls, but not working outgoing calls. The sofia status gateway ffffffff-ffff-ffff-ffff-ffffffffffff did not show any configuration anomalies and even showed the assigned value of the proxy field corresponding to the value of the Gateway . Exactly the same output of the command with exactly the same settings was demonstrated by the “bare” FreeSWITCH in the previous installation, and at the same time it allowed to make outgoing calls to the outside without any problems.
FusionPBX earned only after explicitly specifying the value of Proxy .
* ffffffff-ffff-ffff-ffff-ffffffffffff - gateway UUID
ACL Setup

Made the settings in accordance with the cheat sheet and immediately received broken internal calls. The logs showed that the devices for some reason turned out to be in the external context, respectively, were processed "not by their own" dialpan, from which the call ended with an error ROUTE_NOT_FOUND.

Lyrical digression
The humor of the situation was also in the fact that this “trouble” struck me before I discovered that it was mandatory to fill in the Proxy field in the gateway settings. And as soon as I set up the ACL, calls from outside started coming, but internal calls were broken. And no matter how I played with the use of ACL and with their values, the result was the same: either calls from outside to inside, or internal calls without calls from inside to outside and outside to inside.

As it turned out, the ACL setting was incorrect!
Important!

ACLs are for networks and domains of providers only.
Your own networks and domains in them should not be .
The domains list should be deny by default.
The rules themselves must be resolving and the provider’s gateway IP address with the / 32 mask must be entered in them, you do not need to fill in the domain field.

So, we configure the ACL: Advanced → Access Controls → domains . Delete existing rules, create new:
Type : allow
CIDR : 172.16.253.3/32
Domain :
Description : default SIP-trunk

At the end, click Save , then to the new ACL come into effect: Status → Sip Status and click Reload ACL .

System variables

Advanced → Default Settings
Here we will specify the external IP address given to us by the provider, which we used when configuring 1: 1 NAT in the cheat sheet, we will indicate the telephone area code, language and voice for voice responses, the type of dial tone.

Defaults section:
default_areacode : 343
default_language : ru
default_dialect : RU
default_voice : elena
ringback : $${ru-ring}
transfer_ringback : $${ru-ring}
IP Address Section
external_rtp_ip : 172.16.160.154
external_sip_ip : 172.16.160.154
SIP Profile Section : Internal
internal_auth_calls : true
As a matter of fact, it is this variable, in the true value, that is responsible for reading the settings of the subscriber number and transferring the values $ {outbound_caller_id_number} and $ {outbound_caller_id_name} from it . For this variable to be effective, it is necessary that the authorization of internal subscriber numbers via ACL is disabled. By default, out of the box, this is done as follows: ACL authorization is absent, Digest is used instead (by subscriber number and password): internal_auth_calls : true .
Important!

In order to correctly identify direct city numbers assigned to the internal in the settings through the fields Outbound Caller ID Name and Outbound Caller ID Number , three conditions must be met:
  1. No ACL authorization of internal subscribers
  2. Included Digest authorization in SIP profile settings:
    internal_auth_calls : true
  3. Presence in the gateway settings:
    Caller ID In From : True
Outbound routes

Dialplan → Outbound Routes
Perhaps this is the only setting item that has not been rethought.
I will not analyze it in detail. I will only note that the following regular expressions were used for different directions:


For all routes, two action tags of the set type were edited: effective_caller_id_name= ${default_areacode} ${outbound_caller_id_name} effective_caller_id_number= ${default_areacode} ${outbound_caller_id_number} so that the caller number transmitted to the operator includes the area code.

We treat call reset in 90-100 seconds on Cisco devices

As noted above, the surprise was a disconnection of an established connection in 90-100 seconds on all Cisco 7945g devices. Twisting all the timers with a more or less relevant variable name in the config of the devices did not give any result. Smoking logs in the FreeSWITCH console revealed Session Expire.

Googling, besides the mats in the direction of the reluctance of Cisco devices to work normally with at least someone other than Call Manager, revealed that this behavior could be cured by disabling the variable aggressive-nat-detection .

Advanced → SIP Profile
aggressive-nat-detection
Value : true
Enabled : False
Russification of voice response

We will need the voice files created by altruistic professionals.

Downloading:

files.freeswitch.org/releases/sounds/freeswitch-sounds-ru-RU-elena-48000-1.0.51.tar.gz
files.freeswitch.org/releases/sounds/freeswitch-sounds-ru-RU-elena-32000-1.0.51.tar.gz
files.freeswitch.org/releases/sounds/freeswitch-sounds-ru-RU-elena-16000-1.0.51.tar.gz
files.freeswitch.org/releases/sounds/freeswitch-sounds-ru-RU-elena-8000-1.0.51.tar.gz

Each of the archives contains a ready-made directory structure. Each of the archives is unpacked in / usr / share / freeswitch / sound /

Since we have already done the default settings, from this point on the Russian voice files will pick up and start playing without additional movements. The only thing you may have to do (I had to) is in all four folders ru / RU / elena / voicemail / _bitrate_ / rename the file vm-not_available_no_voicemail.wav and give it a new name vm-no_answer_no_vm.wav . Only after this manipulation did I receive a voice response to the unavailable event of the called subscriber.

PS: Like the previous part , this text was written solely for the purpose of documenting the emerging difficulties and ways to solve them. Despite the fact that the text also covers a quick start from scratch of the same FreeSWITCH, albeit with a “graphic face”, I believe that the text is self-sufficient and is a kind of fork, and has the right to independent life. The previous part also retains some value due to the described configuration of network equipment. Incorrect settings in that text will be corrected and brought to those used in this article.

Source: https://habr.com/ru/post/353156/


All Articles