4.8.5.1 Creazione di un Nuovo Context v4

Da Voismart Knowledge Base.

E' possibile creare un Nuovo Context cliccando sul pulsante 321.jpg :
Apparirà la seguente schermata:

    • Importa: Permette di sfogliare sul disco ed eventualmente importare un Context creato precedentemente
    • Nome Context: (obbligatorio) Richiede l'inserimento del nome del context
    • Descrizione: E' un campo libero in cui (anche al fine di facilitare la manutenzione futura)si andrà ad inserire una descrizione dello scopo del Context
    • Attivo: (può assumere solo i valori Si / No): Determina se il Context è attivo o meno
    • Abilita sui Telefoni: (può assumere solo i valori Si / No): Permette l'abilitazione del Context a livello degli apparecchi telefonici
    • Extensions: E' un campo multiplo, in cui possono essere caricate in sequenza tutte le extensions che andranno a costituire il Context vero e proprio

   Sc ccunc.jpg
Esempio:
Per ogni Extension devono essere specificati:

    • Label
    • Extension
    • Priorità
    • Applicazione
    • Argomenti

(vedi oltre per la definizione delle Extension ed i significati di tutti gli attributi)
Al termine dell'inserimento dei dati, questi potranno essere montati nel sistema cliccando sul pulsante “Inserisci”; l'operazione può essere abbandonata selezionando il pulsante “Annulla”, mentre il ritorno al Menu precedente è possibile cliccando sul pulsante “Indietro”

Creazione di Extensions
Ogni Context è formato da una sequenza di istruzioni elementari, che prendono il nome di Extensions.
Una extension può essere di due tipi: una sequenza di caratteri od un pattern.
Una extension del primo tipo (sequenza di caratteri), può essere un numero,ad esempio 123, e può contenere i simboli standard * e #, che sono presenti sui tastierini telefonici comuni. Per quetso motivo, la sequenza 12#89* è una extension valida. Di fatto, il nome di una extension può contenere qualsiasi lettera o cifra, ed un certo numero di caratteri speciali. Vogliate notare che alcuni telefoni VoIP possono comporre “extensions” del tipo testo arbitrario (esempio:UFFICIO). Asterisk permette la definizione di una extension di nome UFFICIO al proprio interno.
I nomi delle extension risentono delle maiuscole e delle minuscole? Sì e no.
Sono case sensitive (cioè sensibili alle maiuscole ed alle minuscole), nella misura in cui Asterisk cerca di effettuare un abbinamento (match) tra la extension che l'utente ha digitato e quelle definite in un Context. Così, se l'utente ha digitato UFFICIO dal proprio telefono VoIP, Asterisk non farà partire la sequenza di comandi che voi avete impostato sotto il nome di Ufficio. D'altro canto, non è ammesso definire come nomi di extensions lo stesso nome più volte, avendo come unica differenza tra una versione e l'altra, il fatto che alcuni caratteri siano maiuscoli in un caso e minuscoli nell'altro.Non è quindi possibile avere all'interno del sistema due Extension, di cui una sia definita come UFFICIO e l'altra come Ufficio.

Nomi di Extension predefiniti

Asterisk usa alcuni nomi di extension con significati definiti:

    • i : Invalido
    • s : Start
    • h : Hangup (riaggancio)
    • t : Timeout
    • T : AbsoluteTimeout
    • o : Operatore

Si rimanda alla documentazione delle extensions standard di Asterisk per i dettagli.

Definizione di Extensions

Diversamente da quanto avviene con i PBX tradizionali, in cui le Extensions sono associate con telefoni, interfacce, menu, ecc., in Asterisk la definizione più generale di Extension è quella di sequenza di comandi da eseguire. I comandi sono generalmente eseguiti nell'ordine determinato dalla loro priorità, ma alcuni comandi, come Dial e GotoIf, hanno la caratteristica di poter modificare la sequenza del flusso dei comandi.
Quando viene digitata una Extension, il comando con priorità 1 viene eseguito, seguito da quello con priorità 2 e così via.
Questa logica prosegue fino a quando:

    • La chiamata viene riagganciata
    • Un comando ritorna un codice -1 (errore)
    • Non esiste un comando con valore di priorità immediatamente consecutivo (Asterisk non salta i numeri mancanti)
    • La chiamata viene passata ad una nuova Extension

Nella sintassi del file extensions.conf, ogni passo dell'esecuzione è indicato nel seguente formato: exten = extension, priorità, comando (parametri)
Il segno di “=” può anche assumere la forma di freccia “=>”, come viene frequentemente incontrato in molti esempi in letteratura.
Riassumendo: ogni Context ha un nome (ad esempio, “smistamento”). In ogni Context si possono definire una o più Extensions. Per ogni extension, si definisce una serie di comandi.
Come è possibile definire queste Extensions ed i Comandi necessari per la loro esecuzione?
E' necessario editare il file extensions.conf con un editor di testo, oppure utilizzare l'interfaccia.
Le componenti di una linea di Extension sono le seguenti:

    • Extension: è la label della Extension stessa, e può essere una costante alfanumerica (sono consentite le cifre da 0 a 9, le lettere dell'alfabeto ed una serie di caratteri speciali), oppure una entità valorizzata dinamicamente (il cui valore può dipendere da una serie di condizioni esterne) Ogni linea di comando che è parte di una determinata Extension ha la stessa label.
    • Priorità: è solitamente un numero intero. E' il numero che rappresenta la posizione in sequenza di ogni linea di comando di una Extension. Il primo comando eseguibile di una Extension ha priorità 1, per cui quando Asterisk trasferisce una chiamata ad una Extension, cercherà un comando che abbia priorità 1. Se tale comando non fosse presente,l'Extension non verrà eseguita.
    Dopo aver eseguito il comando con priorità 1, Asterisk incrementerà la priorità e cercherà un comando con priorità 2, a meno che il controllo non venga passato ad una differente priorità.Se il comando con la priorità richiesta non fosse definito, si avrebbe l'interruzione della sequenza di esecuzione della Extension.
    • Comando: è il nome del comando (anche denominato “Applicazione”)che deve essere eseguito. Si veda, per riferimento, l'elenco dei comandi Asterisk.
    • Parametri: dipendono dal comando. Alcuni comandi non richiedono parametri, ed in questo caso l'inserimento dei parametri è semplicemente omesso.
    Esempio:
    exten => 123,1,Answer
    exten => 123,2,Playback(tt-weasels)
    exten => 123,3,Voicemail(44)
    exten => 123,4,Hangup

Siamo di fronte alla definizione di una Extension di nome “123”. Quando viene effettuata una chiamata all'interno 123, Asterisk risponderà alla chiamata (Answer), eseguirà un file sonoro di nome “tt-weasels”, darà all'utente la possibilità di lasciare un messaggio nella casella vocale 44, e riaggancerà.
Si noti che Asterisk non si basa sull'ordine in cui avete inserito le linee nel file extensions.conf.
Le linee possono essere anche inserite in ordine differente, dato che l'effettivo ordine di esecuzione dipende solo dal campo priorità inserito in ogni singola linea.
Lo stesso risultato dell'esempio precedente sarebbe ottenibile con la seguente definizione:

       exten => 123,4,Hangup
       exten => 123,1,Answer
       exten => 123,3,Voicemail(44)
       exten => 123,2,Playback(tt-weasels)

La definizione delle Extensions permette anche logiche più articolate, come quella riportata nell'esempio che segue, che va ad effettuare una verifica (e quindi ad intraprendere o meno la sequenza delle azioni) sulla base del Caller ID della persona chiamante, quindi con la possibilità di verificare se la chiamata viene dall'interno o dall'esterno.
Esempio:
   exten => 123/100,1,Answer()

    exten => 123/100,2,Playback(tt-weasels)

    exten => 123/100,3,Voicemail(123)

    exten => 123/100,4,Hangup()
Il significato di questa configurazione è il seguente:
L'extension 123 sarà valida solamente nel caso in cui il numero del chiamante sarà pari a 100. Infatti è possibile differenziare le operazioni relative ad un Extension in base al chiamate.
Esempio:

    exten => 123,1,Answer()
    exten => 123,2,Playback(national-message)
    exten => 123,3,Voicemail(123)
    exten => 123,4,Hangup()
    exten => 123/_00.,1,Answer()
    exten => 123/_00.,2,Playback(international-message)
    exten => 123/_00.,3,Voicemail(123)
    exten => 123/_00.,4,Hangup()

In questo esempio l'Extension 123 viene riprodotta in due formati.
Il primo formato “123” identifica tutte le chiamate effettuate verso il numero 123 da qualsiasi numero chiamante. Nel secondo formato “123/_00.” identifica tutte le chiamate effettuate verso il numero 123 provenienti da un numero telefonico che inizi con 00. Questo può essere utilizzato per differenziare le chiamate con provenienza nazionale rispetto alle chiamate con provenienza internazionale.
Ritornando alla compilazione dei campi proposti dall'Interfaccia, notiamo che per ogni Extension, devono essere specificati i seguenti campi:

    • Extension: è il nome dell'Extension, ed è un campo obbligatorio
    • Priorità: è la priorità dell'Extension, quindi determina la sequenza in cui l'Extension verrà eseguita all'interno del Context
    • Application: è il nome dell'applicazione da eseguire. Tramite una Combo Box è possibile scegliere l'applicazione voluta tra tutte le esistenti
    • Argomenti: sono gli argomenti (parametri) dell'applicazione
    • Descrizione: campo in cui è possibile inserire delle note esplicative e di memo circa l'Extension
    • Attivo: permette, se selezionato, di rendere attiva la Extension

Al termine dell'inserimento, si cliccherà sul tasto “Inserisci” se si sono introdotti dati nuovi, o sul tasto “Indietro”, se si desidera ritornare alla pagina precedente, oppure, qualora si desiderasse abbandonare l'operazione, basterà cliccare sul pulsante di “Reset”.

Funzioni di gestione delle stringhe

Lunghezza di una stringa:
${LEN(pippo)} restituisce la lunghezza della stringa pippo.
Ad esempio,
exten => 100,1,SetVar(Frutto=pera)
exten => 100,2,NoOp(${LEN(Frutto)})
exten => 100,3,NoOp(${LEN(${Frutto})})
La prima NoOp ci restituisce il valore 6 (la lunghezza della stringa “frutto”),mentre la seconda NoOp ci restituisce un valore pari a 4 (la lunghezza della stringa “Pera”).
Ecco un ottimo metodo per controllare se una stringa è vuota o pari a NULL:
Substrings

    ${pippo:offset:length} :restituisce una sottostringa della stringa pippo,che inizia all'offset offset e ci restituisce i prossimi length caratteri.

    • Se offset è negativo, viene calcolato a partire dalla fine della stringa,venendo verso sinistra
    • Se length è omesso, o è negativo, viene restituito tutto il resto della stringa a partire da offset

Esempi:

    • ${123456789:1} - ritorna la stringa 23456789
    • ${123456789:-4} - ritorna la stringa 6789
    • ${123456789:0:3} - ritorna la stringa 123
    • ${123456789:2:3} - ritorna la stringa 345
    • ${123456789:-4:3} - ritorna la stringa 678

Esempi di utilizzo:

    • exten => _NXX.,1,SetVar(areacode=${EXTEN:0:3}) - ritorna le prime 3 cifre di ${EXTEN}
    • exten => _516XXXXXXX,1,Dial(${EXTEN:3}) - ritorna tutto meno le prime tre cifre di ${EXTEN}
    • exten => 100,1,SetVar(cheVocale=4)
    • exten => 100,2,SetVar(pippo=AEIOU:${cheVocale}:1) - setta ${pippo} alla singola lettera 'U'

Concatenazione di Stringhe

Per concatenare due stringhe, basta scriverle una di seguito all'altra
${pippo}${bar}
555${ilNumero}
${prefissoTeleselezione}555${ilNumero}

Funzioni matematiche con le variabili

Per eseguire le operazioni matematiche di base con le variabili, seguire gli esempi di seguito riportati:

    exten => s,1,SetVar(QUALCHEVAR=$[${QUALCHEVAR} + 1]) ; incremento
    exten => s,2,SetVar(QUALCHEVAR=$[2 * ${QUALCHEVAR}]) ; moltiplicazione, etc...

Nel passato, veniva richiesto l'inserimento di uno spazio tra gli elementi delle espressioni $[...], ma ora non più.
Nelle versioni più recenti di Asterisk (1.2?), è disponibile anche la funzione MATH.

    exten => s,1,Set(QUALCHEVAR=${MATH(${QUALCHEVAR}+1)}) ; incremento
    exten => s,2,Set(QUALCHEVAR=${MATH(2*${QUALCHEVAR})}) ; moltiplicazione etc...

Variabili di Canale Predefinite
Esiste una famiglia di variabili di canale predefinite da Asterisk che possono e debbono essere utilizzate nelle definizioni del vostro Dialplan.
Le variabili definite da Asterisk, diversamente dalle variabili definite dall'utente, sono case sensitive, cioè distinguono tra maiuscole e minuscole.
Nota: Molte di queste variabili interne sono state convertite in funzioni nella release 1.2, per permettere il settaggio dei loro valori.

    • * ${ACCOUNTCODE}: Account code, se specificato
    • * ${ANSWEREDTIME}: L'ora in cui la chiamata ha ricevuto rispostao
    • * ${BLINDTRANSFER}: Il canale SIP attivo che ha effettuato il trasferimento cieco.
    • * ${CALLERID}: L'identificativo del chiamante corrente (Caller ID,nome e numero)
    • * ${CALLERIDNAME}: Il nome dell'identificativo del chiamante correnteo
    • * ${CALLERIDNUM}: Il numero dell'identificativo del chiamante corrente number (Nota: non è necessariamente numerico, potendo contenere anche il carattere spazio. I comandi che utilizzano questa variabile tengano conto di questa eventualità)

LE VARIABILI SOPRA DESCRITTE SONO ASSOLUTAMENTE SCONSIGLIATE da 1.2.0 in avanti e non funzionano correttamente.
Si usino, invece, ${CALLERID(numero)}e ${CALLERID(nome)}

    • * ${CALLINGPRES}: Variabile di presentazione dell'identificativo del Primario per le chiamate entranti (si veda callingpres)
    • * ${CHANNEL}: Nome del canale corrente
    • * ${CONTEXT}: Nome del context corrente
    • * ${DATETIME}: Data ed Ora corrente nel formato: DDMMYYYY-HH:MM:SS Sconsigliato da Asterisk 1.2 in poi,usare invece: ${STRFTIME(${EPOCH},,%d%mNaVH:NaVS)})
    • * ${DIALEDPEERNAME}: Nome del chiamato. Non funziona più, vedi DIALEDPEERNAME
    • * ${DIALEDPEERNUMBER}: Numero del chiamato. Non funziona più, vedi DIALEDPEERNUMBER
    • * ${DIALEDTIME}: Tempo trascorso da quando il numero è stato composto (funziona solo quando il chiamato risponde?)
    • * ${DIALSTATUS}: Stato della chiamata, vedi DIALSTATUS
    • * ${DNID}: Identificativo del numero chiamato. Vi sono limitazioni, si veda DNID
    • * ${EPOCH}: Il tempo secondo UNIX (numero di secondi trascorsi dal 1 Gennaio 1970)
    • * ${EXTEN}: L'Extension corrente
    • * ${HANGUPCAUSE}: L'ultimo codice di riaggancio su un canale Zap connesso ad una interfaccia PRI
    • * ${INVALID_EXTEN}: La Extension di cui è stata fatta la richiesta quando ridiretta alla Extension i (invalid)
    • * ${LANGUAGE}: Il linguaggio correntemente settato. Vedi il Multilinguaggio di Asterisk
    • * ${MEETMESECS}: Numero di secondi per i quali un utente ha partecipato ad una conferenza di tipo MeetMe
    • * ${PRIORITY}: La priorità corrente
    • * ${RDNIS}: IL DNIS corrente di ridirezione, cioè il Caller ID –identificativo di chiamante – che ha reindirizzato la chiamata. Vi sono limitazioni, si veda RDNIS
    • * ${SIPDOMAIN}: il dominio di destinazione SIP per una chiamata entrante (se applicabile)
    • * ${SIP_CODEC}: Usato per settare il Codec SIP per una chiamata(apparentemente non più funzionante in a Ver. 1.0.1, ok in Ver. 1.0.3 & 1.0.4, non affidabile in 1.0.2)
    • * ${SIPCALLID}: Header dell'identificativo di chiamante SIP
    • * ${SIPUSERAGENT}: Header dello user agent SIP
    • * ${TIMESTAMP}: Data ed ora corrente nel formato YYYYMMDD-HHMMSS
    • * ${TXTCIDNAME}: Risultato dell'applicazione TXTCIDName (vedi oltre)
    • * ${UNIQUEID}: Identificativo univoco della chiamate corrente
    • *${TOUCH_MONITOR}: usato per lo "one touch record" (si veda features.conf, e i wW dial flags). Se una delle due parti lo ha impostato, allora la variabile contiene app_args per app_monitor, altrimenti assume per default il valore di WAV||m

