如何以编程方式控制调制解调器?

如何以编程方式控制调制解调器?

目前,我经常拨号访问大约 20-30 台计算机。我目前使用 Windows XP SP3 上的 HyperTerminal 来执行此操作。一旦我的计算机连接到另一台计算机,我就会得到一些信息的字符串打印输出,我会手动查看这些信息并将其输入到 Excel 中。

虽然它对于手动连接来说效果很好,但我觉得这是一个繁琐的过程,应该自动化。我现在每周做一次,因为它太费力了(通常每周 30-40 分钟),但理想情况下,我希望它作为每天的计划任务运行。但是,超级终端似乎不提供任何脚本功能。此外,我尝试使用会话记录功能,但它似乎不能很好地可靠地运行。

有没有什么方法,比如使用批处理、VBS 或 PowerShell 脚本,我可以依次拨打一系列计算机,然后自动将终端输出记录到带有时间戳的文本文件中?

需要补充的是,我还需要能够处理异常情况,例如,如果计算机繁忙。超级终端具有“忙时重拨”功能,有时我会使用该功能或​​拨打其他计算机,然后返回到该计算机。我也需要将其构建到我的脚本中。

考虑到战争拨号是可能的,尽管它不记录输出,只记录载波音的存在与否,但我觉得这是可以实现的。我该如何实现它?

如果可能的话,我需要一个批处理或 VBS 解决方案。我不确定 Windows XP 对 PowerShell 的支持有多好,而且出于各种原因,我宁愿不在机器上安装任何其他工具(例如 Python 等)。

澄清:我有一个朋友,他曾经编写了一个脚本,可以使用 Hayes 命令拨打电话。这是最简单的部分;困难的部分是能够检测到远程计算机的打印输出并将其记录到文本文件中。

超级终端的付费版本提供了编写此类脚本的功能,但我想使用自定义脚本免费完成这些操作,同时还能够处理忙音号码。

谢谢!

电源外壳

以下是运行 PowerShell 脚本时得到的结果: 在此处输入图片描述

这是我尝试过的脚本:

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

目前最接近的解决方案:

我最接近的方法是使用 AHK,虽然它很挑剔,但大多数时候都很有用。我的计划是将它连接到批处理脚本并传入每个数字,然后进行迭代,直到我成功地从每台计算机上获得打印输出。

答案1

AutoHotkey.com 可能会有帮助。

我认为,让它可靠运行的关键技巧是使用正确的方法。简单地将按键转储到 Microsoft Windows 中,以便 Windows 将其提供给前台应用程序并不是最稳定的方法。这是我用来与 PuTTY 交互的一段代码。它运行良好,我可以启动脚本,该脚本将启动 PuTTY,而且即使 PuTTY 在后台,程序也可以与正确的 PuTTY 实例交互。

(您可能希望大幅调整此示例代码。)

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

我仍然将事情分解成几部分,多次调用“IfWinExist”,这不一定是一个令人信服的理由。当我创建并最初调试脚本时,我发现如果远端终止连接(这将导致我的 PuTTY 窗口关闭),它对于调试很有用(或者至少感觉我对正在发生的事情有了更好的了解)。

最主要的是,通过使用 ControlSend 将击键发送给使用我的 Run 命令创建的 PID 的程序,如果发生不好的事情,脚本不会继续尝试将击键发送到 Windows,最终导致击键进入错误的程序。

答案2

可以帮助解决您的问题的工具是 AT 命令测试仪桌面应用程序,一款商业产品(9.95 美元),提供 7 天免费试用。

该产品可以在“脚本模式”选项卡下执行AT命令脚本,并可以从本地计算机保存和加载脚本。

它还具有命令行模式,可以通过以下方式调用:

atc –port portname –script filename

该工具还可以收集和保存调制解调器日志。我没有尝试过,因为我没有调制解调器,也不知道要拨打的号码,但如果日志保存为文本文件,编写一个小的文本搜索脚本来查找错误/成功应该是件简单的事情。

在此处输入图片描述


如果您希望自己编写,可以使用简单的 PowerShell 脚本来完成,使用 System.IO.Ports.SerialPort 类

以下是一个例子(未经测试且非常理论化):

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

请注意调制解调器使用的行尾字符。

这是我在 XP VM 上的会话,我安装了 .Net Framework 2.0 和 KB968930。它几乎可以工作,只是没有任何东西连接到 COM1,所以它挂在 ReadLine() 调用上,直到超时结束。

请注意,我的脚本中有一个复制粘贴错误,现已更正。不起作用的行是:

$line = $port.ReadLine()

应该是:

$line = $serialPort.ReadLine()

在此处输入图片描述

答案3

控制调制解调器的最基本方法是通过串行端口发送命令。几乎所有拨号调制解调器都支持Hayes AT 命令,例如ATDATH(通常在串行调制解调器的硬件中,有时由 USB/PCI 调制解调器的驱动程序模拟)。

例子:

  • Linux/OpenBSD/FreeBSD:所有程序和库最终都使用/dev/ttyS*特殊文件来访问串行端口。(注意:在 Linux 上,USB 串行适配器名为 ttyUSB 或 ttyACM。)
    在大多数情况下,您的程序可以像打开常规文件一样打开路径,然后写入/刷新命令并读取响应。

  • Windows:所有程序最终都会使用\\.\COM1:特殊文件来访问串行端口。前四个可以简单地打开COM1:(快捷方式是 MS-DOS 的遗留)。

  • PowerShell:有一个开发博客关于这个话题。

  • Python:使用pySerial

在 Windows 上,另一种方法可能是使用电话 API。但是我找不到它是否支持数据(终端)通话,或者只支持语音通话。

答案4

附注:这里仅介绍两个我用来控制调制解调器的实用程序。我发送和接收大量短信,这些工具就是为此而制作的。它们支持多个调制解调器,并使用 AT 命令初始化调制解调器。虽然所有功能都以某种方式与 SMS 配合使用,但可以使用初始化脚本等进行高度自定义。我还没有测试过完整的周期,例如拨入另一个调制解调器并以某种方式接收数据,但也许值得一看:

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

相关内容