Aug
Uma das facilidade mais utilizadas em telefonia é a de bloquear um determinado ramal para que não faça ligações enquanto o usuário não estiver na sala.
Este bloqueio é feito pelo usuário do ramal habilitando e desabilitando com o uso de um código e senha diretamente no ramal que será bloqueado.
Irei descrever como configurar esta facilidade utilizando o AstDB, um banco de dados padrão do Asterisk e que utiliza a arquitetura de família e chaves.
Para que o usuário possa habilitar ou desabilitar o cadeado será necessário que ele utilize uma senha, esta senha deverá ser cadastrada préviamente do próprio telefone, portanto vamos ao contexto que irá permitir criar as senhas de usuário.
Como funciona este contexto:
– Para criar uma senha de usuário basta digitar 99, será solicitada a senha e ao final será ouvido um beep.
– Caso o ramal já possua senha de usuário a ligação será desconectada.
– Para apagar a senha existente digite 991234 a partir do ramal (mude esta extenção).
Crie este contexto ao final do arquivo extensions.conf.
[accountcode] ; criar senha de usuario ; exten=>99,1,Set(PROTOCOL=${CUT(CHANNEL,/,1)}) same=>n,Set(DEVICE=${CUT(CHANNEL,/,2)}) same=>n,NoOP(${PROTOCOL}/${DEVICE:0:4}) same=>n,GotoIF($["${DB(accountcode/${PROTOCOL}/${DEVICE:0:4})}"=""]?create-accountcode:end) same=>n(create-accountcode),Answer() same=>n,BackGround(vm-password) same=>n,Read(password) same=>n,Set(DB(accountcode/${PROTOCOL}/${DEVICE:0:4})=${password}) same=>n,Answer() same=>n,Wait(1) same=>n,PlayBack(beep) same=>n,Hangup() same=>n(end),PlayBack(vm-goodbye) same=>n,Hangup() ; apagar senha de usuario ; exten=>991234,1,Set(PROTOCOL=${CUT(CHANNEL,/,1)}) same=>n,Set(DEVICE=${CUT(CHANNEL,/,2)}) same=>n,Set(DB(accountcode/${PROTOCOL}/${DEVICE:0:4})="") same=>n,Answer() same=>n,Wait(1) same=>n,Playback(beep) same=>n,Hangup()
Agora iremos criar o contexto que habilita e desabilita o cadeado.
Como funciona este contexto:
– Para habilitar o cadeado disque a partir do ramal o código 50, será solicitada a senha de usuário que se digitada corretamente habilitará o cadeado, um beep confirmará a ação.
– Para desabilitar o cadeado disque 51, será solicitada a senha de usuário e a confirmação será informada com um beep.
Insira o contexto ao final do arquivo extensions.conf.
[cadeado] ;habilitar cadeado ; exten=>50,1,Answer() same=>n,Wait(1) same=>n,BackGround(vm-password) same=>n,Read(password) same=>n,Set(PROTOCOL=${CUT(CHANNEL,/,1)}) same=>n,Set(DEVICE=${CUT(CHANNEL,/,2)}) same=>n,NoOP(${PROTOCOL}/${DEVICE:0:4}) same=>n,GotoIF($["${DB(accountcode/${PROTOCOL}/${DEVICE:0:4})}"="${password}"]?lock) same=>n,Hangup() same=>n(lock),Set(DB(cadeado/${PROTOCOL}/${DEVICE:0:4})=1) same=>n,Wait(1) same=>n,PlayBack(beep) same=>n,Hangup() ;desabilitar cadeado ; exten=>51,1,Answer() same=>n,Wait(1) same=>n,BackGround(vm-password) same=>n,Read(password) same=>n,Set(PROTOCOL=${CUT(CHANNEL,/,1)}) same=>n,Set(DEVICE=${CUT(CHANNEL,/,2)}) same=>n,NoOP(${PROTOCOL}/${DEVICE:0:4}) same=>n,GotoIF($["${DB(accountcode/${PROTOCOL}/${DEVICE:0:4})}"="${password}"]?unlock) same=>n,Hangup() same=>n(unlock),Set(DB(cadeado/${PROTOCOL}/${DEVICE:0:4})=0) same=>n,Wait(1) same=>n,PlayBack(beep) same=>n,Hangup()
Nos meus cursos de Asterisk utilizo um exemplo de discagem com Macro, esta macro testa se o ramal escolhido esta disponível, ocupado ou indisponível, iremos adicionar as regras que irão validar antes de discar se o cadeado foi habilitado ou não.
Insira esta macro antes dos demais contextos no arquivo extensions.conf.
[macro-discainterno] exten=>s,1,Set(PROTOCOL=${CUT(CHANNEL,/,1)}) same=>n,Set(DEVICE=${CUT(CHANNEL,/,2)}) same=>n,NoOP(${PROTOCOL}/${DEVICE:0:4}) same=>n,Set(CADEADO=${DB(cadeado/${PROTOCOL}/${DEVICE:0:4})}) same=>n,GotoIF($["${CADEADO}"<"1"]?Dial) same=>n,Hangup() same=>n(Dial),Dial(${ARG1}/${ARG2},${ARG3}) same=>n,Goto(call-${DIALSTATUS}) ; same=>n(call-NOANSWER),PlayBack(naoatende) same=>n(call-NOANSWER),VoiceMail(${ARG2},u) same=>n,Hangup() ; same=>n(call-BUSY),PlayBack(ocupado) same=>n(call-BUSY),VoiceMail(${ARG2},b) same=>n,Hangup() ; same=>n(call-CHANUNAVAIL),PlayBack(indisponivel) same=>n(call-CHANUNAVAIL),VoiceMail(${ARG2},b) same=>n,Hangup()
Ainda no plano de discagem crie as regras de discagem entre ramais, como no exemplo abaixo, e adicione os contextos cadeado e accountcode:
[interno] include=>cadeado include=>accountcode
; Discar para ramais SIP ; exten=>_2XXX,1,Macro(discainterno,SIP,${EXTEN},20) same=>n,Hangup() ; Discar para ramais IAX2 ; exten=>2001,1,Macro(discainterno,IAX2,2001,20) same=>n,Hangup() ; Discar para ramais FXS a partir de interfaces DigiVoice ; exten=>3000,1,Macro(discainterno,DGV,63,30) exten=>3001,1,Macro(discainterno,DGV,64,30)
Abraços a todos e sintam-se a vontade para compartilhar ou dirimir dúvidas.
Muito obrigado,
Wagner Antonio Barth wagner@barth.com.br |