¿Cómo controlar programáticamente un módem?

¿Cómo controlar programáticamente un módem?

Actualmente, hay alrededor de 20 a 30 computadoras a las que llamo regularmente. Actualmente estoy usando HyperTerminal en Windows XP SP3 para hacer esto. Una vez que mi computadora se conecta a la otra computadora, obtengo una impresión en cadena de información que analizo manualmente y escribo en Excel.

Si bien funciona bien para conexiones manuales, es un proceso tedioso que creo que debería automatizarse. Ahora lo hago una vez a la semana porque es muy laborioso (normalmente de 30 a 40 minutos cada uno), pero lo ideal sería que se ejecutara como una tarea programada todos los días. Sin embargo, HyperTerminal no parece ofrecer ninguna capacidad de secuencias de comandos. Además, intenté utilizar la función de registro de sesiones y no parece funcionar tan bien de manera confiable.

¿Hay alguna manera, tal vez usando un script por lotes o VBS o PowerShell, de poder marcar secuencialmente una serie de computadoras y luego registrar automáticamente la salida del terminal en un archivo de texto, con marca de tiempo?

La advertencia adicional es que también necesito poder manejar excepciones, por ejemplo, si la computadora está ocupada. HyperTerminal tiene una función "Volver a marcar si está ocupado" y, a veces, la uso o marco el resto de las computadoras y luego vuelvo a esa. También necesito incorporar eso en mi guión.

Teniendo en cuenta que es posible la marcación de guerra, aunque no registra la salida, solo la ausencia o presencia de un tono de operador, creo que esto se puede lograr. ¿Cómo podría implementar esto?

Necesito una solución por lotes o VBS, si es posible. No estoy seguro de qué tan buena es la compatibilidad con PowerShell en Windows XP y, por varias razones, preferiría no instalar ninguna herramienta adicional (por ejemplo, Python, etc.) en la máquina.

Aclaración:Tengo un amigo que en un momento creó un script que podía marcar usando los comandos de Hayes en la línea. Esa es la parte fácil; la parte difícil es poder detectar la copia impresa desde la computadora remota y registrarla en un archivo de texto.

La versión paga de HyperTerminal ofrece funciones para crear secuencias de comandos de este tipo, pero me gustaría hacerlo de forma gratuita mediante el uso de una secuencia de comandos personalizada, con la capacidad de manejar números ocupados también.

¡Gracias!

Potencia Shell

Esto es lo que obtengo cuando ejecuto el script de PowerShell: ingrese la descripción de la imagen aquí

Aquí está el script que probé:

# Create your instance of the SerialPort Class
$serialPort = new-Object System.IO.Ports.SerialPort
# Set various COM-port settings
$serialPort.PortName = "COM3"
$serialPort.BaudRate = 1200
$serialPort.WriteTimeout = 500
$serialPort.ReadTimeout = 23000
$serialPort.DtrEnable = "true"
# or in one command
# $serialPort= new-Object System.IO.Ports.SerialPort COM#,Baudrate,None,8,one
# Open the connection
$serialPort.Open()
# write to it
$serialPort.WriteLine( "at+csq" + "`r" )
$serialPort.WriteLine( "atdt1NPANXXXXXX" + "`r" )
# wait
start-sleep -m 50
# read line
$line = $serialPort.ReadLine()
Write-Host $line
# write to it
$serialPort.Close()

Solución más cercana hasta ahora:

Lo más cerca que he podido llegar es usar AHK, que es bastante complicado, pero funciona lo suficiente como para ser útil. Mi plan es conectarlo a un script por lotes y pasar cada número e iterar hasta obtener una copia impresa de cada computadora.

Respuesta1

AutoHotkey.com puede resultar útil.

Creo que un truco clave para que funcione de manera confiable será utilizar el enfoque correcto. Simplemente descargar las pulsaciones de teclas en Microsoft Windows para que Windows las pase a la aplicación de primer plano no será el método más estable. Aquí hay un fragmento de código que utilicé para interactuar con PuTTY. Funcionó lo suficientemente bien como para poder iniciar el script, que iniciaría PuTTY y, aún así, el programa podría interactuar con la instancia correcta de PuTTY incluso si PuTTY estuviera en segundo plano.

(Es probable que desee adaptar significativamente este código de ejemplo).

