Configurazione di Asterisk per gestire l'indicazione di interno occupato
Cos'e` il BLF?
Il BLF (Busy Lamp Field) e` quella funzione che consente ad Asterisk di indicare, su telefoni SIP adatti, lo stato dell'impegno delle linee interne facendo accendere i led sui telefoni per indicare quali interni sono occupati, o stanno suonando, o sono in attesa.
Configurazione in extensions.conf
Per ogni interno che si vuole monitorare, occorre aggiungere una riga che dice:
exten => <numero>,hint,<canale>
Dove il numero e` quello dell'interno, e il canale e` lo stesso che passerei al comando dial per chiamare l'interno.
Esempio: se ho un interno 11 che e` connesso via SIP, avro` una configurazione di questo tipo:
[interni] exten => 11,hint,SIP/11 exten => 11,1,Dial(SIP/11|40|) exten => 11,102,Busy()
Si nota che la riga "hint" (che non e` necessario che si trovi in un ordine particolare rispetto alle altre) ha come numero di interno l'11 e come canale gli stessi della riga "dial" che c'e` sotto. Vale la pena di notare inoltre che la parola "hint" non e` un comando, in quanto si trova nella posizione del numero di sequenza e non nella posizione del comando.
Configurazione in sip.conf
In sip.conf occorre indicare, nella sezione [general] oppure nella definizione di ogni telefono SIP in grado di visualizzare lo stato delle linee, una riga che indica qual'e` il context (riferito al file extensions.conf) dal quale attingere le informazioni sugli interni impegnati.
La riga in questione e`
subscribecontext=<context>
Esempio:
; Grandstream gpx2000 [11] type=friend context=interni username=11 secret=password11 host=dynamic dtmfmode=info callerid= "Studio" <11> canreinvite=no pickupgroup=1 callgroup=1 mailbox=1 subscribecontext=interni
Variazioni per Asterisk 1.4 1.6 e 1.8
In Asterisk 1.4 1.6 e 1.8 il BLF non funziona con telefoni SIP se non aggiungendo alcune configurazioni che riguardano il Call Limit (limite di chiamate contemporanee) in SIP.conf.
Nella sezione generale:
[general] notifyringing = yes notifyhold = yes limitonpeers = yes
E poi in ogni telefono:
type=friend call-limit=2
Il valore di call-limit puo` essere oggettivamente sensato (1 o 2 per un analogico, o 6 per un gxp-2020 che ha 6 "linee" virtuali) oppure arbitrariamente alto e quindi non raggiungibile (per dire, 100) pero` deve essere impostato, altrimenti non funziona nulla.
A questo punto dovrebbero funzionare le notifiche per gli stati di "in linea", "sta suonando" e "in attesa".
Si puo` vedere lo stato in cui Asterisk pensa si trovi il telefono usando il comando "core show hints" in console.
Uso del BLF per indicare qualcosa che non sia lo stato di una linea (asterisk 1.4 1.6 e 1.8)
Recentemente ho fatto un setup in asterisk 1.4 dove uso il BLF (su telefoni GXP-2020) per indicare cose che non sono lo stato di una linea, quanto per esempio l'attivazione o meno di una funzione (giorno/notte, ridirezione delle chiamate, messaggi presenti in segreteria, ecc).
Vediamo come funziona... (tutti gli esempi si applicano al file extensions.conf)
Prima di tutto, impariamo che lo stato di un "hint" puo` essere legato a un record nel database interno di Asterisk, con una riga di questo tipo: "exten => 4,hint,Custom:pippo" inserita nel context dove sono registrati i nostri interni. Chiaramente in questo caso il "4" non e` un interno, e` un numero come un altro che nel telefono Grandstream potro` usare per configurare un tasto rapido "asterisk BLF".
Ora, se impostiamo un tasto in un telefono Grandstream come "asterisk BLF" e gli diamo come numero il 4, vedremo che il tasto mostra lo stato e permette anche di eseguire funzioni. Specificamente, il tasto puo` essere (con il firmware attuale) tenuto acceso verde fisso (stato IDLE), rosso fisso (stato BUSY) e rosso lampeggiante (stato RINGING). Lo stato di un hint cosi` configurato puo` essere impostato con il comando set(devstate) o scrivendo direttamente nel database interno di asterisk. Ad esempio, un comando per impostare lo stato nel dialplan puo` essere: exten => _*4XX,1,Set(DEVSTATE(Custom:pippo)=BUSY). Analogamente posso usare Set(DB) o da console i vari comandi "database", utili per vedere anche in che stato mi trovo ora.
- Ci dobbiamo ricordare che il tasto cosi` impostato sul telefono Grandstream, se premuto, chiamera` il numero "4" nel caso sia verde o rosso fisso, e chiamera` il numero "**4" nel caso i cui sia rosso lampeggiante. Possiamo usare queste extension per fare delle cose in asterisk quando il tasto viene premuto!
Esempio pratico: mostrare la presenza di messaggi in due diverse caselle di voicemail, e permettere l'accesso alle stesse premendo due tasti BLF appositamente programmati sul telefono GXP-2020.
- Programmare due tasti BLF sul GXP 2020 con i numeri "4" e "5"
- Inserire in extensions.conf, dentro al context degli interni, due righe per settare lo stato degli hint per i numeri 4 e 5:
exten => 4,hint,Custom:segpla exten => 5,hint,Custom:segcon
- Inserire in extensions.conf un apposito context che poi includeremo in vari posti, il quale ad ogni fine di chiamata (stato "h") si occupi di risettare i valori dei devstate che poi sono quelli che "pilotano" i due hint qui sopra. Il problema qui e` che non ho modo (o non sono capace di farlo) di dire ad Asterisk "ogni volta che cambia lo stato dei messaggi nuovi presenti in segreteria, devi modificare il devstate per questi device qui". Per farlo, quindi, ho deciso, visto che non consuma tanto tempo, di aggiornare lo stato ad ogni fine di chiamata, sia questa una chiamata entrante da fuori (che puo` aver inserito un messaggio in segreteria) o una chiamata interna (che puo` avere sia inserito che ascoltato un messaggio della segreteria). E` un metodo sprecone, la funzione viene chiamata spesso inutilmente, ma funziona. In questo context, di fatto, si dice "se nella segreteria 2 ci sono zero messaggi, setta il devstate custom:segcon a IDLE, altrimenti a BUSY". La stessa cosa viene fatta per la segreteria 1 per il devstate custom:segpla.
; ########################################## ; context set-status-segreteria ; ########################################## [set-status-segreteria] ; questo context include l'estensione "h" che viene eseguita ; dopo l'hangup, lo includo nei context interni e misdn ; in modo che dopo l'hangup di ogni chiamata fra interni e dalla linea ; esterna aggiorni lo stato degli hint per mostrare se ci sono messaggi ; nelle segreterie exten => h,1,ExecIf($[${VMCOUNT(2)}=0]|Set|DEVSTATE(Custom:segcon)=IDLE) exten => h,n,ExecIf($[${VMCOUNT(2)}>0]|Set|DEVSTATE(Custom:segcon)=BUSY) exten => h,n,ExecIf($[${VMCOUNT(1)}=0]|Set|DEVSTATE(Custom:segpla)=IDLE) exten => h,n,ExecIf($[${VMCOUNT(1)}>0]|Set|DEVSTATE(Custom:segpla)=BUSY)
- Includere il context qui sopra indicato dentro ai context degli interni e delle chiamate da fuori a dentro.
- Inserire da qualche parte (nel context degli interni tipicamente) anche due extensions per fare si` che chiamando i numeri 4 e 5 si possano ascoltare le due segreterie. Cosi` facendo quando si preme il tasto del GXP2020 relativo ad una segreteria, la si ascolta anche.
; Chiama il 4 per ascoltare la segreteria PLA (1) exten => 4,1,VoicemailMain(s1@default) exten => 4,n,Hangup ; Chiama il 5 per ascoltare la segreteria CON (2) exten => 5,1,VoicemailMain(s2@default) exten => 5,n,Hangup
Se e` stato tutto fatto bene, ad ogni fine di comunicazione (comando hangup o comunque disconnessione del canale) i comandi nel context qui sopra verranno eseguiti, e imposteranno lo stato dei due pulsanti BLF in modo da renderli rossi se ci sono messaggi nella segreteria relativa. Premendo i tasti sara` possibile riascoltare i messaggi delle due segreterie.