Archive for the ‘ Asterisk – Dicas e Códigos ’ Category

Estou de volta!….

E nada melhor do que começar com um post de instalação de Asterisk com Debian, rs.

Source list para Debian 8

Após instalar o Debian 8 devemos trocar o repositório.

Para isso edite o arquivo /etc/apt/sources.list e substitua o conteúdo pelo abaixo:

deb http://httpredir.debian.org/debian jessie main

deb-src http://httpredir.debian.org/debian jessie main

deb http://httpredir.debian.org/debian jessie-updates main

deb-src http://httpredir.debian.org/debian jessie-updates main

deb http://security.debian.org/ jessie/updates main

deb-src http://security.debian.org/ jessie/updates main

 

Salve e feche o arquivo e execute os comandos abaixo:

apt-get update

apt-get -y upgrade
Ok, agora precisamos instalar as dependências necessárias para compilarmos o Asterisk. Execute o comando abaixo:

aptitude -y install vim php5 apache2 mysql-server mysql-client gcc g++ ncurses-dev libxml2 libxml2-dev linux-headers-`uname -r` openssl openssh-server openssh-client libnewt-dev zlib1g zlib1g-dev unixodbc unixodbc-dev libtool make tar wget build-essential

OBS: linux-headers-`uname -r` (utilize apóstrofe).

 

Instalação do Asterisk 13

Optei pela versão certified do Asterisk, mas você pode utilizar a que desejar a partir da versão 12.

Faça o download dos arquivos necessários, recomendo criar um diretório somente para estes downloads como: /usr/src/asterisk-sources/

wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-13.5.0.tar.gz

wget http://downloads.asterisk.org/pub/telephony/libpri/libpri-1.4-current.tar.gz

wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz

 

Descompacte os arquivos baixados.

tar -xvf libpri-1.4-current.tar.gz

tar -xvf dahdi-linux-complete-current.tar.gz

tar -xvf asterisk-13.5.0.tar.gz
Agora vamos iniciar o processo de instalação, instalaremos primeiro o DAHDI.

cd /usr/src/asterisk-sources/dahdi-linux-complete-2.10.2+2.10.2/

make

make install

make config

 

Agora instale a  LIBPRI

cd ../libpri-1.4.15/

make

make install

A partir da versão 12 do Asterisk você pode optar por usar o módulo SIP chan_sip, ou o novo projeto de SIP opensource PJPROJECT, para que você tenha esta opção instalaremos este módulo.

Instalar o PJPROJECT (SIP)

cd ../

wget http://www.pjsip.org/release/2.4.5/pjproject-2.4.5.tar.bz2

tar -xvf pjproject-2.4.5.tar.bz2

cd pjproject-2.4.5/

./configure –prefix=/usr –enable-shared –disable-sound –disable-resample –disable-video –disable-opencore-amr CFLAGS=’-O2 -DNDEBUG’

make dep

make

make install
Verifique se o PJPROJECT foi reconhecido pelo Asterisk

cd ../asterisk-13.5.0

Antes de executar a verificação instale as dependências necessárias para que o Asterisk instale módulos customizados, executando o comando abaixo:

contrib/scripts/install_prereq install
Agora verifique utilizando o procedimento a seguir:

./configure

make menuselect

Conforme o exemplo da figura abaixo procure pelos módulos do PJPROJECT na lista disponível.

pjprojectast

No menu  Resource Modules, procure por módulos que contenham res_pjsip, se eles estiverem disponíveis o módulo PJPROJECT foi instalado corretamente.
E para fnalizarmos vamos instalar o Asterisk.

./configure

make

make install

make samples

make config

make install-logrotate

 

Espero ter ajudado com mais este post e se tiverem alguma dúvida a respeito podem entrar em contato comigo, abraços e até o proximo.

 

Wagner Antonio Barth
wagner@barth.com.br

 

Esta é mais uma questão muito comum nos treinamentos de Asterisk, “Como fazer para retornar se é SIP ou IAX2?”.

Bem utilizando a função CUT fica muito fácil, vamos ver como:

A função CUT retorna para uma variável o valor encontrado, seguindo a seguinte regra:

CUT(<variável>,<terminador>,<posição>)

Onde:

variavel = Qualquer váriável como por exemplo a ${CHANNEL} que retorna o dispositivo solicitado;

terminador = Aqui utilizamos o delimitador utilizado no retorno da variável, por padrão é utilizado ‘-‘, mas iremos utilizar o ‘/’, pois este é o delimitador entre o Protocolo e o Dispositivo;

posição = A posição exata da busca, como no caso de um retorno de um dispositivo SIP a variável CHANNEL retorna por exemplo SIP/2000-0000000b, se utilizarmos a posição em 1 será retornado o valor SIP, e se utilizarmos o valor 2 será retornado 2000-0000000b.

