개발 관련/SW, App 관련

Autoit의 통신(TCP/IP) 이용 원격제어 1/2

by 소서리스25 2023. 6. 21.
반응형

Autoit의 통신(TCP/IP) 이용 원격제어 개요

 

Autoit의 다양한 기능중 하나는 통신을 사용할 수 있다. 기본적인 통신으로는 여타 다른 툴과 마찬가지로 TCP/IP와 UDP를 사용할 수 있다.

본인도 과거에 여러대의 멀티스크린을 제어하기 위해 여러 PC를 제어하는 데 사용하였다.

1대의 PC가 6대의 모니터, 그리고 6대의 PC와 그 수만큼 모니터(36대)를 미러링 해서 총 72대의 모니터를 사용한 멀티스크린 시스템을 개발하였다.

여기에 프로젝터 4대를  PC1대로 제어, 레이저 제어 PC 1대, LED제어 PC 1대 등 총 9대의 PC를 제어하는데 이 Autoit를 사용하였다. 여기에 PC를 직접 켜고 끌 수 없으니 WOL 기능으로 On/Off를 제어하였다.

결과적으론 영상제어에 주로 사용하였으며 주고받은 데이터는 크지 않았다.

 

아무튼 이번에는 Autoit로 통신에 대해 설명하고자 한다.

샘플로 원격제어를 통해 다른 PC에서 메모장과 계산기를 실행해 보고자 한다.

 

다른 툴들도 대부분 동일하겠지만 기본적인 통신은 서버와 클라이언트로 나뉜다. 

서버에서 신호를 보내면 클라이언트에서 수신해서 처리한다. 송수신 처리의 완벽함을 추구한다면 수신처리 결과를 서버에 보내줘야 한다. 

 

통신(TCP/IP)이용 순서

순서는 대략적으로 다음과 같다.

1. [서버/클라이언트] 통신 초기화

2. [서버/클라이언트] 통신정보 읽기(서버와 클라이언트 IP, 통신 Port 등)

3. [서버/클라이언트] 통신 시작 및 연결 확인

4. [서버/클라이언트] 명령어 대기

5. [서버] 명령어 전달

6. [클라이언트] 명령어 수신

7. [클라이언트] 명령어 실행

8. [클라이언트] 명령어 실행 결과 서버에 송신

9. [클라이언트] 실행 종료 및 서버에 송신

10. [서버/클라이언트] 명령어 대기

 

서버와 클라이언트의 코드

 

그러면 위의 순서대로 적용한 서버 측 코드를 아래와 같이 확인해 보자. 실행 결과/종료 송신은 생략되었다.

서버의 경우 편의성을 위하여 지난번에 사용했던 GUI 코드를 활용하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
 
HotKeySet("{ESC}""_Exit");
 
Global $Form1, $Button1, $Button2, $DebugText, $connectState = False;
Global $serverIP, $clientIP, $nPort, $MainSocket, $ConnectedSocket, $ConnectedSocket_Rev;
 
#Region ### START Koda GUI section ###
$Form1 = GUICreate("TCP/IP Test"385200);
$Button1 = GUICtrlCreateButton("Note"3211214565);
$Button2 = GUICtrlCreateButton("Calc"21611214565);
$DebugText = GUICtrlCreateLabel("Debug Text : "321622020);
GUISetState(@SW_SHOW);
#EndRegion ### END Koda GUI section ###
 
$serverIP = @IPAddress1;
$clientIP = "192.168.200.49";
$nPort = 5538;
 
GUICtrlSetData($DebugText, "log : Waiting..");
 
$ConnectedSocket = -1;
$ConnectedSocket_Rev = -1;
 
TCPStartUp();
 
$MainSocket = TCPListen($serverIP , $nPort);
 
While 1
    $ConnectedSocket_Rev = TCPAccept($MainSocket)
 
    If  $ConnectedSocket_Rev <> -1 Then
        $recv = TCPRecv($ConnectedSocket_Rev, 2048)
        If $recv <> -1 Then
            GUICtrlSetData($DebugText, "log : "&$recv);
        EndIf
    EndIf
 
    If @error Then
        MsgBox(4112"오류""Error : "&@error, 5)
        ExitLoop
    EndIf
 
    $nMsg = GUIGetMsg();
    Switch $nMsg;
        Case $GUI_EVENT_CLOSE
            _Exit();
 
        Case $Button1
            $ConnectedSocket = TCPConnect($clientIP, $nPort);
            TCPSend($ConnectedSocket, "note");
            ConsoleWrite("note"&@CRLF);
 
        Case $Button2
            $ConnectedSocket = TCPConnect($clientIP, $nPort);
            TCPSend($ConnectedSocket, "calc");
            ConsoleWrite("calc"&@CRLF);
 
    EndSwitch
 
     sleep(2)
WEnd
 
Func _Exit();
    $ConnectedSocket = TCPConnect($clientIP, $nPort);
    TCPSend($ConnectedSocket, "exit");
 
    TCPCloseSocket($MainSocket)
    TCPShutdown()
    Exit;
EndFunc
cs

 

다음의 클라이언트의 코드는 아래와 같으며 GUI는 구성하지 않았다. 바로 실행되기 때문이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
HotKeySet("{ESC}""_Exit");
 
$serverIP = @IPAddress1;
$clientIP = "192.168.200.3";
$nPort = 5538;
 
$ConnectedSocket = -1;
$ConnectedSocket_Rev = -1;
 
TCPStartUp();
 
$MainSocket = TCPListen($serverIP , $nPort);
$ConnectedSocket = TCPConnect($clientIP, $nPort);
TCPSend($ConnectedSocket, "Connection is alive..");
 
 
while 1
    $ConnectedSocket_Rev = TCPAccept($MainSocket);
 
    If  $ConnectedSocket_Rev <> -1 Then
        $recv = TCPRecv($ConnectedSocket_Rev, 2048);
 
        If $recv <> -1 Then
 
            if($recv == "note"Then
                Run("notepad.exe");
            ElseIf($recv == "calc"Then
                Run("calc.exe");
            ElseIf($recv == "exit"Then
                _Exit();
            EndIf
 
        EndIf
    EndIf
 
    sleep(2);
WEnd
 
Func _Exit();
    TCPCloseSocket($ConnectedSocket);
    TCPShutdown();
    Exit;
EndFunc
cs

 

결과에 대해서는 다음 포스팅에서 실행영상과 함께 설명해 보겠다.

통신에 사용된 주요 명령어는 Autoit의 도움말 파일에서 정보를 얻을 수 있다. 해당 명령어 정보와 샘플을 참고하면 쉽게 만들 수 있다.

 

반응형

댓글