Asterisk HINT/BLF em Realtime


Eu estava trabalhando em deixar o HINT/BLF em realtime, há algumas semanas por isso aqui vai algumas dicas, na expectativa de mais alguém ter está necessidade e nos ajudar a melhorar o código. 

Mudanças necessárias para o sip.conf: 
  • notifyringing deve ser definido como "yes"; 
  • tanto rtcachefriends e rtupdate definido como "yes"; 
  • limitonpeers deve ser definido como "yes". 

Alterações na tabela SIP Table, inserir as seguintes colunas: 
  • "call-limit" do tipo "int";
  • "subscribecontext" do tipo "varchar(80)"

o "subscribecontext" tem de ter o mesmo nome do contexto em que o comandos estão, eu uso "[blf_pbx]". A minha necessidade é de fazer uma "Terminal Inteligente" Virtual.  Eu já disponibilizei aqui uma maneira de fazer o HINT/BLF funcionar em um aparelho da Khomp o "IPS 212". Claro que esta solução é toda desenvolvida no "extensions.conf" ou no "extensions.ael" de maneira manual ou seja para cada extensão telefônica adcionada no seu PBX IP você tem obrigatoriamente que incluir no "subscribecontext".  Mas se você (como eu) estiver usando "ARA" (Asterisk Realtime Architecture) isto acaba sendo uma incoveniente. Este ponto de vista de fazer o HINT/BFL dinamico é na verdade um Shell Script que fica sendo executado no CRON. Caso você venha a alterar o Shell Script de maneira que fique melhor agradeceria em compartilhar aqui no post. 

Caso queira mudar o nome do contexto, pode fazê lo no Shell Script na linha que escrevemos o "switch => realtime/@".  

Em seguida ele escrevera o necessário nos arquivos extensions.conf ou extensios.ael, ou seja, de maneira dinâmica. 
"exten => ,hint,SIP/".


appenddynamic()
{
  mysql -u dbusername -pdbpassword -h dbhostname dbname -se "select distinct(context) from extensions" | grep -v '^context$' | while read context; do
    echo "[$context]" >> $ASTCONF
    echo "switch => Realtime/@" >> $ASTCONF
    if [ $context = "target_context" ]
    then
        echo "exten => 100,hint,SIP/100"
        echo "exten => 101,hint,SIP/101"
    fi
    echo "" >> $ASTCONF
  done
}

Eu realmente espero que faz algum sentido para alguém.

Ishfaq Malik
Software Developer
PackNet Ltd

Fonte: Lista de Discussão Asterisk Developer.
Share:

Usando reSIProcate para conectar Asterisk com WebRTC.

Post Por Daniel Pocock.
Como em um mundo tradicional, "não-WebRTC", o proxy SIP simplesmente facilita chamar entre todos os clientes que ele conhece. Na prática, as implantações geralmente deseja adicionar funcionalidade adicional na forma de um PBX com filas, correio de voz, menus e conferência.

O Asterisk 11,12 e 13 inclui "suporte para WebRTC" embora ainda está evoluindo e eu atualmente não recomendo ligar Asterisk diretamente à Internet pública. Em particular, o Asterisk não suporta recursos como autenticação mútua de TLS com o transporte (WebSocket seguro) WSS. Aqui, nós olhamos como "Repro" pode aceitar conexões de usuários de Internet/Web e retransmiti-las para um servidor Asterisk interno. Aqui está um diagrama da arquitetura:



Observe que as mensagens SIP são aceitos sobre o transporte "WebSocket do Repro" e retransmitida para Asterisk ao longo de um transporte regular SIP TCP. Isso significa que nós nos beneficiamos de suporte "TLS de Repro" também, para que o cliente WebSocket tem uma chance muito maior de escapar do seu firewall do lado do cliente, se a porta 443 é usada (fazer o Repro ser um servidor HTTPS) e os clientes podem ser autenticados com certificados em sua navegador.

Aqui estão os passos para fazê-lo funcionar:


Servidor com Repro e reTurn

Configurar Repro para rodar em um servidor Debian. Verifique se os clientes podem falar com Repro. A pergunta que surge cada vez mais nos dias de hoje: qual é a maneira mais rápida para rodar o "WebRTC" e vê-lo trabalhar? Como pode um desenvolvedor web começar a experimentar WebRTC no seu blog ou demonstração site?
Boa notícia: não é mais necessário copilar ele - e muitos dos componentes estão disponíveis em sistemas baseados em Debian Server (incluindo Ubuntu Server) ou soluções baseadas em RPM, como o Fedora e CentOS.
Vamos a uma rápida verificação de como é fácil, explico abaixo:
# apt-get update
# apt-get install -t experimental repro resiprocate-turn-server
# apt-get install -t unstable chromium sipml5-web-phone
# cd /var/www && mkdir jssip && cd jssip
# wget -r -nH http://tryit.jssip.net
# vim /etc/repro/repro.config
# vim /etc/reTurnServer.config
# vim /var/www/jssip/js/custom.REMOVE_THIS.js

e, em seguida, tentar navegar para "/jssip" ou "/sipml5-web-phone".

Comece com um SIP Proxy

