프로그래밍 방식으로 모뎀을 제어하는 ​​방법은 무엇입니까?

프로그래밍 방식으로 모뎀을 제어하는 ​​방법은 무엇입니까?

현재 제가 정기적으로 접속하는 컴퓨터는 약 20~30대 정도입니다. 현재 이 작업을 수행하기 위해 Windows XP SP3에서 HyperTerminal을 사용하고 있습니다. 내 컴퓨터가 다른 컴퓨터에 연결되면 수동으로 살펴보고 Excel에 입력한 일부 정보가 문자열로 출력됩니다.

수동 연결에서는 잘 작동하지만 자동화해야 한다고 생각하는 지루한 프로세스입니다. 너무 힘들기 때문에 지금은 일주일에 한 번씩 하고 있지만(보통 한 번에 30~40분 소요) 이상적으로는 매일 예약된 작업으로 실행하고 싶습니다. 그러나 HyperTerminal은 스크립팅 기능을 제공하지 않는 것 같습니다. 게다가 세션 로깅 기능을 사용해 보았지만 그다지 안정적으로 작동하지 않는 것 같습니다.

일괄 처리나 VBS 또는 PowerShell 스크립트를 사용하여 일련의 컴퓨터에 순차적으로 전화를 걸고 터미널 출력을 타임스탬프가 포함된 텍스트 파일에 자동으로 기록할 수 있는 방법이 있습니까?

추가된 주의 사항은 예를 들어 컴퓨터가 바쁜 경우 예외를 처리할 수 있어야 한다는 것입니다. HyperTerminal에는 "통화 중일 때 재다이얼" 기능이 있어서 가끔 이 기능을 사용하거나 나머지 컴퓨터에 전화를 걸었다가 해당 컴퓨터로 다시 돌아오는 경우가 있습니다. 내 스크립트에도 이를 구축해야 합니다.

워 다이얼링이 가능하다는 점을 고려하면 출력을 로그하지는 않지만 캐리어 톤의 유무만 기록하는 것은 가능하다고 생각됩니다. 이것을 구현하려면 어떻게 해야 합니까?

가능하다면 Batch 또는 VBS 솔루션이 필요합니다. Windows XP에서 PowerShell 지원이 얼마나 좋은지 잘 모르겠고 여러 가지 이유로 컴퓨터에 추가 도구(예: Python 등)를 설치하지 않는 것을 선호합니다.

설명:나에게는 회선에 Hayes 명령을 사용하여 전화를 걸 수 있는 스크립트를 만든 친구가 있습니다. 그것은 쉬운 부분입니다. 어려운 부분은 원격 컴퓨터에서 인쇄물을 감지하여 이를 텍스트 파일에 기록할 수 있다는 것입니다.

유료 버전의 HyperTerminal은 이러한 방식으로 스크립트를 작성하는 기능을 제공하지만 통화 중인 전화번호도 처리할 수 있는 기능과 함께 사용자 정의 스크립트를 사용하여 무료로 이 작업을 수행하고 싶습니다.

감사해요!

파워셸

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이 도움이 될 수 있습니다.

저는 이를 안정적으로 작동시키는 핵심 비결은 올바른 접근 방식을 사용하는 것이라고 믿습니다. Windows가 포그라운드 응용 프로그램에 키 입력을 제공하도록 단순히 Microsoft 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 명령 테스터 데스크탑 앱, 7일 무료 평가판이 포함된 상용 제품($9.95)입니다.

이 제품은 "스크립트 모드" 탭에서 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()

모뎀에서 사용하는 줄 끝 문자에 주의가 필요합니다.

다음은 .Net Framework 2.0을 설치한 XP VM에서의 세션입니다. KB968930. COM1에 연결된 것이 없다는 점을 제외하면 거의 작동했기 때문에 시간 초과로 끝날 때까지 ReadLine() 호출이 중단되었습니다.

내 스크립트에 복사-붙여넣기 오류가 있었는데 지금은 수정되었습니다. 작동하지 않는 줄은 다음과 같습니다.

$line = $port.ReadLine()

다음과 같았어야 합니다.

$line = $serialPort.ReadLine()

여기에 이미지 설명을 입력하세요

답변3

모뎀을 제어하는 ​​가장 기본적인 방법은 직렬 포트를 통해 명령을 보내는 것입니다. 거의 모든 전화 접속 모뎀이 지원됩니다.Hayes AT 명령, 예를 들어 ATD또는 ATH(일반적으로 직렬 모뎀용 하드웨어에 있고 때로는 USB/PCI 모뎀용 드라이버에 의해 에뮬레이션됨)입니다.

예:

  • Linux/OpenBSD/FreeBSD: 모든 프로그램과 라이브러리는 결국 /dev/ttyS*특수 파일을 사용하여 직렬 포트에 액세스합니다. (참고: Linux에서는 USB 직렬 어댑터의 이름이 ttyUSB 또는 ttyACM입니다.)
    대부분의 경우 프로그램은 일반 파일인 것처럼 경로를 연 다음 명령을 쓰거나 플러시하고 응답을 읽을 수 있습니다.

  • Windows: 모든 프로그램은 결국 \\.\COM1:특수 파일을 사용하여 직렬 포트에 액세스합니다. 처음 4개는 다음과 같이 간단하게 열 수 있습니다 COM1:(바로가기는 MS-DOS 유물입니다).

  • PowerShell: 이 있습니다.개발자 블로그이 주제에 대해.

  • 파이썬: 사용pySerial.

Windows에서 다른 방법은 다음을 사용하는 것입니다.전화 통신 API. 그런데 데이터(단말기) 통화를 지원하는지, 음성 통화만 지원하는지 알 수 없습니다.

답변4

참고로 다음은 모뎀을 제어하는 ​​데 사용하는 두 가지 유틸리티입니다. 저는 많은 양의 SMS를 보내고 받습니다. 이를 위한 도구가 만들어졌습니다. 여러 모뎀을 지원하며 AT 명령은 모뎀을 초기화하는 데 사용됩니다. 모든 기능은 어떻게든 SMS와 함께 작동하도록 배치되어 있지만 init 스크립트 등을 사용하여 고도로 사용자 정의할 수 있습니다. 다른 모뎀에 전화를 걸어 어떻게든 데이터를 받는 것과 같은 전체 주기를 테스트하지는 않았지만 아마도 살펴보는 것이 가치가 있을 것입니다.

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

관련 정보