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.
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.
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
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.
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)
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".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.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.
exten => 4,hint,Custom:segpla exten => 5,hint,Custom:segcon
; ########################################## ; 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)
; 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.