Como explicado no guia "RTC Quick Start" para RTC regular, um proxy SIP é um componente limpo e simples para começar. O mesmo é realmente necessário para WebRTC: iniciar com um proxy. Há dois Vou enfatizar aqui:
  • Repro da reSIProcate é rápido e fácil de configurar e tem suporte embutido TLS. A versão 1.9 alpha com o apoio WebSocket para WebRTC acaba de ser carregado para o "Debian" e está pronto para ser usado em produçãoe. Usuários RPM só precisa baixar o "arquivo tar" e usar rpm build para obter pacotes a partir dele.
  • Kamailio fornece suporte muito bom WebRTC também. Os pacotes estão disponíveis, mas devido a problemas de licença GPL devem ser recompilados com TLS, consulte o arquivo "README" do Kamailio para mais detalhes. Também fiquem a vontade para usar o repositório de "pacotes binários que incluem TLS".

Obter um servidor TURN

servidores TURN, ajudam o fluxo da mídia atravessar NAT. Eles são muito fáceis de configurar, mas devem ter endereços IP reais.

Colocar o JavaScript no servidor Web

Adicionando WebRTC a um Web site pode ser tão simples como cortar e colar um código JavaScript no HTML.
Três amostras de trabalho para começar com:
  • Use o pacote de telefone web "SIPml5" no Debian e adicione a um host virtual, procure "/sipml5-web-phone"
  • Use wget para buscar uma cópia do "JsSIP". Você vai ter uma página de amostra tipo está "tryit.jssip.net". Então edite os arquivos "custom.js" fornecido e altere o endereço do SIP Proxy.
  • QoffeeSIP é outra alternativa.

Browser

Os usuários precisam de um navegador recente. Os últimos Browsers como Google Chrome, Firefox, Opera, IE9 devem funcionar muito bem.

Instalando e configurando Asterisk

Digium, os criadores do Asterisk, atualmente não estão mais apoiando pacotes para Debian e seus forks (Ubuntu), mas eles não fornecem pacotes RPM em seus repositórios de pacotes do "Asterisk".
No entanto, os pacotes binários pré-compilados para Asterisk 11.4 não incluem suporte SRTP. SRTP é uma parte obrigatória do WebRTC. Portanto, tomamos o RPM Fonte (SRPM) e vamos construí-lo manualmente.
Em primeiro lugar, é recomendado que você comece com um servidor CentOSX completamente limpo ou RHELX. Eu construí uma máquina virtual no meu ambiente.  Depois de instalar e configurar uma senha de root, configurar o yum para acessar "EPELX" (eu usei o CentOS6, logo vou usar o EPEL6).
Certifique-se de SELinux e firewall estão desativados de fato (que muitas vezes são ativadas por padrão). Uma maneira rápida de fazer isso:
# sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config
# reboot
...

# iptables -I INPUT -j ACCEPT

Em seguida, você pode fazer "YUM" sobre o repositório Digium e instalar todas as dependências necessárias para a construção de Asterisk:
# rpm -Uvh http://packages.asterisk.org/centos/6/current/x86_64/RPMS/asterisknow-version-3.0.0-1_centos6.noarch.rpm
# yum update
# yum install rpm-build libsrtp-devel

Em seu diretório pessoal, configurar uma árvore de trabalho para "rpm build":
$ mkdir ~/rpmbuild
$ cd ~/rpmbuild
$ mkdir BUILD BUILDROOT RPMS SOURCES SPECS SRPMS
$ cd SPECS
$ wget http://danielpocock.com/sites/danielpocock.com/files/asterisk.spec
$ cd ../SRPMS
$ wget http://packages.asterisk.org/centos/6/asterisk-11/SRPMS/asterisk-11.4.0-1_centos6.src.rpm
$ rpmbuild --rebuild asterisk-11.4.0-1_centos6.src.rpm

Nesta fase, você vai ter alguns erros, mas veja que foi extraído com sucesso o arquivo no diretório de SOURCES:
$ ls -l ../SOURCES
-rw-r--r--   1 daniel daniel 11573400 May 20 23:07 asterisk-sources-11.4.0.tar.gz
$

Ele também irá reclamar dependências que estão faltando, você vai instalar fazendo uso do YUM:
yum install make gcc gcc-c++ ...

Observe que você tenha baixado uma versão ligeiramente modificada do arquivo asterisk.spec, as razões para isso são explicados nesta lista de discussão . O que se segue agora deve desencadear uma compilação bem-sucedida:
$ rpmbuild -bb \
  --without tds \
    --without misdn \
    --without odbc \
   ~/rpmbuild/SOURCES/asterisk.spec

Felizmente, Digium adicionou o suporte SRTP nas versões 12 e 13 não sendo necessário fazer a compilação que estamos fazendo aqui para o Asterisk 11.4.1.

Configuração do Asterisk: aplicação demo

Aqui só temos de instalar os RPMs e fazer uma alteração rápida da configuração:
$ cd ~/rpmbuild/RPMS/x86_64
$ su -
# rpm -i asterisk*rpm
# yum install asterisk-sounds-core-en-ulaw asterisk-sounds-extra-en-ulaw --enablerepo=asterisk-11
# ln -s /usr/share/asterisk/sounds/demo-* /var/lib/asterisk/sounds/en/

