Wie steuert man ein Modem programmgesteuert?

Wie steuert man ein Modem programmgesteuert?

Derzeit gibt es etwa 20 bis 30 Computer, bei denen ich mich regelmäßig einwähle. Ich verwende dafür derzeit HyperTerminal unter Windows XP SP3. Sobald mein Computer eine Verbindung zum anderen Computer herstellt, erhalte ich einen Ausdruck mit einigen Informationen, die ich manuell überprüfe und in Excel eingebe.

Obwohl es bei manuellen Verbindungen gut funktioniert, ist es ein langwieriger Prozess, der meiner Meinung nach automatisiert werden sollte. Ich mache es jetzt einmal pro Woche, weil es so mühsam ist (normalerweise 30-40 Minuten pro Tag), aber idealerweise würde ich es gerne jeden Tag als geplante Aufgabe ausführen lassen. HyperTerminal scheint jedoch keine Skriptfunktionen zu bieten. Darüber hinaus habe ich versucht, die Sitzungsprotokollierungsfunktion zu verwenden, und sie scheint nicht so zuverlässig zu funktionieren.

Gibt es eine Möglichkeit, möglicherweise mithilfe eines Batch-, VBS- oder PowerShell-Skripts, eine Reihe von Computern nacheinander anzurufen und die Terminalausgabe dann automatisch mit Zeitstempel in einer Textdatei zu protokollieren?

Der zusätzliche Vorbehalt ist, dass ich auch Ausnahmen behandeln muss, z. B. wenn der Computer beschäftigt ist. HyperTerminal verfügt über eine Funktion „Wahlwiederholung bei Besetzt“, und manchmal verwende ich diese oder wähle die Nummern der anderen Computer und kehre dann zu diesem Computer zurück. Ich muss das auch in mein Skript einbauen.

Wenn man bedenkt, dass War Dialing möglich ist, obwohl es die Ausgabe nicht protokolliert, sondern nur das Fehlen oder Vorhandensein eines Trägertons, halte ich dies für machbar. Wie kann ich dies umsetzen?

Ich brauche möglichst eine Batch- oder VBS-Lösung. Ich bin mir nicht sicher, wie gut die PowerShell-Unterstützung unter Windows XP ist, und aus verschiedenen Gründen möchte ich lieber keine zusätzlichen Tools (z. B. Python usw.) auf dem Computer installieren.

Klärung:Ich habe einen Freund, der irgendwann einmal ein Skript geschrieben hat, das mit Hayes-Befehlen in die Leitung wählen konnte. Das ist der einfache Teil; der schwierige Teil besteht darin, den Ausdruck vom Remotecomputer zu erkennen und in einer Textdatei zu protokollieren.

Die kostenpflichtige Version von HyperTerminal bietet die Möglichkeit, entsprechende Skripte zu erstellen, ich möchte dies jedoch kostenlos mithilfe eines benutzerdefinierten Skripts tun und dabei auch mit besetzten Nummern umgehen können.

Danke!

Power Shell

Folgendes erhalte ich beim Ausführen des PowerShell-Skripts: Bildbeschreibung hier eingeben

Hier ist das Skript, das ich ausprobiert habe:

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

Bisher beste Lösung:

Am nächsten komme ich dem mit AHK, was zwar ziemlich pingelig ist, aber oft genug funktioniert, um nützlich zu sein. Mein Plan ist, es an ein Batch-Skript anzuschließen, jede Nummer einzugeben und so lange zu iterieren, bis ich erfolgreich einen Ausdruck von jedem Computer erhalten habe.

Antwort1

AutoHotkey.com kann hilfreich sein.

Ich glaube, dass der Schlüssel zum zuverlässigen Funktionieren darin besteht, den richtigen Ansatz zu verwenden. Einfach Tastenanschläge in Microsoft Windows zu übertragen, damit Windows sie an die Vordergrundanwendung weitergibt, ist nicht die stabilste Methode. Hier ist ein bisschen Code, den ich zur Interaktion mit PuTTY verwendet habe. Er funktionierte gut genug, dass ich das Skript starten konnte, das PuTTY startete, und das Programm konnte dann dennoch mit der richtigen Instanz von PuTTY interagieren, selbst wenn PuTTY im Hintergrund lief.

(Wahrscheinlich möchten Sie diesen Beispielcode erheblich anpassen.)

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

Es gibt nicht unbedingt einen zwingenden Grund, warum ich immer noch Dinge in Einzelteile zerlegt habe und „IfWinExist“ mehrmals aufrufe. Als ich das Skript erstellte und anfänglich debuggte, fand ich es zum Debuggen nützlich (oder hatte zumindest das Gefühl, eine bessere Vorstellung davon zu haben, was vor sich ging), wenn das Remote-Ende die Verbindung beendete (was dazu führte, dass mein PuTTY-Fenster geschlossen wurde).

Die Hauptsache ist, dass durch die Verwendung von ControlSend zum Übermitteln der Tastenanschläge an das Programm unter Verwendung der PID, die durch meinen Run-Befehl erstellt wurde, das Skript im Falle eines Problems nicht weiterhin versucht, Tastenanschläge an Windows zu senden, und die Tastenanschläge am Ende an das falsche Programm gelangen.

Antwort2

Ein Tool, das bei Ihrem Problem helfen könnte, ist das AT-Befehlstester-Desktop-App, ein kommerzielles Produkt (9,95 $) mit 7-tägiger kostenloser Testversion.

Dieses Produkt kann unter der Registerkarte „Skriptmodus“ ein Skript mit AT-Befehlen ausführen und das Skript auf dem lokalen Computer speichern und laden.

Es verfügt auch über einen Befehlszeilenmodus, in dem es wie folgt aufgerufen werden kann:

atc –port portname –script filename

Das Tool kann auch Modemprotokolle sammeln und speichern. Ich habe es nicht ausprobiert, da ich weder ein Modem habe noch eine anzurufende Nummer kenne, aber wenn die Protokolle als Textdateien gespeichert werden, sollte es ein Leichtes sein, ein kleines Textsuchskript für Fehler/Erfolg zu schreiben.

Bildbeschreibung hier eingeben


Wenn Sie lieber Ihr eigenes Skript schreiben möchten, reicht ein einfaches PowerShell-Skript aus. Verwenden Sie dazu System.IO.Ports.SerialPort-Klasse.

Hier ist ein Beispiel (ungetestet und sehr theoretisch):

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

Beachten Sie, dass das vom Modem verwendete Zeilenendezeichen beachtet werden muss.

Hier ist meine Sitzung auf einer XP VM, auf der ich .Net Framework 2.0 installiert habe und KB968930. Es hätte fast funktioniert, aber an COM1 war nichts angeschlossen, sodass es beim Aufruf von ReadLine() hängen blieb, bis es durch ein Timeout beendet wurde.

Bitte beachten Sie, dass in meinem Skript ein Kopier-/Einfügefehler auftrat, der jetzt behoben wurde. Die Zeile, die nicht funktionierte, war:

$line = $port.ReadLine()

Es hätte sein sollen:

$line = $serialPort.ReadLine()

Bildbeschreibung hier eingeben

Antwort3

Die einfachste Methode zur Steuerung eines Modems ist das Senden von Befehlen über einen seriellen Port. Fast alle DFÜ-Modems unterstützenHayes AT-Befehle, wie ATDoder ATH(normalerweise in der Hardware für serielle Modems, manchmal vom Treiber für USB-/PCI-Modems emuliert).

Beispiele:

  • Linux/OpenBSD/FreeBSD: Alle Programme und Bibliotheken verwenden letztendlich die /dev/ttyS*speziellen Dateien, um auf serielle Schnittstellen zuzugreifen. (Hinweis: Unter Linux heißen USB-Seriell-Adapter ttyUSB oder ttyACM.)
    In den meisten Fällen kann Ihr Programm den Pfad einfach wie eine normale Datei öffnen, dann einen Befehl schreiben/leeren und die Antwort lesen.

  • Windows: Alle Programme verwenden letztendlich \\.\COM1:spezielle Dateien, um auf serielle Schnittstellen zuzugreifen. Die ersten vier können einfach so geöffnet werden COM1:(die Verknüpfung ist ein MS-DOS-Relikt).

  • PowerShell: Es gibt eineEntwicklerblogZu diesem Thema.

  • Python: Verwenden SiepySerial.

Die andere Methode unter Windows könnte die Verwendung desTelefonie-API. Ich kann jedoch nicht herausfinden, ob es Datenanrufe (Terminalanrufe) oder nur Sprachanrufe unterstützt.

Antwort4

Nebenbemerkung: Hier sind nur zwei Dienstprogramme, die ich zur Steuerung meiner Modems verwende. Ich sende und empfange viele SMS, die Tools sind dafür gemacht. Sie unterstützen mehrere Modems, und AT-Befehle werden zum Initialisieren der Modems verwendet. Während alle Funktionen irgendwie für die Arbeit mit SMS ausgelegt sind, können sie mit Init-Skripten und mehr stark angepasst werden. Ich habe keinen vollständigen Zyklus wie das Einwählen eines anderen Modems und das Empfangen von Daten getestet, aber vielleicht lohnt es sich, einen Blick darauf zu werfen:

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

verwandte Informationen