Regole delle Extension
Nomi delle Extension
Le Extension di un Dialplan possono essere semplici numeri come “412” o“0”, ma possono anche essere alfanumerici, come “Giovanni” o “A93”.Sebbene un normale telefono IP non possa comporre una Extension come “Giovanni” (anche se qualche modello lo consente), spesso la vostra logica di Dialplan prevederà il salto da una Extension ad una Extension non immediatamente consecutiva, e per questi salti potreste trovare vantaggio nel definire nomi di Extension indipendentemente dalla loro componibilità a livello di tastiera.
I telefoni con tastiera numerica non hanno solo le cifre da 0 a 9, ma possono avere tasti come “*” e “#”. Alcuni telefoni a toni (DTMF) hanno anche quattro lettere in più (A, B, C e D). Se all'interno del vostro impianto sono presenti apparecchi con queste caratteristiche, potrete trarne vantaggio nella personalizzazione della vostra configurazione.
Nota: Affinché una Extension sia attivata non appena venga digitato il carattere “#”, dovrete usare una regola di Extension (vedi oltre). Asterisk, normalmente, non riconosce il carattere “#” come un carattere qualsiasi,anche se esso è presente su tutte le tastiere dei telefoni a toni.
Patterns (maschere) ed Extensions

I nomi delle Extensions non si limitano ai semplici “numeri” di estensione veri e propri. Una Extension può anche essere definita in modo tale da essere soddisfatta da un insieme di valori appartenenti ad un dato sottoinsieme dei valori possibili secondo una maschera (pattern matching).
Nel file extensions.conf, ad esempio, un nome di Extension è un pattern (una maschera) se inizia con il carattere trattino basso (underscore, “_”). In una maschera di Extension, alcuni caratteri hanno significati particolari,come descritto di seguito.