Para habilitar conexões do proxy, precisamos definir algumas configurações não padrão. É essencial para usar o transporte TCP. Como as mensagens SIP de clientes WebSocket são geralmente muito grande para pacotes UDP.  Também é necessária permitir SRTP e AVPF, uma vez que estes são obrigatórios em WebRTC. Aqui uma comparação no arquivo padrão do "/etc/asterisk/sip.conf":

--- /etc/asterisk.orig/sip.conf 2013-06-04 10:57:49.428617785 +0200
+++ /etc/asterisk/sip.conf 2013-06-04 11:18:17.825604261 +0200
@@ -207,7 +207,7 @@
 ; subject to change in any release.  If they are changed, the changes will
 ; be reflected in this sample configuration file, as well as in the UPGRADE.txt file.
 ;
tcpenable=no                    ; Enable server for incoming TCP connections (default is no)
tcpenable=yes                    ; Enable server for incoming TCP connections (default is no)
tcpbindaddr=0.0.0.0             ; IP address for TCP server to bind to (0.0.0.0 binds to all interfaces)
                                 ; Optionally add a port number, 192.168.1.1:5062 (default is port 5060)
 
@@ -1371,6 +1371,13 @@
 ; ...
 ;
 
[1001](public-phone,ulaw-phone)
avpf = yes
encryption = yes
context = public
icesupport = yes


 ; Standard configurations not using templates look like this:
 ;
 ;[grandstream1]

Isso pressupõe que o ID de usuário SIP do seu utilizador WebSocket é 1001. Agora você pode executar o Asterisk:
# service asterisk start

Configurando o SIP Proxy Repro para enviar chamadas para Asterisk

Isto é uma demonstração relativamente simples. O objetivo é enviar chamadas para o número 1000 para o aplicativo de demonstração em Asterisk
Na interface web do Repro, clique em Adicionar rota no menu. Utilize os seguintes parâmetros e deixar todas as outras opções em branco:
  • URI: ^sip:([0-9]+)@
  • Destination: sip:$1@pbx.example.org?transport=tcp
Nota: substituir pbx.example.org com o nome ou o endereço IP do Asterisk para o trunk. Vá para o link do menu ADD USER e adicionar um usuário chamado 1001. O ID de usuário e senha devem ser colocadas no arquivo custom.js para JsSIP.

Testando a partir JsSIP

Presumo JsSIP foi criado seguindo as instruções anterior. Asterisk não suporta o CODEC vídeo de um cliente WebRTC. Para contornar isso, no arquivo "custom.js" para JsSIP, certifique-se de vídeo está desativado por padrão.
No cliente WebRTC, disque 1000. Você deve ouvir a demo saudação do Asterisk.

Solução de possiveis problemas

  • Verifique o registo de JavaScript no navegador;
  • Verifique os logs no SIP Proxy Repro e aumente a verbosidade dos logs, se necessário. Se o nível estiver definido como STACK, você vai ver cópias completas de cada mensagem SIP enviados e recebidos.
  • Conectar ao console Asterisk (comandos UNIX: rasterisco -vvvvgci) e permitir a exibição de mensagem SIP: 
    • *CLI> sip set debug on
Share:

Formas de Tarifação em Telefonia IP

Material disponibilizado por Renan Manso (Asterisk Framework Developer), bom proveito!

Sobre o tempo de tarifa:"s"

Exemplo: você determinou que custa 1.00 real a tarifa em tempo "s", então ele vai tarifar por segundo até completar o 1 real, portanto se nessa rota a pessoa falou 30 segundos então sua chamada custara 30 centavos em modo "s".

Sobre o tempo de tarifa:"c"

Em modo "c" a tarifa sera cobrada por chamada pro exemplo a pessoa ligou e ficou 30 segundos, então sera cobrado o valor do minuto inteiro. Por outro lado ela pode ficar o tempo que quiser que vai só custar 1.00 real.

Sobre o tempo de tarifa:"m"

Em modo "m" sera cobrado 1.00 a cada minuto, se você permanecer por 5 minutos sera cobrado o valor de 5 reais. E se forem 5 minutos e 10 segundos? Então sera cobrado 6.00 reais, pois foram cobrados os minutos inteiros.

Sobre o tempo de tarifa:"1m+s"

Em modo "1m+s" o primeiro minuto sera cobrado integral já no primeiro segundo, após o primeiro minuto a tarifa sera dividida por segundo. Por exemplo se você falou 1 minuto e 10 segundos sera cobrado 1,10 reais.

Sobre o tempo de tarifa:"30s+s"

Em"30s+s"sera cobrado metade do valor antes dos 30 segundos, após isso sera cobrado o segundo. Por exemplo a pessoa ficou 12 segundos sera cobrado 0.50 centavos, a pessoa ficou 32 segundos sera cobrado 0.53 centavos.

Sobre o tempo de tarifa:"30s+6s"

Em"30s+6s" sera cobrado metade do valor antes dos 30 segundos após isso sera cobrado o segundo exemplo 12 segundos na chamada.. sera cobrado 0.50 centavos, 32 segundos sera cobrado 0.60 centavos, ele sempre arredonda.

Fonte: Perfil do Renan Linkedin
Share:

Respondendo Detecção de máquina com WaitForSilence( )

Problema:
Usando WaitForSilence( ) para detectar quando iniciar o aplicativo Play( ) quando uma maquina realizar o atendimento (answering machine) da chamada em curso.

Solução:
Quando utilizando a aplicação WaitForSilence (), há três parâmetros.

SILENCE DURATION é a duração, em milissegundos, de silêncio que vamos esperar.
SILENCE OCCURANCES é o número de ocorrências do silêncio com duração em milissegundos. 
SILENCE TIMEOUT é o tempo total para a aplicação esperar após o tempo limite para liberar o controle de volta para o Dialplan (em AEL e LUA é mais rápido).


[amd-outros]
exten => 11,1,NoOp(Começando exten 11 e outras coisas)
exten => 11,n,Set(SILENCEDURATION=4300)
exten => 11,n,Set(SILENCEOCCURANCES="")
exten => 11,n,Set(SILENCETIMEOUT=38)
exten => 11,n,NoOp(SILENCEDURATION=${SILENCEDURATION})
exten => 11,n,NoOp(SILENCEOCCURANCES=${SILENCEOCCURANCES})
exten => 11,n,NoOp(SILENCETIMEOUT=${SILENCETIMEOUT})
exten => 11,n,Answer()
exten => 11,n,WaitForSilence(${SILENCEDURATION},${SILENCEOCCURANCES},${SILENCETIMEOUT})
exten => 11,n,NoOp(Retorno: WAITSTATUS=${WAITSTATUS})
exten => 11,n,Playback(br/msg_importante_vinda)
exten => 11,n,Playback(obrigado)
exten => 11,n,Wait(1)
exten => 11,n,Hangup


Associar ao arquivo chamada.call.

#Este é um exemplo de arquivo que podem ser despejados em /var/spool/asterisk/outgoing
#para gerar um chamada.call
Channel: SIP/0313939200@192.168.0.254
Context: amd-outros
Extension: 11
Priority: 1
#
Callerid: Serviço de Mensagem <(031)39392001>

Verbosity is at least 3
    -- Attempting call on SIP/03139392000 for 11@amd-outros:1 (Retry 1)
    -- Executing [11@amd-stuff:1] NoOp("SIP/0313939...", "Começando exten exten 11 e outras coisas") in new stack
    -- Executing [11@amd-stuff:2] Set("SIP/0313939...", "SILENCEDURATION=4300") in new stack
    -- Executing [11@amd-stuff:3] Set("SIP/0313939...", "SILENCEOCCURANCES=""") in new stack
    -- Executing [11@amd-stuff:4] Set("SIP/0313939...", "SILENCETIMEOUT=38") in new stack
    -- Executing [11@amd-stuff:5] NoOp("SIP/0313939...", " SILENCEDURATION=4300 ") in new stack
    -- Executing [11@amd-stuff:6] NoOp("SIP/0313939...", " SILENCEOCCURANCES= ") in new stack
    -- Executing [11@amd-stuff:7] NoOp("SIP/0313939...", " SILENCETIMEOUT=38 ") in new stack
    -- Executing [11@amd-stuff:9] Answer("SIP/0313939...", "") in new stack
    -- Executing [11@amd-stuff:10] WaitForSilence("SIP/0313939...", "4300||38") in new stack
    -- Waiting 1 time(s) for 4300 ms silence with 0 timeout
    -- Exiting with 4300ms silence >= 4300ms required
    -- Executing [11@amd-stuff:11] NoOp("SIP/0313939...", "Retorno: WAITSTATUS=SILENCE ") in new stack
    -- Executing [11@amd-stuff:12] Playback("SIP/0313939...", "br/msg_importante_vinda") in new stack
    --  Playing 'br/msg_importante_vinda' (language 'br')
    -- Executing [11@amd-stuff:13] Playback("SIP/0313939...", "obrigado") in new stack
    --  Playing 'obrigado' (language 'br')
    --  Playing 'br/msg_importante_vinda' (language 'br')
    -- Executing [11@amd-stuff:15] Wait("SIP/0313939...", "1") in new stack
    -- Executing [11@amd-stuff:16] Hangup("SIP/0313939...", "") in new stack
  == Spawn extension (amd-stuff, 11, 16) exited non-zero on 'SIP/0313939...'
    -- Hungup 'SIP/0313939...'
[Set  10 00:13:48] NOTICE[2540]: pbx_spool.c:351 attempt_thread: Call completed to SIP/03939392000@192.168.0.254

Este exemplo está configurado para testar uma variedade de atendedores de chamadas. Nós usamos o aplicativo "Set( )" para fornecer acesso fácil para alterar os parâmetros para "WaitForSilence( )".

O "WaitForSilence( ) é usado imediatamente após a "Answer( )" e o Dialplan. Vai esperar "38" segundos para uma ocorrência de silêncio com duração do "4300" milissegundos antes de retornar controle para o Dialplan.

No *CLI> a saída, nos fornece a seguinte observação -- "-- Waiting 1 time(s) for 4300ms silence'. and the next line"-- ou seja que está aguardando "4300ms" de silêncio para executar a próxima linha. Com isto o Dialplan fica aguardando a mensagem da secretária eletrônica para completar, e parar de gravar a voz ou mensagem de entrada. Observer, que cada máquina de resposta pode ter o seu próprio tempo limitador para fazer o "TimeOut" antes de desligar a chamada quando não "há áudio/voz detectada".

Para usar isso, o arquivo da chamada é movido para o "/var/spool/asterisk/outgoing". Asterisk vaz a leitura quase que imediato deste arquivo (chamada.call) e processa a chamada.

Esta aplicação define a variável de canal chamado "${WAITSTATUS}" a qualquer "SILENCE" (silencio encontrado) ou "TimeOut" (tempo limite atingido). Neste exemplo, nós estamos somente imprimindo (NoOp) "${WAITSTATUS}"  mas não estamos agindo sobre ela.


Veja também: AMD( ) , WaitForRing( ).
Share:

TCP/IP sobre MPLS

Este tutorial e uma parte do curso on-line "MPLS and Carrier Networks" da Teracom Training. Um Excelente curso para profissionais em Telecomunicações, recomendo!

Nota: Você pode achar que este tutorial e um pouco esmagador, ou que e uma descarga na tela do seu computador, sem nenhuma preparação, ou que e como cair de paraquedas em um campo de gado.

Então a nota acima foi somente para informar que se você já está familiarizado com as camadas OSI e pilhas de protocolos e pacotes IP em redes locais, você vai achar o tutorial fácil. 

Vamos analisar a imagem a baixo:
Vamos começar com o servidor do lado direito, que é um download de um arquivo para o cliente à esquerda, o software de transferência de arquivo leva um segmento do arquivo e dá-lo ao software TCP no servidor, o que inicia um temporizador, coloca um número de sequência, verificação de erro e o número da porta de origem e destino na aplicação de um cabeçalho de TCP no segmento de arquivo, e passa para o software de IP no servidor. 

O software IP no servidor cria um pacote IP, adicionando o cabeçalho IP, povoando o endereço de origem e seu endereço IP e o endereço de destino com o endereço IP do cliente à esquerda. 

O pacote IP é passado para o software do driver da camada 2 LAN no servidor, o que coloca o pacote em um quadro LAN MAC, preenche o endereço de origem com o seu endereço MAC e o destino como o endereço MAC do roteador Cliente Edge direita. 

O quadro é então sinalizou um pouco de cada vez através do cabo LAN que liga o servidor ao switch LAN, que dirige o quadro para o roteador da direita CE. 

Camada de software 2 em que router direita CE recebe o quadro MAC do Sever através do interruptor, realiza a verificação de erro, verifica-se que o seu endereço MAC é o destino, em seguida, extrai o pacote IP e passa para o software de roteamento IP no router CE. 

O software de roteamento IP do roteador CE decide que o roteador Provider Edge é o próximo hop, coloca o pacote em um quadro MAC, preenche o endereço MAC de destino com o do PE, recalcula a verificação de erros e sinaliza o quadro de um bit de cada tempo sobre Gigabit Ethernet sobre fibra circuito de acesso ao provedor de Borda do prestador de serviços, que é a entrada para a rede MPLS da operadora. 

O Provider Edge é o ingresso Label Borda Router. Ele recebe o pacote IP em um quadro MAC sobre o circuito de acesso de fibra óptica.Este dispositivo ingresso examina o endereço IP de destino no pacote e, juntamente com outros fatores, decide o que classe de equivalência Forwarding o pacote pertence, em seguida, implementa a sua decisão, empurrando um rótulo para o pacote. 

Em seguida, ele faz uma pesquisa tabela em sua Incoming Mapa etiqueta para obter o Rótulo Next Hop Forwarding entrada, determina o que LSR que os artigos com esta etiqueta são encaminhados para, e transmite o pacote rotulado em um quadro para que LSR no circuito apropriado. 

Cada LSR no meio da rede (não representado) recebe um quadro, em seguida, extrai o pacote só olha para o rótulo e executa uma consulta à tabela para determinar para onde encaminhar o pacote e, possivelmente, o que tem prioridade relativa. 

Eventualmente, o pacote rotulado é entregue ao PE do lado esquerdo, da etiqueta a saída da rede de Borda Router. Este dispositivo liberta a etiqueta fora do pacote e remove o cabeçalho MPLS, em seguida, utiliza o encaminhamento IP convencional para enviar o pacote IP num quadro MAC sobre o circuito de acesso para o roteador CE à esquerda. 

O roteador CE do lado esquerdo recebe o pacote IP em um quadro MAC, passa-o para o seu software de roteamento, que deve neste momento determinar qual estação na LAN, qual o endereço MAC, foi atribuído o endereço IP. 

