반응형
WOL 기능에서 사용되는 매직패킷을 전송하는 프로그램
python + pyqt
0. 개발환경
- 맥북 OSX
- PyCharm (Python 3.7x) + pyqt
1. GUI
먼저 대략적인 앱 디자인을 구성합니다.
저는 위와같이 대충 만들었습니다.
정확한 크기는 코딩단계에서 조절해줍니다.
[QT 디자이너]를 사용하지 않을 예정이기 때문에 대충 목표디자인을 파워포인트로 잡았습니다.
2. Coding
udp통신이고 기존에 파이썬으로 WOL패킷전송을 수행하는 코드를 작성해둔 적이 있었기 때문에 해당코드를 그대로 이용했습니다.
2019/05/14 - [이론/네트워크] - [네트워크 패킷] Python으로 WOL패킷 송신하기(1/2)
2019/05/14 - [이론/네트워크] - [네트워크 패킷] Python으로 WOL패킷 송신하기(2/2)
import sys
import socket, struct, time
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPixmap, QIcon
from PyQt5.QtCore import Qt
class LayoutWindow(QMainWindow):
def __init__(self):
super().__init__()
wg = WidgetSet()
self.setCentralWidget(wg)
self.statusBar().showMessage('Youngq.tistory.com')
self.setWindowTitle('WOL Program')
self.setWindowIcon(QIcon('web.png'))
self.setGeometry(500, 500, 350, 180)
self.show()
class WidgetSet(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# Line 1 : Wol 이미지 + msg 영역
hbox0 = QHBoxLayout()
hbox0.setAlignment(Qt.AlignVCenter)
pixmap = QPixmap('wol_mini.png')
pixmap = pixmap.scaledToWidth(35)
lbl_img = QLabel()
lbl_img.setPixmap(pixmap)
hbox0.addWidget(lbl_img)
hbox0.addStretch(200)
msg = QLabel()
msg.setFixedSize(200,25)
msg.setText("Ready")
msg.setAlignment(Qt.AlignRight)
self.err = msg
hbox0.addWidget(msg)
# Line 2 : 대역폭입력 + 콤보박스
hbox1 = QHBoxLayout()
hbox1.setAlignment(Qt.AlignVCenter)
qle1 = QLineEdit(self)
qle1.setFixedSize(170, 25)
qle1.setPlaceholderText("목적지 IP주소 또는 망주소 입력")
self.ip = qle1
hbox1.addWidget(qle1)
hbox1.addStretch(20)
cIP = QLabel()
cIP.setFixedSize(110, 30)
currentIP = self.ipaddr()
cIP.setText("IP : "+currentIP)
hbox1.addWidget(cIP)
# Line 3 : 맥주소 입력 + 전송버튼
hbox2 = QHBoxLayout()
hbox2.setAlignment(Qt.AlignHorizontal_Mask)
qle2 = QLineEdit(self)
qle2.setFixedSize(170, 25)
qle2.setPlaceholderText("MAC 주소 입력")
self.mac = qle2
hbox2.addWidget(qle2)
hbox2.addStretch(20)
btn = QPushButton(self)
btn.setText('Send')
btn.setFixedSize(70, 30)
self.sendBtn = btn
btn.clicked.connect(self.sending) # EventH
hbox2.addWidget(btn)
# Stacking : 레이아웃 배치
vbox = QVBoxLayout()
vbox.addLayout(hbox0)
vbox.addLayout(hbox1)
vbox.addLayout(hbox2)
self.setLayout(vbox)
def sending(self):
try:
WOL(self.mac.text(), self.ip.text())
self.err.setText("신호 전송완료")
except:
self.err.setText("잘못된 입력이 존재합니다.")
def ipaddr(self):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
return s.getsockname()[0]
def WOL(macAddr, network):
sep = macAddr[2]
macAddr = macAddr.replace(sep, '')
data = b'FFFFFFFFFFFF' + (macAddr * 16).encode()
send_data = b''
for i in range(0, len(data), 2):
send_data += struct.pack('B', int(data[i: i + 2], 16))
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
for i in range(3):
sock.sendto(send_data, (network, 9))
time.sleep(0.05)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = LayoutWindow()
sys.exit(app.exec_())
특별한 알고리즘이 필요없는 단순 프로그램이지만, GUI 구성까지 포함해서 100줄 조금 넘어가는 코드로... 역시 파이썬입니다...
해당 코드는 다음 링크에서 복사 가능합니다.
https://github.com/yekyu94/WOL_python/blob/master/wol.py
Pyqt를 통해서 제작한 코드이기 때문에 pyqt가 설치되어있지 않는 경우 애러가 발생합니다.
3. Testing
위와같이 전송이 완료되면 입력한 IP주소와 MAC주소를 타겟으로한 WOL패킷이 3개 전송되는 것을 볼 수 있습니다.
이렇게 만든 프로그램을 pyinstaller같은 라이브러리를 이용하여 쉽게 exe파일등으로 변환이 가능합니다.
해당부분은 넘어가겠습니다.
반응형