Caratteri speciali per il Pattern Matching

    • X :il confronto è soddisfatto da qualsiasi cifra da 0 a 9
    • Z : il confronto è soddisfatto da qualsiasi cifra da 1-9
    • N : il confronto è soddisfatto da qualsiasi cifra da 2-9
    • [1237-9] : il confronto è soddisfatto da qualsiasi cifra o lettera indicata tra parentesi (in questo esempio, 1,2,3,7,8,9)
    • .(punto): wildcard, il confronto è soddisfatto da qualsiasi carattere,uno o più
    • ! : wildcard, il confronto è soddisfatto da qualsiasi carattere, zero o più (solo Asterisk 1.2 e successive, vedi nota).

Nota: il punto esclamativo, disponibile solo in Asterisk 1.2 e seguenti, ha un comportamento particolare. Esso permette il soddisfacimento del criterio non appena la cifra digitata permette il riconoscimento non ambiguo (univoco) di una Extension nel context. Questa caratteristica è stata introdotta, ad esempio, al fine di fare in modo che non appena le cifre digitate corrispondono alla sequenza “001800” la linea telefonica uscente viene attivata e viene utilizzato l'overlap dialling (con pieno feedback audio da “earlyb3”) etc.
Context “uscente”

Extension                    Descrizione

001800NXXXXXX         Chiamate gratuite via VoIP negli USA