Ele procura primeiro em seu cache, que é um quadro relativo endereços IP para endereços MAC. Se ele não encontrar uma entrada, ele transmite uma solicitação de resolução de endereço para todas as estações na LAN na esquerda, perguntando "quem possui este endereço IP?" O cliente responde com seu endereço MAC. O roteador premissa salva essas informações no cache, em seguida, coloca o pacote em um quadro MAC com um endereço MAC do cliente como o destino, em seguida, sinaliza o quadro um pouco de cada vez para o switch LAN-mão esquerda, que dirige o quadro para a cliente. 

Camada de software 2 no cliente recebe o quadro através do cabo LAN, extrai o pacote IP e passa para o software IP no cliente. Vendo que o endereço IP de destino no pacote é o seu endereço de IP, o software IP do cliente extrai os dados para fora do pacote e passa para o software TCP no cliente. 

O software TCP no cliente executa a verificação de erro, e, se falhar, descarta os dados. 

Entretanto, o temporizador de TCP sobre o servidor expira, de modo que o software de TCP no servidor retransmissões e todo o processo é repetido. Se o segundo tempo, a unidade de dados de protocolo recebida pelo software de TCP no cliente passa a verificação de erro, envia uma confirmação para o servidor de modo que o servidor de retransmissão pára. 

O software TCP no cliente extrai os dados da unidade de dados de protocolo TCP e parques-lo em um espaço de memória para o aplicativo identificado pelo número da porta de destino no cabeçalho TCP ... a aplicação de transferência de arquivos, que pega os dados logo após . 

Enquanto isso, o pedido de transferência de arquivos no servidor está enviando o próximo segmento do arquivo. 

Fácil como torta. 

Share:

Asterisk: Servidor de Conferência com LUA



Asterisk é um poderoso framework para construção de softswitch de Telefonia IP. No entanto, a sua configuração via "extensions.conf" para o Dialplan é um pouco chato, se você realmente gostaria de programar o seu Dialplan (por exemplo: if-then-else, ler um arquivo, executar algum programa de linha de comando...). O Diaplan também pode ser implementado usando LUA: extensions.lua.

Aqui, está a uma demo curta de como configurar no Asterisk um servidor de conferência telefônica que é acessível através de número de telefone utilizando a ITSP GVT (Internet telephony service providere o Dialplan implementado em LUA.

Então em nosso cenário temos um numero valido da ITSP onde nossos clientes vão ligar e suas chamadas serão enviadas para uma sala de conferencia telefónica.

Utilizo este código em um Asterisk 12.8.2 com um CentOS 7.

sip.conf:
[general]
allowguest=no
alwaysauthreject=yes
 
canreinvite=no

disallow=allow
allow=g711

;ITSP GVT Esta é a ligação ascendente recebida
register => LOGIN:SENHA_VONO@vono.net.br/trunk_incoming

[trunk_incoming]
type=peer
username=vono
secret=senha_vono
domain=vono.net.br
fromuser=vono
fromdomain=vono.net.br
host=vono.net.br
insecure=very
qualify=no
port=5060
nat=no
disallow=all
allow=ilbc
dtmfmode=rfc2833
context=recebe_vono
reinvite=no
canreinvite=no
extensions.lua:
extensions.lua:

  extensions = {}
  
  extensions.trunk_incoming = {
       ["_X"] = function(c, e)
    app.playback("beep")
    
    app.read("room", "conf-getconfno")
        room = channel["room"]:get()
        if room == nil then
           app.playback("beepErr")
           app.hangup()
        end
 
    app.verbose("sala de conferência " .. room .. ": " .. channel.CALLERID("num"):get() .. " entrou")
    app.playback("conf-enteringno")
    app.sayDigits(room, "f")
   
    app.confBridge(room)
    end;
}
NOTA: O Asterisk não recarrega o extensions.lua automaticamente, mesmo não usando núcleo de recarga. Após a configuração você deve recarregar o modulo na Comand Line Interface do Asterisk. Use o seguinte comando: "module reload pbx_lua.so"

NOTA: A LUA-parser em Asterisk é muito crítico. Tenha cuidado ao usar os espaços e alinhar (Indentação) o código corretamente.


NOTA: O tráfego não é criptografado com a ITSP. o correto seria usar uma segurança do tipo IPSec-tunnel.

Share:

Asterisk usando LUA: Como pré-dial e macro (incl. parameters)



Asterisk permite a implementação de um Dialplan em LUA. Ele funciona muito bem, se você está ciente de que o analisador é muito critico para ganho de recuo: passe a usar espaços ou guias. A documentação do Asterisk dá uma visão geral agradável de como usar LUA. "Macros" e "Pre-Dial-Handler" estão faltando lá, mas eles são muito úteis ... 
Aqui está o exemplo de sintaxe:

1 extensions = {
 2  ["macro-mhandler"] = {
 3      ["s"] = function(c, e)
 4          app.verbose("Hello Macro!")
 5          app.verbose("Obter parâmetro: " .. channel["ARG1"]:get())
 6      end;
 7  };
 8 
 9  predial = {
10      ["phandler"] = function(c, e)
11          app.verbose("Hello Pre-dial!")
12      end;
13  };
14 
15  default = {
16      ["_X"] = function(c, e)
17          app.dial("SIP/" .. e, nil, "B(predial,phandler,1)M(mhandler^Coloque o seu parâmetro aqui)")
18      end;
19  };
20 }
Share:

AMD ()

Sinopse

"Tentar" detectar atendedores de chamadas.

Descrição

Esta aplicação "tenta" detectar atendedores de chamadas no início de uma chamadas de saída. Basta encaminhar para esse aplicativo (Application_AMD) após a chamada ser atendida (somente chamadas originadas, é claro).
Quando carregado, AMD lê "amd.conf" e usa os parâmetros especificados como valores padrão. Esses valores padrão é substituído quando o aplicativo AMD() é chamando com parâmetros.
Esta aplicação define as seguintes variáveis ​​de canal:
  • ${AMDSTATUS} - Este é o estado de detecção do atendedor de chamadas
    • MACHINE - MÁQUINA; 
    • HUMAN - HUMANO;
    • NOTSURE - NÃO TENHO CERTEZA;
    • HANGUP - DESLIGOU.

  • ${AMDCAUSE} - Indica a causa que levou à conclusão de
    • TOOLONG - Tempo Total;
    • INITIALSILENCE - Duração do Silêncio - initialSilence;
    • HUMAN - Duração do Silêncio - afterGreetingSilence;
    • LONGGREETING - Duração da Voz Humana - Greeting;
    • MAXWORDLENGTH - número máximo de palavras - Word Count. 

Sintaxe

  AMD([initialSilence,[greeting,[afterGreetingSilence,[totalAnalysis Time,[miniumWordLength,[betweenWordSilence,[maximumNumberOfWords,[silenceThreshold,[maximumWordLength]]]]]]]]])
argumentos
  • initialSilence - É duração máxima silêncio inicial antes de saudação.  Se esse número for excedido definida como MACHINE;
  • greeting - é o comprimento máximo de uma saudação. Se esse número for excedido definida como MACHINE;
  • afterGreetingSilence - é o silêncio após a detecção de uma saudação. Se esse número for excedido definido como HUMANO;
  • totalAnalysis Time - é o tempo máximo permitido para o algoritmo para decidir se é HUMAN ou MACHINE;
  • miniumWordLength - é a duração mínima de Voz considerada uma palavra;
  • betweenWordSilence - é a duração mínima de silêncio depois de uma palavra para considerar o áudio a seguir para ser uma nova palavra;
  • maximumNumberOfWords - é o número máximo de palavras em uma saudação Se esse número for excedido definida como MACHINE;
  • silenceThreshold - Quanto tempo nós consideramos o silêncio;
  • maximumWordLength - é a duração máxima de uma palavra de aceitar. Se ultrapassado definida como MACHINE.

Uma coisa que você tem que saber é que se a caixa postal do sistema de telefonia for uma voz humana gravada, você vai ter falsos positivos, pois o AMD vai detectar como HUMAN. 

Fora isto devo lembrar que o AMD do Asterisk apesar de funcionar muito bem, ele é um aplicativo que tem como objetivo TENTAR reconhecer na RTPC se o que tem na linha comutada é um humano ou uma maquina. E não importa o tipo de maquina. Se for detectado uma maquina, ele não tem como definir se é uma Caixa postal ou uma Secretaria Eletrônica ou mesmo um serviço de aviso da operadora, tipo "Este numero mudou favor ligar para...." 

Fonte: Wiki Digium

Se você gostou deste post, recomendo que leia este também.

Asterisk™ AMD, o que é isto ?

 
Share:

Yate: um motor de telefonia de nova geração - NGN


Ola a todos. Acredito que muitos dos que seguem este blog já tenha ouvido em alguma ocasião ouvido falar ou escutado alguém falar sobre Telefonia IP (ToIP). Então para os que ouviram sobre o assunto, se trata de uma tecnologia que permite a integração em uma mesma rede - baseada no Protocolo IP - as comunicações de voz e dados. 
O bem da verdade é que esta tecnologia se encontra "no ar" desde dos finais dos anos 90, mas somente agora, alguns anos que se popularizo, e isto aconteceu graças as melhorias que foram realizadas nos sistemas de controle de qualidade da voz (QoS) e a universalização dos serviços da internet.

Quando falamos de um sistema ToIP estamos falando de um conjunto de elementos que devidamente integrados permitem prover um serviço de telefonia baseado em VoIP. Os elementos básicos que formam este sistema são: A central de Comutação (PBX), O Gateway de Comutação com a PSTN (GW-IP) e os telefones do tipo IP e Softphones.

Neste post "não" vou falar sobre os gateways, telefones ip e nem tão pouco de softphones. Vamos falar sobre a "Private Branch Exchange" (PBX) e os elementos de ToIP que de alguma forma é mais forte entre os desenvolvedores.

Existe hoje varias implementações (Open Source) de PBX IP, entre eles o que mais é utilizado sem duvida é o Asterisk, vindo em seguida do FreeSwitch, e nosso patinho feio o Yate.

Yate é um motor de telefonia de nova geração (NGN) licenciado pela GPLv2, que está focado em transmissão de voz sobre o protocolo ip (VoIP) e redes telefônicas comutadas (RTPC-PSTN), onde passamos a ter uma extensão facilmente. Voz, vídeo, dados e mensagens de texto (IM) podem ser unificados sobre o motor flexível do Yate, maximizando a eficiência das comunicações e a minimização dos custos de infraestrutura para as empresas.

Yate é utilizado preferencialmente como servidor ou cliente de Telefonia IP com:
  • Porteiro H.323 que realiza o controle de chamadas de uma zona, traduz endereços, oferece serviço de diretório, controle de admissão de terminais, controle de consumo de recurso e processa a autorização de chamadas assim como também pode encaminhar a sinalização.
  • Proxy H.323 – SIP.
  • Controlador de Sessão SIP.
  • Entrocamento SIP.
  • Servidor de registro SIP.
  • Servidor e cliente IAX.
  • Servidor e cliente SIP.
  • Servidor e cliente Jingle.
  • Servidor MGCP (Agente de chamadas).

Alem disto seu uso principal, também é ser usado como um:
  • Servidor e cliente de VoIP.
  • Servidor e cliente de Jabber.
  • Servidor de conferencia com até 200 canais de voz em una unica conferencia.
  • Servidor de Centro de Chamadas (Call Center).
  • Roteamento de VoIP a RTPC (PSTN).
  • Roteamento do PC-Telefono e Telefono-PC.
  • Comutador para SS7 (Sistema de Sinalização por canal comum n. º 7).
  • Registrador ativo e passivo para RTPC (ISDN - Redes Digitais de Serviços Integrados).
  • Registrador analógico passivo para ISDN e RBS.
  • Motor de resposta de voz interativa (IVR) muito flexível e totalmente configurável.
  • Sistema de pre-pago e pós-pago.
O projeto (na maior parte) está desenvolvido em C++ e é perfeitamente extensivo a linguagens como Python, PHP e Perl. As bibliotecas para Python, PHP e Perl são desenvolvidas e colocada a disposição dos desenvolvedores pela comunidade, a fim de facilitar o desenvolvimento de funcionalidades externas para Yate. Atualmente o YAYUPM é uma biblioteca avançada para desenvolvedor em Python e utiliza o Framework Twisted.

A partir da versão 5 foi incluído no Yate o suporte a LTE (Long Term Evolution), que é um padrão para a norma 3GPP. Definida para uns como uma evolução da norma 3GPP UMTS (3G), para outros é um novo conceito de arquitetura evolutiva (a quarta geração da tecnologia de telefonia móvel o 4G). 

Uma das vantagens que o LTE proporciona é a Evolução do Core de Pacotes (EPC), que é uma autenticação na rede "A11-IP" e por tanto deve levar a todos os tipos de trafico: voz, vídeo e dados. Porem a maioria dos trabalhos de normalização estão concentrados nos aspectos de dados de LTE e a voz ficou um pouco descuidado. O problema da normalização de voz sobre o LTE se complica quando mesclamos LTE com diferentes tipos de redes tradicionais como GSM, HSPA, CDMA2000, WiMAX e WiFi (WCDMA).

A ultima versão estável é a 5.1.0 e foi lançada em janeiro deste ano. Os que estão interessados em provar o Yate, podem encontrar os repositórios de suas distribuições favorita no site oficial.

Em resumo Yate é um softswitch preparado para ser usado em produção, e totalmente estável alem de adaptável a sua necessidade e de seus usuários.

OBS: Para maiores informações cosulte a documentação existente em yate.null.ro e docs.yate.ro.

Fonte: yate.null.ro
Share:

Aviso importante!

Não realizamos upload dos ficheiros, apenas reportamos os links que encontramos na própria Internet. Assim, toda e qualquer responsabilidade não caberá ao administrador deste blog. Este blog não tem como objetivo reproduzir as obras, apenas divulgar o que foi encontrado na Internet. Os filmes aqui informados são de cunho científico assim como as séries, as quais são produzidas para exibição em TV aberta. Uma vez que a série não tenha sido ripada de um DVD, ou seja, a mesma foi gravada do sinal de TV aberta com o respectivo selo da emissora. Não é caracterizado crime, pois a mesma foi produzida para exibição pública. Será crime quando for realizado venda desta série ou filme. Quem efetuar download de qualquer ficheiro deste blog, que não tenha seu conteúdo de base Open Source (Código Aberto), ou FOSS (Free Open Source Software), deverá estar ciente que terá 24 horas para eliminar os ficheiros que baixou. Após assistir e gostar do filme ou série, adquira o original via lojas especializadas. Se algo contido no blog lhe causa dano ou prejuízo, entre em contato que iremos retirar o ficheiro ou post o mais rápido possível. Se encontrou algum post que considere de sua autoria, favor enviar e-mail para suporte@delphini.com.br informando o post e comprovando sua veracidade. Muito obrigado a todos que fizeram deste blog um sucesso.

Creative CommonsEsta obra está licenciada sob uma Licença Creative Commons. Você pode copiar, distribuir, exibir, executar, desde que seja dado crédito ao autor original (Citando nome do autor, data, local e link de onde tirou o texto). Você não pode fazer uso comercial desta obra.Você não pode criar obras derivadas.

Google+ Followers

Nossos 10 Posts Mais Populares