sPuTTYloc:="C:\Users\\me\PuTTY\PuTTY.exe"
sSiteName:="NameOfSite"
Run, "%sPuTTYloc%" -load "%sSiteName%",,UseErrorLevel,sPuTTYPID

    if %sPuTTYPID%
    {
        WinWait, ahk_pid %sPuTTYPID%
        sleep ,5000
        IfWinExist,ahk_pid %sPuTTYPID%
        {
            ControlSend,,{Enter},ahk_pid %sPuTTYPID%
; other stuff
        else
        {
MsgBox "PuTTY Window closed, spot #1"
            return ; Apparently the PuTTY window closed
        }
        Sleep 1500
        IfWinExist,ahk_pid %sPuTTYPID%
        {
            ; do other stuff
        }
        else
        {
MsgBox "PuTTY Window closed, spot #2"
            return ; Apparently the PuTTY window closed
        }
        Sleep 1500
        return
    }
return

No hay necesariamente una razón convincente por la que todavía tengo cosas divididas en pedazos, llamando "IfWinExist" varias veces. Cuando estaba creando y depurando inicialmente el script, lo encontré útil para depurar (o al menos sentir que tenía una mejor idea de lo que estaba pasando) si el extremo remoto terminaba la conexión (lo que causaría que mi ventana PuTTY se cerrara). .

Lo principal es que al usar ControlSend para dar las pulsaciones de teclas al programa usando el PID que fue creado por mi comando Ejecutar, si sucedía algo malo, el script no continuaba intentando enviar pulsaciones de teclas a Windows y terminaba teniendo las pulsaciones de teclas. entrar en el programa equivocado.

Respuesta2

Una herramienta que podría ayudar con su problema es el Aplicación de escritorio AT Command Tester, un producto comercial ($9,95) con prueba gratuita de 7 días.

Este producto puede ejecutar un script de comandos AT en su pestaña "Modo script", donde puede guardar y cargar el script desde la computadora local.

También tiene un modo de línea de comando donde se puede llamar mediante:

atc –port portname –script filename

La herramienta también puede recopilar y guardar registros del módem. No lo he probado, ya que no tengo un módem ni conozco ningún número al que llamar, pero si los registros se guardan como archivos de texto, debería ser sencillo escribir un pequeño script de búsqueda de texto para errores o éxitos.

ingrese la descripción de la imagen aquí


Si prefiere escribir el suyo propio, puede hacerlo con un simple script de PowerShell, utilizando el Clase System.IO.Ports.SerialPort.

Aquí hay un ejemplo (no probado y muy teórico):

# Create your instance of the SerialPort Class
$serialPort = new-Object System.IO.Ports.SerialPort
# Set various COM-port settings
$serialPort.PortName = "COM1"
$serialPort.BaudRate = 19200
$serialPort.WriteTimeout = 500
$serialPort.ReadTimeout = 3000
$serialPort.DtrEnable = "true"
# or in one command
# $serialPort= new-Object System.IO.Ports.SerialPort COM#,Baudrate,None,8,one
# Open the connection
$serialPort.Open()
# write to it
$serialPort.WriteLine( "at+csq" + "`r" )
# wait
start-sleep -m 50
# read line
$line = $serialPort.ReadLine()
Write-Host $line
# write to it
$serialPort.Close()

Tenga en cuenta que es necesario prestar atención al carácter de fin de línea utilizado por el módem.

Aquí está mi sesión en una VM XP donde instalé .Net Framework 2.0 y KB968930. Casi funcionó, excepto que no hay nada conectado a COM1, por lo que se colgó en la llamada ReadLine() hasta que finalizó por un tiempo de espera.

Tenga en cuenta que hubo un error de copiar y pegar en mi script, ahora corregido. La línea que no funcionó fue:

$line = $port.ReadLine()

Debería haber sido:

$line = $serialPort.ReadLine()

ingrese la descripción de la imagen aquí

Respuesta3

El método más básico para controlar un módem es enviar comandos a través de un puerto serie. Casi todos los módems de acceso telefónico admitenHayes comandos AT, como ATDo ATH(normalmente en hardware para módems serie, a veces emulado por el controlador para módems USB/PCI).

Ejemplos:

  • Linux/OpenBSD/FreeBSD: todos los programas y bibliotecas eventualmente utilizan /dev/ttyS*archivos especiales para acceder a los puertos serie. (Nota: en Linux, los adaptadores serie USB se denominan ttyUSB o ttyACM).
    En la mayoría de los casos, su programa puede simplemente abrir la ruta como si fuera un archivo normal, luego escribir/eliminar un comando y leer la respuesta.

  • Windows: todos los programas eventualmente utilizan \\.\COM1:archivos especiales para acceder a los puertos serie. Los primeros cuatro se pueden abrir simplemente como COM1:(el acceso directo es una reliquia de MS-DOS).

  • PowerShell: hay unBlog de desarrollosobre este tema.

  • Python: usopySerial.

El otro método, en Windows, podría ser utilizar elAPI de telefonía. Sin embargo, no puedo encontrar si admite llamadas de datos (terminal) o solo llamadas de voz.

Respuesta4

Como nota al margen: estas son solo dos utilidades que uso para controlar mis módems. Envío y recibo muchos SMS, las herramientas están hechas para ello. Admiten varios módems y los comandos AT se utilizan para inicializar los módems. Si bien todas las funciones están diseñadas de alguna manera para funcionar con SMS, se puede personalizar en gran medida con scripts de inicio y más. No he probado un ciclo completo como marcar otro módem y recibir datos de alguna manera, pero tal vez valga la pena echarles un vistazo:

http://smstools3.kekekasvi.com/index.php https://wammu.eu/smsd/

información relacionada