_X!                              Chiamate uscenti normali, con overlap dial

Esempio:
Si consideri il seguente context:

Context “routing"

Extension               Descrizione

_61XX                     Ufficio di Dallas
_63XX                     Ufficio di Dallas
_62XX                     Ufficio di Huntsville
_T[1-3]XX                Ufficio di San Jose
_T[04-9]XX              Ufficio di Los Angeles

Questo Context, che ha il nome “routing”, invia chiamate ai diversi server in funzione della Extension corrispondente. Questa organizzazione ha deciso che tutti i propri interni (Extensions) siano lunghi 4 cifre. Se un utente compone un numero interno che inizia con 61 o 63, verrà collegato all'ufficio di Dallas; se il numero composto inizia con 62, verrà instradato verso l'ufficio di Huntsville, qualsiasi chiamata che inizi con 71, 72 o 73 andrà a San Jose, mentre qualsiasi numero composto che inizi con 70, 74, 75, 76, 77, 78 o 79 verrà reindirizzato all'ufficio di Los Angeles.

Altri esempi di pattern:

    • _NXXXXXX: è soddisfatto da qualsiasi normale numero telefonico a 7 cifre
    • _1NXXNXXXXXX:è soddisfatto da qualsiasi prefisso e numero telefonico preceduto da 1
    • _9011: è soddisfatto da qualsiasi sequenza di almeno cinque caratteri che inizi con 9011, ma non dalla sola sequenza 9011
    • _#: è soddisfatto dall'introduzione di un solo #

Attenzione:
Non utilizzate mai un pattern del tipo “_.”, dato che esso sarebbe soddisfatto da qualsiasi sequenza, comprese le Extensions speciali di Asterisk quali i, t, h, etc.
Si utilizzi, invece, una maschera tipo ”_X.” o “_X”, che non è soddisfatta dalle Extensions speciali.

Callback

Per attivare il servizio di callback, è necessario modificare il context che gestisce le linee in ingresso su cui si vuole attivare il servizio callback(context default imbound):
Context con l'aggiunta della funzione di callback:

    'i' => 1. Queue(operatori)
    's' => 1.Set(CDR(calldirection)=INCOMING)
              2. AGI(voismartnotte)
              3. AGI(cid_lookup)
              4. Answer()
              5, DeadAgi(callback)
              6. Set(notte=${DB(ServizioNotte/status)})
              7. GotoIf(${notte}?8:9)
              8. Goto(notte|s|1)
              9. Wait(1)
              10. BackGround(messagesivr/voismart-genintro)
              11. Queue(operatori)
    't' => 1. Queue(operatori)
    '_XXXX.' => 1. Goto(s|1) '_fw.' => 1. Goto(outgoing|0${EXTEN:2}|1)
    Include => 'Voismart_blacklist'
    Include => 'telefoni'

L'extension da aggiungere è quindi: DeadAgi (callback)