Resumen Detectar llamadas entrantes   (3 mensajes )

El lunes pasado tuve la necesidad de hacer exáctamente lo que pides.
Lo logré, pero no estoy conforme con la forma.

Te cuento:

Hay 2 maneras de detectar el ring del teléfono:
1- Usando TAPI (Telephone Aplication Program Interface).
2- Usando el control MSCOMM para trabajar con el modem.

En el primer caso no pude avanzar demasiado porque todavía no entiendo bien
como funciona sobre todo el tema de los CallBacks.

En el segundo caso parece bastante fácil, se abre el puerto que está
conectado con el modem y en el evento OnComm se espera que la propiedad
CommEvent del objeto MSCOMM venga con el valor comEvRing, pero en mi caso
(U.S. Robotics 33.600 interno) este evento no se produce nunca.
Busqué la solución de otra manera verificando qué eventos se producen al
recibir una llamada y el único evento que se producía era comEvReceive.
Entonces me fijé en qué caracteres venían por el puerto y me encontré con
que decía RING cada vez que sonaba el teléfono. La solución entonces fue
detectar la entrada de la palabra RING por el puerto de comunicaciones que
tienen conectado el modem.

Específicamente debes poner la propiedad RThreshold = 1 para que el evento
OnComm se ejecute cada vez que recibes 1 caracter e ir procesándolo. El
puerto debe estar abierto durante todo el tiempo de ejecución del programa.

Las desventajas de este método son:
1- Probablemente no funcione con cualquier modem
2- Al tener abierto el puerto todo el tiempo no puedes usar otro programa.

Usando TAPI estas ventajas desaparecerían.

Te cuento que necesité hacer un programa con estas características ya que
pusimos una línea 0-800 (que atiendo personalmente) y necesito registrar
todas las llamadas que ingresan. Pero como hago otras cosas, y no estoy
pendiente del teléfono, quería que el programa de registro apareciera
automáticamente al momento de recibir una llamada y que el levantar el tubo
ya estuviera disponible un registro indicando la fecha y hora de la llamada,
listo para registrar los resultados. Lo tengo funcionando desde el martes.

Me gustaría que me contaras cual es tu proyecto.


Peky.
------------------------------------------------
e-mail <peky@satlink.com>

-----Original Message-----
De: Pere Fortea <pfnredes@redestb.es>
Para: vb <vb-esp@ccc.uba.ar>
Fecha: Miércoles 28 de Enero de 1998 17:46
Asunto: (VB-ESP) Modem llamadas entrantes HELP


> Hola amigos de la lista.
>
> Estoy creando una aplicación y me gustaría que cuando mi aplicación
> detectara dos RINGS telefónicos me avisase (tipo cuando el Fax está
activo).
>
> Agradecería cualquier ejemplo o consejo gracias a todos.
>
> Pere
>
>
>


At 21:46 28/01/98 +0100, Pere Fortea wrote:
>Hola amigos de la lista.

HOLA

>Estoy creando una aplicación y me gustaría que cuando mi aplicación
>detectara dos RINGS telefónicos me avisase (tipo cuando el Fax está activo).
>
>Agradecería cualquier ejemplo o consejo gracias a todos.
>
>Pere
>
>
RESPUESTA A TU PROBLEMA

Puedes tener dos tipos de módem. Puede ser, aunque no es lo normal, que te
envíe por un hilo de la conexión RS-232 la señal RING (Patilla 22 del
conector SubD-25. El SubD-9 ni la trae, pues ya te digo YA no es normal).
Como va a la lista analizo esta posibilidad para generalizar la solución.

 Pones un MSComm (con Name = MSComm1) y en su procedimiento OnComm analizas
si el CommEvent se ha producido por efecto de la señal Ring

Private Sub MSComm1_OnComm()
Static contador As Integer

If MSComm1.CommEvent = comEvRing Then
contador = contador + 1
End If

If contador = 2 Then
contador = 0 'lo dejas preparado para la próxima llamada
' AKI tu código. El mío pone en la etiqueta Label3 "HAN SONADO 2 TIMBRAZOS"
Label3.Caption = "HAN SONADO 2 TIMBRAZOS"
End If