[device]
; Retornar dados do canal (PROTOCOL/DEVICE@CONTEXT)
;
exten=>97,1,Set(PROTOCOL=${CUT(CHANNEL,/,1)})
        same=>n,Set(DEVICE=${CUT(CHANNEL,/,2)})
        same=>n,Set(CONTEXT=${CONTEXT})
        same=>n,NoOP(${PROTOCOL}/${DEVICE:0:4}@${CONTEXT})

 

 

 

 

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 

Nosso amigo Cristiano Valença da empresa Smile Saúde desenvolveu um código em PHP para envio de SMS utilizando placas DigiVoice VB0404 GSM, e autorizou sua publicação no Blog. Muito obrigado Cristiano.

Adicionado em 27/08/2012
– Copiar e colar o código abaixo pode não funcionar, para evitar isso coloco o arquivo para download no endereço abaixo, o arquivo  encontra-se compactado em RAR:

clique aqui para baixar o arquivo enviarMsg.rar

Código em PHP.

<?php

session_start();

if(isset($_POST[‘enviar’]))
{
$retorno = system(‘rasterisk -x \’dgv send sms ‘.$_POST[‘chip’].’ ‘.$_POST[‘destino’].’ “‘.$_POST[‘msg’].'”\”);
if(empty($retorno))
{
echo ‘<script>alert(“Mensagem enviada com sucesso!”);</script>’;
}
else
{
echo ‘<script>alert(“Falha ao enviar mensagem!”);</script>’;
}
}

?>
<html>
<head>
<title>
Envio de Mensagens Via PHP Utilizando uma Placa Digivoice VB0404GSM PCIex
</title>
<style>
*{
margin: 0px;
padding: 0px;
font-family: verdana;
}

#conteudo{
width: 200px;
margin: 10px auto auto 10px;
padding: 5px 0px 5px 15px;
border: 1px solid silver;
}

p{
text-align: center;
margin: auto auto 15px -18px;
}

label{
float: left;
width: 200px;
margin: 5px 0px 20px 0px;
font-size: 12px;
}

label input{
width: 150px;
font-size: 10px;
}

label textarea{
width: 180px;
font-size: 10px;
}

input[type=submit]{
margin-left: 25px;
}
</style>

</head>
<body>
<div id=”conteudo”>
<form name=”form1″ id=”form1″ method=”post” action=”<?php echo $_SERVER[‘PHP_SELF’]; ?>” >

<p>Envio de SMS</p>

<label> N˙mero de Destino:
<input type=”text” name=”destino” id=”destino” value=”88888888″ />
</label>

<label> Mensagem: (160 Caracteres)
<textarea name=”msg”>Insira sua mensagem aqui</textarea>
</label>

<label> Escolha o chip de saida:
<select name=”chip” id=”chip”>
<option value=”1″>Chip 1</option>
<option value=”2″>Chip 2</option>
<option value=”3″>Chip 3</option>
<option value=”4″>Chip 4</option>
</select>
</label>

<input type=”submit” name=”enviar” value=”Enviar Mensagem” />

</form>
</div>
</body>
</html>

Abraços,

 Wagner Antonio Barth
 wagner@barth.com.br
Editado: 27/08/2012

Acabo de criar alguns tutoriais que irão auxiliar a instalar placas DigiVoice e o banco de canais CB3000 TDMoE.

Qualquer dúvida que vir a surgir fiquem a vontade de perguntar e quaisquer implementações também.

Os tutoriais podem ser baixados pelo link: baixe aqui os tutoriais

 

Muito obrigado,

 Wagner Antonio Barth
 wagner@barth.com.br 

 

 

O Asterisk 10 trocou seu banco de dados AstDB da Berkley DB para o mais robusto SQLite3. Esta mudança não implicará em nenhuma alteração nos sistemas que utilizavam o Berkley Db pois foi introduzida uma ferramenta de conversão em runtime, a astdb2sqlite3, esta ferramenta pode ser instalada a partir do MenuSelect que encontra-se na seção Utils.

Fonte: ChangeLog Asterisk.

Asterisk Database
—————–
* The internal Asterisk database has been switched from Berkeley DB 1.86 to SQLite 3. An existing Berkeley astdb file can be converted with the astdb2sqlite3 utility in the UTILS section of menuselect. If an existing astdb is found and no astdb.sqlite3 exists, astdb2sqlite3 will be compiled automatically. Asterisk will convert an existing astdb to the SQLite3 version automatically at runtime.

Abraços a todos,

Muito obrigado,

 Wagner Antonio Barth
 wagner@barth.com.br 

Sempre recebo o questionamento em meus treinamentos sobre as dependências para instalar um Servidor Linux e Asterisk. Para poder ajudar a todos resolvi colocar um script que utilizo na instalação de Asterisk com Linux Debian 6.

 

Abaixo o código para o script de instalação de dependências.

 

#!/bin/sh

# Instalacao de Dependencias #

# Autor Wagner Antonio Barth #

# Data: 24/08/2011 #


# Cria Source List #

echo “

## Debian Squeeze sources.list

deb-src http://security.debian.org/ squeeze/updates main

 

## Debian security updates:

deb http://security.debian.org/ squeeze/updates main contrib non-free

deb-src http://security.debian.org/ squeeze/updates main contrib non-free

 

## Debian.org:

deb http://ftp.debian.org/debian/ squeeze main contrib non-free

deb-src http://ftp.debian.org/debian/ squeeze main contrib non-free

 

## Debian Official Repository Mirror squeeze:

deb ftp://debian.oregonstate.edu/debian/ squeeze main contrib non-free

deb-src ftp://debian.oregonstate.edu/debian/ squeeze main contrib non-free

deb ftp://debian.oregonstate.edu/debian/ squeeze-proposed-updates main contrib non-free

deb-src ftp://debian.oregonstate.edu/debian/ squeeze-proposed-updates main contrib non-free

” > /etc/apt/sources.list

 

# Atualizar Debian #

aptitude update

aptitude -y upgrade

 

#  Instala Dependencias  #

aptitude -y install vim php5 apache2 mysql-server mysql-client gcc g++ ncurses-dev libxml2 libxml2-dev linux-headers-‘uname -r’ openssl openssh-server openssh-client libnewt-dev zlib1g zlib1g-dev unixodbc unixodbc-dev libtool make tar wget

 

Crie um arquivo dependencias.sh com o script acima.

Altere suas propriedades com chmod 777 e execute na console do Linux utilizando ./dependencias.sh

Lembre que seu servidor Linux Debian deve estar conectado a internet para que seja possível instalar as dependências.

Abraços,

   Wagner Antonio Barth
 wagner@barth.com.br

É possivel encaminhar e receber SMS utilizando placas GSM da DigiVoice, modelo VB0404-GSM.

Vou dar um exemplo de envio de SMS utilizando o Asterisk, iremos criar um arquivo de texto contendo a mensagem que será enviada por SMS, este arquivo será utilizado pelo dialplan do Asterisk, assim que um peer (ramal) digitar o código de envio de sms.

A partir de um ramal, o usuário irá digitar o código para envio de SMS seguido do telefone de destino, no nosso exemplo um número de telefone celular local.

Exemplo:

123488888888 discado a partir de um ramal do PBX-IP Asterisk.

Onde:

1234 é o código e 88888888 o número do telefone celular de destino.

[from-internal-custom]
;envio de sms
exten => _1234.,1,System(find /tmp/sms.cfg)
exten => _1234.,n,NoOP(${SYSTEMSTATUS})
exten => _1234.,n,GotoIf($["${SYSTEMSTATUS}" == "SUCCESS"]?sim:nao)
exten => _1234.,n(sim),ReadFile(SMS=/tmp/sms.cfg)
exten => _1234.,n,DgSendSMS(g1,${EXTEN:4:8},${SMS})
exten => _1234.,n,PlayBack(beep)
exten => _1234.,n,Hangup()
exten => _1234.,n(nao),PlayBack(vm-sorry)
exten => _1234.,n,Hangup()

Para receber um SMS pelo PBX-IP Asterisk podemos utilizar o exemplo abaixo, onde ao ser recebido um SMS o mesmo será salvo no diretório /tmp.

As regras devem pertencer ao contexto de entrada da placa de GSM.

[from-pstn-custom]
;receber sms
exten => dgv_sms,1,NoOP(SMS RECIVED FROM: ${DGV_SMS_FROM} at ${DGV_SMS_DATE}
(${DGV_SMS_TIME}): ${DGV_SMS_TEXT})
exten => dgv_sms,n,System(echo "--- New message ---" >> /tmp/"${DGV_SMS_FROM:3}")
exten => dgv_sms,n,System(echo "From: ${DGV_SMS_FROM}" >> /tmp/"${DGV_SMS_FROM:3}")
exten => dgv_sms,n,System(echo "Received: ${DGV_SMS_DATE}(${DGV_SMS_TIME})" >> 
/tmp/"${DGV_SMS_FROM:3}")
exten => dgv_sms,n,System(echo "Message: ${DGV_SMS_TEXT}" >> /tmp/"${DGV_SMS_FROM:3}")
exten => dgv_sms,n,System(echo " " >> /tmp/"${DGV_SMS_FROM:3}")
exten => dgv_sms,n,Hangup()




O recebimento do SMS ficará conforme o exemplo abaixo:
--- New message ---
From: 01188888888
Received: 12/01/11(10:46:53)
Message: Mensagem enviada pela placa GSM DigiVoice
 

Abraços.

   Wagner Antonio Barth
 wagner@barth.com.br