Catching e164 patterns with Asterisk
In the realm of telephony, ensuring seamless call routing and processing hinges on the ability to accurately identify and handle phone numbers in a standardized format. Enter e164, a widely adopted standard that provides a consistent structure for international telephone numbers. This blog post delves into the intricacies of working with e164 patterns within the context of Asterisk, a powerful open-source communication platform.
What is e164?
E164 format is a standard for the international telephone numbering plan that ensures each number is unique. It follows a specific structure, starting with a "+" sign, followed by the country code, and finally the local telephone number. For instance, the e164 format for a French number could be +33123456789.
Why do e164 is not matched by "_X."?
Let's consider a scenario where we aim to match an incoming call from a French number using Asterisk. Initially, we might attempt to use the pattern "_X." within our dialplan, assuming it would match any sequence of digits. However, we encounter an issue: the "+" sign, being a non-digit character, is not matched by the "_X." pattern.
Let's illustrate this with a code snippet:
exten => +33234567890,1,NoOp(Before Goto SDA de test, with ${EXTEN})
exten => +33234567890,2,Goto(sda_de_test,${EXTEN},1)
Then, lower in the file:
[sda_de_test]
exten => _X.,1,NoOp(Entering SDA de test)
same => 2,Dial(PJSIP/0123456789@trunkoftelco1)
same => n,Hangup()
In this example, the incoming call with the e164 number "+33234567890" would not be matched by the "_X." pattern in the "sda_de_test" context.
To rectify this, we need to explicitly include the "+" sign in our pattern. Modifying the pattern to "_+X." would successfully match the e164 number.
However, a more robust approach involves incorporating the entire e164 pattern directly into the extension. This eliminates the need for separate patterns and simplifies the dialplan.
[sda_de_test]
exten => +33234567890,1,NoOp(Entering SDA de test)
same => 2,Dial(PJSIP/0123456789@trunkoftelco1)
same => n,Hangup()
By specifying the complete e164 number in the extension, we ensure accurate matching and streamline call handling within our Asterisk dialplan.