End Sub

Sin embargo no es normal en un módem moderno que exista esa patilla, por lo
que para avisar que está recibiendo el timbre, envía por la entrada de
datos (RxD, pin 2 si es SubD-9, 3 si es SubD-25) una cadena de caracteres.
Lo normal y programado de fábrica para esa cadena es RING. Pero cuidado, se
puede cambiar con la programación del Módem. Supongamos que no se ha
cambiado y es RING. Esta cadena la envía el módem justo en el momento en
que deja de tocar el timbre.

Haz lo mismo, mete un MSComm de nombre MSComm1 y pon en su procedimiento
OnComm el siguiente código:
---
Dim entrada As String
Dim I As Integer
Dim A As String

'Analizas si el que ha producido el evento OnComm es la recepción de
caracteres
If MSComm1.CommEvent = comEvReceive Then

entrada = MSComm1.Input

 'como el MSComm te puede enviarr mas de un caracter de un golpe, destripas
'la cadena que te envía para anlizarla letra a letra

    For I = 1 To Len(entrada)
    A = Mid(entrada, I, 1)
'aqui eliminas CRs, LFs, espacios y otros posibles caracteres de control
        If Asc(A) > 32 Then
        salida = salida & A
        End If
    Next I

'salida es una variable que irá engordando según se vayan recibiendo
caracteres
'para evitarlo, y dado que solamente necesitas dos timbrazos, nos quedamos
'con los 8 caracteres que tiene a la derecha

salida = Right(salida, 8)
If UCase(salida) = "RINGRING" Then
Label3.Caption = "HAN SONADO DOS TIMBRAZOS"
' AKI netes el código que a tí te interese
End If

End If

End Sub
------

Probado. Funciona.

Perdonad que me haya extendido

Saludos desde San Sebastian de los Reyes (Madrid)

Luis Suárez

Te envío esta pequeña aplicación. He tenido que hacersela para un par de
colegas
que no sé que les pasa que no les funcionó. Yo empleo esta forma de
detectar el RING en varias aplicaciones y nunca he tenido problemas con
ningín tipo de módem (Detecto la palabra RING. )

Espero que te sirva

Saludos
Luis Suárez
VERSION 4.00
Begin VB.Form Form1
   Caption = "Detector de Rings telefónicos"
   ClientHeight = 3105
   ClientLeft = 2025
   ClientTop = 2040
   ClientWidth = 6105
   Height = 3510
   Left = 1965
   LinkTopic = "Form1"
   ScaleHeight = 3105
   ScaleWidth = 6105
   Top = 1695
   Width = 6225
   Begin VB.CheckBox Check1
      Caption = "Detección de linea RING (Patilla 22)"
      Height = 255
      Left = 120
      TabIndex = 6
      Top = 2040
      Width = 2895
   End
   Begin VB.TextBox tbPuerto
      BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851}
         Name = "MS Sans Serif"
         Size = 12
         Charset = 0
         Weight = 400
         Underline = 0 'False
         Italic = 0 'False
         Strikethrough = 0 'False
      EndProperty
      Height = 420
      Left = 1560
      TabIndex = 5
      Text = "2"
      Top = 120
      Width = 255
   End
   Begin VB.TextBox Text1
      Height = 1815
      Left = 3600
      MultiLine = -1 'True
      TabIndex = 4
      Top = 1080
      Width = 2415
   End
   Begin VB.CommandButton cmdbABRIR
      Caption = "ABRIR PUERTO"
      Height = 495
      Left = 120
      TabIndex = 3
      Top = 960
      Width = 1695
   End
   Begin VB.Label Label6
      Caption = "Para que funcione, el puerto debe estar abierto"
      Height = 255
      Left = 120
      TabIndex = 9
      Top = 600
      Width = 3495
   End
   Begin VB.Label Label5
      Caption = "Ejemplo realizado para vb-esp@ccc.uba.ar por lsuarez@iies.es Enero 1998"
      Height = 495
      Left = 120
      TabIndex = 8
      Top = 2400
      Width = 3135
   End
   Begin VB.Label Label1
      Caption = "Caracteres recibidos"
      Height = 255
      Left = 3600
      TabIndex = 7
      Top = 840
      Width = 1575
   End
   Begin VB.Label Label4
      Caption = "Modem en ComX"
      Height = 255
      Left = 120
      TabIndex = 2
      Top = 120
      Width = 1335
   End
   Begin VB.Label Label3
      Caption = "Label3"
      Height = 255
      Left = 120
      TabIndex = 1
      Top = 1680
      Width = 2775
   End
   Begin VB.Label Label2
      Caption = "(Poner aqui el puerto adecuado)"
      Height = 255
      Left = 2040
      TabIndex = 0
      Top = 120
      Width = 2415
   End
   Begin MSCommLib.MSComm MSComm1
      Left = 5520
      Top = 120
      _ExtentX = 1005
      _ExtentY = 1005
      _Version = 327680
      CommPort = 2
      DTREnable = -1 'True
      RThreshold = 1
      RTSEnable = -1 'True
   End
