AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / computer / Perguntas / 1499565
Accepted
InterLinked
InterLinked
Asked: 2019-11-07 03:38:43 +0800 CST2019-11-07 03:38:43 +0800 CST 2019-11-07 03:38:43 +0800 CST

Como controlar programaticamente um modem?

  • 772

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 string 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 a 40 minutos por), mas, idealmente, gostaria que fosse executado como uma tarefa agendada todos os dias. No entanto, o HyperTerminal não parece oferecer nenhum recurso de script. Além disso, tentei usar o recurso de registro de sessão e não parece funcionar tão bem assim.

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

A ressalva adicionada é que também preciso ser capaz de lidar com exceções, por exemplo, se o computador estiver ocupado. O HyperTerminal tem um recurso "Redial on Busy" e, às vezes, eu o uso ou disco para o restante dos computadores e depois volto para aquele. Eu preciso construir 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 de operadora, sinto que isso é possível. Como posso implementar isso?

Preciso de uma solução Batch ou VBS, se possível. Não tenho certeza de quão bom é o suporte ao 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, a certa altura, criou um script que podia discar usando os comandos de 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 meticuloso, mas funciona o suficiente para ser útil. Meu plano é conectá-lo a um script em lote, passar cada número e iterar até obter uma impressão bem-sucedida de cada computador.

windows-xp modem
  • 4 4 respostas
  • 1060 Views

4 respostas

  • Voted
  1. harrymc
    2019-11-10T06:51:12+08:002019-11-10T06:51:12+08:00

    Uma ferramenta que pode ajudar com o seu problema é o AT Command Tester Desktop App , um produto comercial ($ 9,95) com teste gratuito de 7 dias.

    Este produto pode executar um script de comandos AT em sua 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. Não tentei, pois não tenho um modem ou não conheço nenhum número para ligar, mas se os logs forem salvos como arquivos de texto, deve ser uma questão 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 fazê-lo, usando a 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 o KB968930 . Quase funcionou, exceto que não há nada conectado ao COM1, então ele travou na chamada ReadLine () até terminar por um tempo limite.

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

    $line = $port.ReadLine()
    

    Deve ter sido:

    $line = $serialPort.ReadLine()
    

    insira a descrição da imagem aqui

    • 3
  2. user1686
    2019-11-07T03:49:21+08:002019-11-07T03:49:21+08:00

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

    Exemplos:

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

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

    • PowerShell: Existe um DevBlog sobre este tópico.

    • Python: use pySerial .

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

    • 2
  3. pebwindkraft
    2019-11-12T06:29:47+08:002019-11-12T06:29:47+08:00

    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 os comandos AT são usados ​​para inicializar os modems. Considerando que todas as funções são de alguma forma definidas para funcionar com o SMS, ele pode ser altamente personalizado com scripts de inicialização e muito mais. Não testei um ciclo completo como discar em 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/

    • 1
  4. Best Answer
    TOOGAM
    2019-11-15T14:09:03+08:002019-11-15T14:09:03+08:00

    AutoHotkey.com pode ser útil.

    Acredito que um truque importante para fazê-lo funcionar de maneira 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 pouco 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 pela qual eu ainda tenho coisas quebradas em pedaços, chamando "IfWinExist" várias vezes. Quando eu estava criando e inicialmente depurando 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 do PuTTY fechasse) .

    O principal é que ao usar o ControlSend para dar as teclas digitadas para o programa usando o PID que foi criado pelo meu comando Run, se algo 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.

    • 1

relate perguntas

  • Partições não aparecem durante a instalação do Windows XP

  • Execute o programa compilado usando o Intel Fortran 8.1 para Windows no WinXP com o sistema Windows 10 de 64 bits [fechado]

  • No Windows XP, como posso conectar o alto-falante Bluetooth?

  • Conecte duas máquinas virtuais através da rede local

  • Onde está localizada a versão do Campo Minado do Windows XP?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    Serviço do Windows 10 chamado AarSvc_70f961. O que é e como posso desativá-lo?

    • 2 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Marko Smith

    ssl.SSLCertVerificationError: falha na verificação do certificado [SSL: CERTIFICATE_VERIFY_FAILED]: não foi possível obter o certificado do emissor local (_ssl.c:1056)

    • 4 respostas
  • Marko Smith

    Como posso saber em qual unidade o Windows está instalado?

    • 6 respostas
  • Martin Hope
    Albin Como faço para ativar o WindowsXP agora que o suporte acabou? 2019-11-18 03:50:17 +0800 CST
  • Martin Hope
    fixer1234 O "HTTPS Everywhere" ainda é relevante? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    Kagaratsch O Windows 10 exclui muitos arquivos minúsculos muito lentamente. Algo pode ser feito para agilizar? 2019-09-23 06:05:43 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    Inter Sys Como Ctrl+C e Ctrl+V funcionam? 2019-05-15 02:51:21 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve