Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Diego Lincoln Campos

Desenvolvimento de identificador de chamadas

Recommended Posts

Estou com algumas dúvidas, pois ainda não consegui efetivamente desenvolver um identificador de chamadas com o Delphi. Se alguém puder me dar uma maozinha, agradecerei muito. Já consegui fazer com que o Delphi escute a seria COM1 e identifique o telefone tocando, mas meu progresso foi exclusivamente até este ponto. Consegui também fazer com que o Delphi se comunique com o modem para realizar uma chamada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

E aí galera será que ninguém pode me dar uma forcinha nesta. Já consegui fazer o PHP se comunicar perfeitamente com a porta COM1 e imprimir cupons fiscais com perfeição. Até já consegui fazer com que o PHP se conecte a COM3 (FAX MODEM), mas ainda preciso o colocar em módulo de escuta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É tá complicado, ninguém a fim de colaborar né. Mas eu sou um programador dedicado e para mim nada é impossível. Bom, já estou bem adiantado e desejo compartilhar alguns códigos, para registro. Pois sinceramente, a mais de 30 dias venho estudando a melhor forma de interagir um identificador de chamadas com o PHP.

 

É possível fazer isto sim.

 

No visual basic já consegui dar um grande passo com o componente MSCOMM mas estou esbarrando em uma variação de hardware, pois parece que nem todos os modens funcionam como identificador de chamadas.

 

O meu sistema já está identificando o RING e a data que vem do sinal da TELEMAR sem nenhum conversor DTMF-FSK, mas ainda preciso realizar um teste, colocando um destes conversores entre a linha e o fax modem. Já consigo iniciar, finalizar uma chamada, utilizando tanto o PHP quando o VB e o Delphi.

 

Consigo colocar o modem em escuta para ficar esperando uma ligação no VB, no entanto nada de identificar o número. O mais engraçado de tudo, é que instalei um sistema chamado BINA 5.0 e este sistema identifica perfeitamente a ligação. Então, não pode e não é apenas uma questão de hardwares ou conversores.

 

No VB, insira um componente MSCOMM e um Botão. Segue o código para inserir no botão (dar dois cliques sobre ele)

 

If (Connect.Caption = "&Connect") Then ' This menu item will open or close the com port

On Error GoTo 0

If Not Comm1.PortOpen Then ' Open the comm port if not already open

Comm1.PortOpen = True

End If

 

If Not Comm1.PortOpen Then ' if there is a problem opening the port

MsgBox "Cannot open comm port " & Comm1.CommPort ' display an error first

End ' bail out of the program

End If

 

' Initialize communications and update app UI

Comm1.DTREnable = True

Comm1.RTSEnable = True

Comm1.RThreshold = 1 ' Generate a receive event on every character received

Comm1.InputLen = 1 ' Read the receive buffer 1 char at a time

bOK = False

bError = False

Comm1.Output = vbCr + "ATZ" + vbCr ' Send command to put Identifier in event mode and receive serial number

Wait

If bOK Then

bOK = False

bError = False

Comm1.Output = " ATDT" & Text1.Text & Chr$(13) 'Turn on caller id events

Wait

If bError Then

MsgBox "Port " + Comm1.CommPort + ": Modem not Caller ID enabled"

Comm1.PortOpen = False ' Close the port and update app UI

Connect.Caption = "&Connect" ' Change the menu to reflect opposite of port status

ElseIf bOK Then

Connect.Caption = "Dis&connect" ' Change the menu to reflect opposite of port status

End If

Else

MsgBox "Port " + Str(Comm1.CommPort) + " not responding"

Comm1.DTREnable = False

Comm1.RTSEnable = False

Comm1.PortOpen = False ' Close the port and update app UI

Connect.Caption = "&Connect" ' Change the menu to reflect opposite of port status

End If

 

Else

Comm1.DTREnable = False

Comm1.RTSEnable = False

Comm1.PortOpen = False ' Close the port and update app UI

Connect.Caption = "&Connect" ' Change the menu to reflect opposite of port status

End If

Text2.Text = "Ligação Inicializada"

 

Quem puder ajudar, basta fornecer o e-mail que envio o código-fonte completo para análise e juntos, quem sabe, conseguirmos implementar uma BINA com o PHP.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camarada, não é porque ninguém respondeu que quer dizer que ninguém queira ajudar. Você está desenvolvendo algo muito específico, naturalemente a maioria não conhece nada sobre a área.

 

Você está desenvolvendo de fato em Delphi ou PHP?

 

no código em VB que você postou, o importante acontece aqui:

If bOK Then
 bOK = False
 bError = False
 Comm1.Output = " ATDT" & Text1.Text & Chr$(13) 'Turn on caller id events
 Wait
 If bError Then
   MsgBox "Port " + Comm1.CommPort + ": Modem not Caller ID enabled"
   Comm1.PortOpen = False ' Close the port and update app UI
   Connect.Caption = "&Connect" ' Change the menu to reflect opposite of port status
 ElseIf bOK Then
   Connect.Caption = "Dis&connect" ' Change the menu to reflect opposite of port status
 End If
Else
 MsgBox "Port " + Str(Comm1.CommPort) + " not responding"
 Comm1.DTREnable = False
 Comm1.RTSEnable = False
 Comm1.PortOpen = False ' Close the port and update app UI
 Connect.Caption = "&Connect" ' Change the menu to reflect opposite of port status
End If

 

com foco em:

Comm1.Output = " ATDT" & Text1.Text & Chr$(13) 'Turn on caller id events

que, segundo o comentário, ativa os eventos de identificação de chamadas.

 

e aqui:

  If bError Then
   MsgBox "Port " + Comm1.CommPort + ": Modem not Caller ID enabled"
   Comm1.PortOpen = False ' Close the port and update app UI
   Connect.Caption = "&Connect" ' Change the menu to reflect opposite of port status
 ElseIf bOK Then

que trata o erro de ativação do identificador de chamadas do modem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

amigo, se te ajuda existe um componente especifico pra isso

com modelos de exemplos e o aparelho que faz a junção

nao é gratuito, parece que você tem que comprar o aparelho que nao é tao caro, eu comprei ele pra usar em sistema de moto taxi que presto serviços de informatica

 

http://www.shapephone.com.br/soundbina/micDTMF1.html

 

neste site ai tem umas informações

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agradeço a todos. Acredito que todos podemos nos unir, pois realmente é uma coisa muito complicada de se fazer e se entender. No VB6 eu já consegui interpretar algumas informações do fax/modem sem o auxílio de um hardware específico, mas só funciona em alguns modens. O que eu não consigo entender é que comprei um modem CALLER ID e ele nem se quer responde ao BINA. Sei que o padrão DTFM é utilizado no Brasil e comprei um corversor DTMF/FSK apenas para eliminar problemas. Resultado: não funcionou.

 

Algumas conclusões que cheguei em mais de três meses de pesquisa a fundo. Conversores DTMF/FSK é besteira. Não funcionam em fax/modem. A placa de fax/modem SOFT MODEM PCI SL 2801 FUNCIONA EM VB - PHP E DELPHI PARCIALMENTE pois só consegui coletar a data de dentro do sinal DTMF que vem pela linha telefônica. O número propriamente dito, ainda não consegui capturar. O Identificador de chamadas instalado na linha - FUNCIONA PERFEITAMENTE. O Identificador de chamadas está conectado após o fax/modem para não interferir no sinal de entrada. O FAX MODEM AGERE WIN MODEM mesmo sendo CALLER ID não funciona. No sistema que verifica se o modem possui o recurso de identificador de chamadas, denominado modemsetup.exe reconhece apenas o Agere e não o Soft, o que me confunde de certa forma. O hypertrm.exe do Windows XP funciona perfeitamente no Windows 7 e reconhece todos os comandos. Bom valos aos principais comandos que o modem responde:

 

1. ATDT00000000 - Inicia uma ligação para o número 00000000

2. AT+VCID=1 - Coloca o modem em módulo de escuta

2. ATH0 - Finaliza a ligação (retira do gancho)

 

Existem vários outros comandos, mas não nos levam a lugar algum. No php, já consegui fazer com que o sistema realize uma chamada direto do banco de dados MySQL sem a utilização de qualquer componente que seja. Instale o XAMPP no windows e insira o seguinte código:

 

<?

$device = "COM3";

$ddddisca = "$ddd"; // se for com DDD diferente da sua localidade

$numerodisca = "$mysql"; // qualquer número

 

exec("mode $device BAUD=9600 PARITY=n DATA=8 STOP=1 xon=off octs=off rts=on");

 

$comport = fopen($device, "r+b");

 

if ($comport === false) {

die ("PORTA SERIAL INDISPONÍVEL");

} else {

echo "<font size='1' color='#CCCCCC' face='Verdana'>CONEXÃO SERIAL COM3 » STATUS ESTABELECIDA<br></font>";

}

 

stream_set_blocking($comport, 0);

 

$atcmd = "ATDT$numerodisca\r"; // Bom, aqui será definida a variável a ser discada ($numerodisca)

if (fwrite($comport, $atcmd ) === false) {

die ("A PORTA SERIAL COM3 NÃO PODE SER ACESSADA");

} else {

echo "<font size='1' color='#CCCCCC' face='Verdana'>CHAMADA REALIZADA » <b>$numerodisca</b> UTILIZANDO O FAX/MODEM DTMF</font>";

}

sleep(3);

fclose($comport);

?>

 

 

Bem, esta rotina é no PHP que ainda tem algumas limitações mas se comunica perfeitamente com a porta COMM (no caso, meu modem está configurado para a COMM3).

 

Agora no VB (delphi é muito similar) vamos ver o que está acontecendo no sistema.

 

No evento do botão CONECTAR tenho o seguinte código:

 

Private Sub Connect_Click()

 

If (Connect.Caption = "&Connect") Then ' This menu item will open or close the com port

On Error GoTo 0

If Not Comm1.PortOpen Then ' Open the comm port if not already open

Comm1.PortOpen = True

End If

 

If Not Comm1.PortOpen Then ' if there is a problem opening the port

MsgBox "Cannot open comm port " & Comm1.CommPort ' display an error first

End ' bail out of the program

End If

 

' Initialize communications and update app UI

Comm1.DTREnable = True

Comm1.RTSEnable = True

Comm1.RThreshold = 1 ' Generate a receive event on every character received

Comm1.InputLen = 1 ' Read the receive buffer 1 char at a time

bOK = False

bError = False

Comm1.Output = vbCr + "ATZ" + vbCr ' Send command to put Identifier in event mode and receive serial number

Wait

If bOK Then

bOK = False

bError = False

Comm1.Output = "AT+VCID=1" + vbCr 'Turn on caller id events

Wait

If bError Then

MsgBox "Port " + Comm1.CommPort + ": Modem not Caller ID enabled"

Comm1.PortOpen = False ' Close the port and update app UI

Connect.Caption = "&Conectar" ' Change the menu to reflect opposite of port status

ElseIf bOK Then

Connect.Caption = "Dis&conectar" ' Change the menu to reflect opposite of port status

End If

Else

MsgBox "Port " + Str(Comm1.CommPort) + " not responding"

Comm1.DTREnable = False

Comm1.RTSEnable = False

Comm1.PortOpen = False ' Close the port and update app UI

Connect.Caption = "&Conectar" ' Change the menu to reflect opposite of port status

lblStatus.Caption = "INATIVO"

lblStatus.ForeColor = &HFF&

End If

 

Else

Comm1.DTREnable = False

Comm1.RTSEnable = False

Comm1.PortOpen = False ' Close the port and update app UI

Connect.Caption = "&Conectar" ' Change the menu to reflect opposite of port status

lblStatus.Caption = "INATIVO"

lblStatus.ForeColor = &HFF&

End If

Text2.Text = "O Sistema de Monitoramento COM3 está ativado"

lblStatus.Caption = "Open"

lblStatus.ForeColor = &HC000&

End Sub

 

 

Funciona perfeitamente, mas só consigo buscar as informações da data em que a ligação está sendo recebida. Em um forum que não me recordo no momento encontrei uma sugestão para modificar os logs do modem antes da instalação. Mas sinceramente, não cheguei a nenhum resultado concreto.

 

Localizar o arquivo .INF dentro da pasta correta do driver do seu modem. Abrir com o notepad.

Para achar a parte onde as Respostas do CID (Responses) são 'ensinadas' ao modem, é mais fácil procurar por "NMBR". Parece com isso aqui:

 

HKR, Responses, "TIME = ", 1, 94, 00, 00,00,00,00, 00,00,00,00

HKR, Responses, "NMBR = ", 1, 95, 00, 00,00,00,00, 00,00,00,00

HKR, Responses, "NAME = ", 1, 96, 00, 00,00,00,00, 00,00,00,00

HKR, Responses, "MESG = ", 1, 97, 00, 00,00,00,00, 00,00,00,00

 

 

Porque então o modem falha para interpretar o NMBR? porque ele está recebendo um carriage return e um line feed antes do NMBR, assim no log:

 

"<cr><lf>NMBR = 17188881234"

 

o que ele não compreende.

 

A solução poderia ser aumentar uma linha como essa no INF:

 

HKR, Responses, "<cr><lf>NMBR = ", 1, 95, 00, 00,00,00,00, 00,00,00,00

 

 

Mas eu resolvi adicionando estas duas linhas no INF:

 

HKR,Responses,"<cr>",1, 01, 00, 00,00,00,00, 0,0,0,0

HKR,Responses,"<lf>",1, 01, 00, 00,00,00,00, 0,0,0,0

 

Bom, é isto aí e mais uma vez, agradeço a colaboração de todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.