Início > Programação, Telecom > Monitor Realtime + Asterisk

Monitor Realtime + Asterisk

Bom só quem brincou com AMI no Asterisk sabe como é complicado, Eventos jogados na tela nada parece ter sentido uma avalanche de informações sem padrões definidos, construir aplicações genéricas se torna uma missão. 

Eu iniciei a pouco mais de dois anos um projeto monitor em Realtime a principio era para monitoramento só para verificar quem estava fazendo ou recebendo ligações, pensei “Moleza Delphi + Socket + AMI”. 

Dores e mais dores de cabeça na época tinha um link R2 com uma placa da digium rodando com o Unicall para quem tinha placa E1 Digium era a única saida de conversar com a sinalização R2. Então olhando o retorno do AMI iniciei um esboço de como pegar o retorno no buffer do meu Socket em Delphi 6.0 e montar algo bonitinho para usuários ficarem vendo tudo que acontece de atividade no canal Unicall do Asterisk !! 

Então vamos ver o que um core show channels verbose nos retorna !! 

Channel              Context              Extension        Prio State   Application  Data                      CallerID        Duration Accountcode BridgedTo
UniCall/16-1         default              1579                1 Up      Bridged Call SIP/6007-00f839c0         80151333623971                       SIP/6007-00f839c0
SIP/6007-00f839c0    default              80151333623971     22 Up      Dial         Unicall/g1/0151333623971  6007            00:02:40             UniCall/16-1
UniCall/14-1         default              1599                1 Up      Bridged Call SIP/6004-00d2fe00         80151938622970                       SIP/6004-00d2fe00
SIP/6004-00d2fe00    default              80151938622970     22 Up      Dial         Unicall/g1/0151938622970  6004            00:03:52             UniCall/14-1
UniCall/11-1         default              1599                1 Up      Bridged Call SIP/6006-00ea6650         80151335689403                       SIP/6006-00ea6650
SIP/6006-00ea6650    default              80151335689403     22 Up      Dial         Unicall/g1/0151335689403  6006            00:05:18             UniCall/11-1
SIP/6008-00e46a10    default                                  1 Up      Bridged Call UniCall/12-1              1938323241                           UniCall/12-1
UniCall/12-1         default              91000               3 Up      Queue        atendimento|r|||90        1938323241      00:06:10             SIP/6008-00e46a10
UniCall/10-1         default              1599                1 Up      Bridged Call SIP/6002-00f034c0         881895124                            SIP/6002-00f034c0
SIP/6002-00f034c0    default              881895124          22 Up      Dial         Unicall/g1/81895124       6002            00:06:37             UniCall/10-1
UniCall/13-1         default              1599                1 Up      Bridged Call SIP/6005-00f15800         808007771007                         SIP/6005-00f15800
SIP/6005-00f15800    default              808007771007       22 Up      Dial         Unicall/g1/08007771007    6005            00:09:02             UniCall/13-1
12 active channels
6 active calls

Bagunça !!!! 

Então a idéia seria filtrar essa bagunça e procurar por palavras chaves Criando uma funçao Busca para isso !!

Function BuscaTexto(Text,Busca : string) : string;
var n : integer;
begin
  for n := 1 to length(Text) do
    begin
       if Copy(Text,n,length(Busca)) = Busca then
          begin
             Result := ‘ok’;
             RetornoBuscaPos:=n;

          end;

    end;
end;

Agora eu poderia pegar dentro do Buffer do socket qualquer palavra chave como a “Unicall/g1”  e depois caminhar com um ponteiro para recortar isso em qualquer lugar e depois só teria que colocar o valor no GRID. 

Entao como ficaria: 

if BuscaTexto(Msg,’Unicall/g1/’) = ‘ok’ then
        begin
        if Copy(Msg,86,RetornoBuscaPos-79) = ‘Unicall’ then
          //pega o ramal que originou a chamada
          MainForm.StringGrid1.Cells[0,contador]:= Copy(Msg,5,RetornoBuscaPos-82);
          //pega o numero discado para fora destino ‘ ‘Unicall/g1/’
          MainForm.StringGrid1.Cells[1,contador]:= Copy(Msg,97,RetornoBuscaPos-71);

  
Extremamente Trabalhoso Marinheiro de Primeira viagem um colega de cuiaba o Juniou tbm embarcou nessa aventura ele mal dormia, por fim segue algumas telas depois de todo o trabalho …   

voip-monitor 

Tela com opção de verificar chamadas recebidas

programa-asterisk  

Monitor 

Assim tudo em AMI eu teria o retorno de 5 em 5 segundos do comando “core show channels verbose” na qual montaria a tela de ligações em um intervalo de 5 em 5 segundos…. 

Até a Proxima

Eng Eder de Souza

  1. Cesar
    fevereiro 22, 2010 às 7:50 pm

    Hola ed.
    Es posible probar ese software?

  2. Hugo Branquinho de Carvalho
    maio 26, 2010 às 5:31 pm

    Boa tarde Eder. Muito interessante esse programa de monitoramento… Gostaria de saber se o código fonte dele está disponivel ?

    Abrcs
    Hugo

  3. Roberval
    dezembro 2, 2010 às 3:05 pm

    você pode enviar o fonte dess eprograma para mim estou precisando d algo…assimm

    • ederwander
      dezembro 10, 2010 às 8:05 pm

      Roberval este código eu tornei proprietário no ano de 2006-2007, o projeto em delphi não é complicado da trabalho mas não é complexo na data em questão ele foi feito para só existentes versões 1.2.X do asterisk depois que vendi os direitos do código não atualizei para novas versões por falta de tempo, mas participo de vários outros projetos livres para desenvolvimento de um monitor realtime web, espero poder disponibilizar logo só preciso de mais tempo !!

      []’s

      Eng Eder de Souza

  4. Tiago
    novembro 21, 2012 às 2:07 pm

    ainda não é possivel disponibilizar esse exemplo?

  5. Jonas
    maio 20, 2013 às 12:18 pm

    Ola! Você vende estes fontes?

  6. Augusto Cardoso
    dezembro 7, 2013 às 9:16 pm

    Olá, você usou qual protocolo, telnet, ssh? Qual componente usou?

    • ederwander
      dezembro 8, 2013 às 8:14 am

      Protocolo tcp, simulando conexão telnet, você faz isso abrindo um socket, mas se preferir simplificar o método de conexão use o componente indy.

      • Augusto Cardoso
        dezembro 10, 2013 às 11:51 pm

        Olá Eder Wand, tou tendo problema em enviar um enter para uma nova linha, quando envio o comando via telnet. Podes me dar uma dica?

  7. IVAN LIBERATO
    junho 5, 2015 às 11:39 am

    Bom Dia, eder voce tem este projeto ainda ou tem algo parecido?

  8. agosto 21, 2015 às 11:15 am

    Bom dia, vc ainda possui este software, se sim, qual o valor para venda???

  1. No trackbacks yet.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: