Asterisk/FreePBX E.164 FQTN-Normalisierer mit konfigurierbaren Ländercodes
In unserem vorherigen Beitrag FreePBX/Asterisk rule for splitting Telefonica/O2 ‘To:’ header haben wir detailliert beschrieben, wie man die DID für eingehende Anrufe von O2 SIP-Trunks bestimmt.
Die resultierende DID kann jedoch immer noch eines der folgenden Formate annehmen, je nachdem, welche Nummer vom Anrufer gewählt wird:
12345670891234567+498912345670049891234567
O2/Telefonica SIP-Trungs werden diese Nummern in keiner Weise normalisieren, aber dies verursacht Probleme mit dem FreePBX Inbound-Route-Matcher.
Wenn Sie beispielsweise eine Inbound-Route für 0891234567 konfiguriert haben, wird sie nur übereinstimmen, wenn der Anrufer exakt 0891234567 anruft. Wenn der Anrufer +49891234567 wählt, wird die Inbound-Route nicht übereinstimmen, obwohl sie zur gleichen Telefonnummer gehört.
Um dieses Problem zu lösen, können wir einen FreePBX E.164 FQTN-Normalisierer verwenden, um die eingehende Nummer in das E.164-Format zu normalisieren.
FreePBX 15 bietet standardmäßig nur den from-pstn-e164-us-Normalisierer, der fest auf die Unterstützung von US-Nummern codiert ist und die O2-spezifische Split-Regel nicht enthält (die für viele, wenn nicht die meisten anderen SIP-Trunk-Provider funktionieren sollte).
Die folgende Dialplan-Konfiguration, die Sie zu /etc/asterisk/extensions_custom.conf hinzufügen können, wird die eingehende Nummer in das E.164-Format normalisieren und hat konfigurierbare Länder- und Ortsnetzkennzahlen (am Anfang der Datei).
[from-pstn-toheader-o2]
exten => _.,1,Set(COUNTRY_CODE=49) ; Set the country code
exten => _.,n,Set(AREA_CODE=89) ; Set the area code
; Split "To:" header, e.g. "08912345;telefonica=xyz@..." or "08912345@telefonica"
exten => _.,n,Set(TOHEADERNUM=${CUT(CUT(CUT(PJSIP_HEADER(read,To),\;,1),@,1),:,2)})
; Debug the original number
exten => _.,n,NoOp(Original TOHEADERNUM: ${TOHEADERNUM})
; Handle numbers without a prefix (short numbers) (except for numbers with "+" prefix)
exten => _.,n,ExecIf($["${TOHEADERNUM:0:1}" != "0" & "${TOHEADERNUM:0:1}" != "+"]?Set(TOHEADERNUM=+${COUNTRY_CODE}${AREA_CODE}${TOHEADERNUM}))
; Handle numbers starting with 00 => convert to +
exten => _.,n,ExecIf($["${TOHEADERNUM:0:2}" = "00"]?Set(TOHEADERNUM=+${TOHEADERNUM:2}))
; Handle numbers starting with just ONE zero (local numbers): 0891234 => +49891234
exten => _.,n,ExecIf($["${TOHEADERNUM:0:1}" = "0"]?Set(TOHEADERNUM=+${COUNTRY_CODE}${TOHEADERNUM:1}))
; Note: No need to handle numbers such as +498912345, already in E.164 FQTN format
; Debug the final normalized number
exten => _.,n,NoOp(Final TOHEADERNUM after normalization: ${TOHEADERNUM})
exten => _.,n,Goto(from-pstn,${TOHEADERNUM},1)Sobald Sie diesen Dialplan als Kontext für Ihre SIP-Trunks aktiviert haben, konfigurieren Sie Ihre Inbound-Routen so, dass sie DIDs im E.164-Format haben (z.B. +49891234567) und sie werden jetzt mit den eingehenden Nummern von O2 SIP-Trunks übereinstimmen, unabhängig vom Format, das der Anrufer zum Wählen verwendet hat.