Como controlar programaticamente um modem?

Como controlar programaticamente um modem?

Atualmente, existem cerca de 20 a 30 computadores para os quais eu ligo regularmente. Atualmente estou usando o HyperTerminal no Windows XP SP3 para fazer isso. Depois que meu computador se conecta ao outro computador, recebo uma impressão de algumas informações que olho manualmente e digito no Excel.

Embora funcione bem para conexões manuais, é um processo tedioso que acho que deveria ser automatizado. Estou fazendo isso uma vez por semana agora, porque é muito trabalhoso (geralmente 30-40 minutos por vez), mas o ideal é que seja executado como uma tarefa agendada todos os dias. No entanto, o HyperTerminal não parece oferecer recursos de script. Além disso, tentei usar o recurso de registro de sessão e ele não parece funcionar muito bem.

Existe alguma maneira, talvez usando um script em lote ou VBS ou PowerShell, de poder discar sequencialmente para uma série de computadores e, em seguida, registrar automaticamente a saída do terminal em um arquivo de texto, com carimbo de data e hora?

A ressalva adicional é que eu também preciso ser capaz de lidar com exceções, por exemplo, se o computador estiver ocupado. O HyperTerminal possui um recurso "Rediscar quando ocupado" e, às vezes, eu o uso ou ligo para o restante dos computadores e depois volto para aquele. Preciso incluir isso em meu script também.

Considerando que a discagem de guerra é possível, embora não registre a saída, apenas a ausência ou presença de um tom portador, sinto que isso é possível. Como posso implementar isso?

Preciso de uma solução em lote ou VBS, se possível. Não tenho certeza de quão bom é o suporte do PowerShell no Windows XP e, por vários motivos, prefiro não instalar nenhuma ferramenta adicional (por exemplo, Python, etc.) na máquina.

Esclarecimento:Tenho um amigo que certa vez criou um script que podia discar usando comandos Hayes na linha. Essa é a parte fácil; a parte difícil é detectar a impressão do computador remoto e registrá-la em um arquivo de texto.

A versão paga do HyperTerminal oferece recursos para criar scripts nesse sentido, mas eu gostaria de fazer isso gratuitamente usando um script personalizado, com a capacidade de lidar também com números ocupados.

Obrigado!

PowerShell

Aqui está o que recebo ao executar o script do PowerShell: insira a descrição da imagem aqui

Aqui está o script que tentei:

# 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()

Solução mais próxima até agora:

O mais próximo que consegui foi usar o AHK, que é bastante complicado, mas funciona o suficiente para ser útil. Meu plano é conectar um script em lote e passar cada número e iterar até obter uma impressão de cada computador.

Responder1

AutoHotkey.com pode ser útil.

Acredito que um truque fundamental para fazê-lo funcionar de forma confiável será usar a abordagem correta. Simplesmente despejar as teclas digitadas no Microsoft Windows para que o Windows as forneça ao aplicativo em primeiro plano não será o método mais estável. Aqui está um trecho de código que usei para interagir com o PuTTY. Funcionou bem o suficiente para que eu pudesse iniciar o script, que iniciaria o PuTTY, e ainda assim o programa poderia interagir com a instância correta do PuTTY, mesmo que o PuTTY estivesse em segundo plano.

(Você provavelmente desejará adaptar significativamente este código de exemplo.)

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

Não há necessariamente uma razão convincente para que eu ainda tenha as coisas divididas em pedaços, chamando "IfWinExist" várias vezes. Quando eu estava criando e depurando inicialmente o script, achei útil para depurar (ou pelo menos sentir que tinha uma ideia melhor do que estava acontecendo) se a extremidade remota encerrasse a conexão (o que faria com que minha janela PuTTY fechasse) .

O principal é que ao usar o ControlSend para dar as teclas digitadas ao programa usando o PID que foi criado pelo meu comando Executar, se algo de ruim acontecesse, o script não continuava tentando enviar as teclas digitadas para o Windows e acabava tendo as teclas digitadas entre no programa errado.

Responder2

Uma ferramenta que pode ajudar com o seu problema é o Aplicativo de desktop AT Command Tester, um produto comercial (US$ 9,95) com avaliação gratuita de 7 dias.

Este produto pode executar um script de comandos AT na guia "Modo Script", onde pode salvar e carregar o script do computador local.

Ele também possui um modo de linha de comando onde pode ser chamado por:

atc –port portname –script filename

A ferramenta também pode coletar e salvar logs de modem. Eu não tentei, pois não tenho um modem nem conheço nenhum número para ligar, mas se os logs forem salvos como arquivos de texto, será simples escrever um pequeno script de pesquisa de texto para erros/sucesso.

insira a descrição da imagem aqui


Se você preferir escrever o seu próprio, um script simples do PowerShell pode fazer isso, usando o Classe System.IO.Ports.SerialPort.

Aqui está um exemplo (não testado e muito 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()

Observe que o caractere de fim de linha usado pelo modem precisa de atenção.

Aqui está minha sessão em uma VM XP onde instalei o .Net Framework 2.0 e KB968930. Quase funcionou, exceto que não há nada conectado à COM1, então ele travou na chamada ReadLine() até terminar por um tempo limite.

Observe que houve um erro de copiar e colar em meu script, agora corrigido. A linha que não funcionou foi:

$line = $port.ReadLine()

Deveria ter sido:

$line = $serialPort.ReadLine()

insira a descrição da imagem aqui

Responder3

O método mais básico de controlar um modem é enviar comandos através de uma porta serial. Quase todos os modems dial-up suportamComandos Hayes AT, como ATDou ATH(geralmente em hardware para modems seriais, às vezes emulado pelo driver para modems USB/PCI).

Exemplos:

  • Linux/OpenBSD/FreeBSD: Todos os programas e bibliotecas eventualmente usam /dev/ttyS*arquivos especiais para acessar portas seriais. (Nota: No Linux, os adaptadores seriais USB são chamados ttyUSB ou ttyACM.)
    Na maioria dos casos, seu programa pode simplesmente abrir o caminho como se fosse um arquivo normal, depois escrever/liberar um comando e ler a resposta.

  • Windows: Todos os programas eventualmente usam \\.\COM1:arquivos especiais para acessar portas seriais. Os quatro primeiros podem ser abertos simplesmente como COM1:(o atalho é uma relíquia do MS-DOS).

  • PowerShell: existe umDevBlogneste tópico.

  • Python: usarpySerial.

O outro método, no Windows, pode ser usar oAPI de telefonia. No entanto, não consigo descobrir se ele suporta chamadas de dados (terminal) ou apenas chamadas de voz.

Responder4

Como observação: aqui estão apenas dois utilitários que uso para controlar meus modems. Envio e recebo muitos SMS, as ferramentas são feitas para isso. Eles suportam vários modems e comandos AT são usados ​​para inicializar modems. Embora todas as funções sejam de alguma forma configuradas para funcionar com SMS, elas podem ser altamente personalizadas com scripts de inicialização e muito mais. Não testei um ciclo completo como discar outro modem e receber dados de alguma forma, mas talvez valha a pena dar uma olhada neles:

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

informação relacionada