End
Attribute VB_Name = "Form1"
Attribute VB_Creatable = False
Attribute VB_Exposed = False
Option Explicit

Private Sub cmdbABRIR_Click()
'LO PRIMERO ABRIR EL PUERTO

'tomamos el número del puerto deste tbPuerto
MSComm1.CommPort = Val(tbPuerto.Text)
'abrimos el puerto
MSComm1.PortOpen = True
'la siguiente instrucción no es necesaria
'La pongo solamente para que salga el OK que significa que
'el modem se entiende con el PC
MSComm1.Output = "AT" & Chr(13)
End Sub








Private Sub Form_Load()

End Sub

Private Sub MSComm1_OnComm()

'En esta parte realiza la detección mediante los datos que recibe
'por la entrada serie (Dos veces la palabra RING)

If Check1.Value = False Then

    Static salida As String
    Dim entrada As String
    Dim I As Integer
    Dim A As String

    If MSComm1.CommEvent = comEvReceive Then

    entrada = MSComm1.Input
        For I = 1 To Len(entrada)
        A = Mid(entrada, I, 1)
'la siguiente instrucción escribe lo que recibes del puerto serie en
'el text box Text1

        Text1 = Text1 & A

            If Asc(A) > 32 Then
            salida = salida & A
            End If
        Next I

    salida = Right(salida, 8)
    If UCase(salida) = "RINGRING" Then
    Label3.Caption = "HAN SONADO DOS TIMBRAZOS"
    End If

    End If

Else

'Aqui el código para recibirlo por la línea RING (Pin 22 del puerto
'si es de 25 pines. Si es de 9 ni lo intentes porque no tiene

Static contador As Integer

If MSComm1.CommEvent = comEvRing Then
contador = contador + 1
End If

If contador = 2 Then
contador = 0 'lo dejas preparado para la próxima llamada
' AKI tu código. El mío pone en la etiqueta Label3 "HAN SONADO 2 TIMBRAZOS"
Label3.Caption = "HAN SONADO 2 TIMBRAZOS"
End If



End If

End Sub


Private Sub Text2_Change()

End Sub


Form=ring1.frm
Reference=*\G{BEF6E001-A874-101A-8BBA-00AA00300CAB}#2.0#0#C:\WINDOWS\SYSTEM\OLEPRO32.DLL#Standard OLE Types
Reference=*\G{00025E01-0000-0000-C000-000000000046}#3.0#0#C:\ARCHIVOS DE PROGRAMA\ARCHIVOS COMUNES\MICROSOC:\ARCHIVOS DE PROGRAMA\A#Microsoft DAO 3.0 Object Library
Object={648A5603-2C6E-101B-82B6-000000000014}#1.1#0; MSCOMM32.OCX
ProjWinSize=149,382,225,174
ProjWinShow=0
IconForm="Form1"
HelpFile=""
Name="Proyect1"
HelpContextID="0"
StartMode=0
VersionCompatible32="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
VersionCompanyName="MINISTERIO DE ASUNTOS EXTERIORES"



Resumen Resumen

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com