Naver Cloud Platform

 

1. 네이버 클라우드 사용하기

https://www.ncloud.com/

 

NAVER CLOUD PLATFORM

cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification

www.ncloud.com

네이버에서도 이제 아마존 AWS와 같은 클라우드 플랫폼을 제공하고있습니다.

 

국내 사용자에게는 AWS의 1년 무료 서비스처럼 micro 서버를 무료로 1년 제공하며, 3개월간 사용할 수 있는 10만 크리딧을 제공하고있습니다.(2019년 1월 이후 가입자)

 

사용방법은 간단합니다.

 

위의 링크에 들어가서 가입 후 원하는 서비스를 신청하면 끝~ 한글이고 설명이 친절해서 대부분의 기능은 손쉽게 사용할 수 있습니다.

 

 

 

2. Micro Server 신청

웹페이지를 위한 서버로 Micro 서버를 신청하여 사용해보겠습니다.

 

https://www.ncloud.com/product/compute/server

 

NAVER CLOUD PLATFORM

cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification

www.ncloud.com

위의 링크에서 [이용신청]을 클릭하면 됩니다.

 

이후 서버생성 부분에 들어가서 아래와 같이 설정해주었습니다.

 

 

사용할 OS는 Ubuntu, 용량과 서버타입은 1년 무료인 50기가에 Micro로 신청합니다. -> 하단에 다음클릭

 

 

서버 설정은 아래와 같습니다.

 

 

저는 현재 Micro 서버를 이미 만든 상태여서 설정부분이 붉게 표시되어있는 것을 볼 수 있습니다.

 

Micro는 HDD만 지원됩니다. 위와같이 설정하고 다음을 눌러주세요.

 

 

 

다음 인증키 부분에 [인증키 이름]을 입력해주신 후 해당 파일을 다운로드해주세요.

 

 

네트워크 설정은 기본적으로 위와같이 되어있습니다. 그냥 다음눌르고 최종확인도 완료해주시면 됩니다.

 

 

 

이 후 Server 부분을 보면 아래와같은 상태를 볼 수 있습니다.

 

 

상태가 [운영중]이 아니라면 조금 기다려주세요. 자동으로 운영중상태가됩니다.

 

 

보시면 공인IP부분이 빠져있는 것을 볼 수 있습니다.

 

이부분은 추후 다루겠지만, 일단 과금이 되는 부분이기 때문에 현재는 다루지 않겠습니다.

 

참고로 가격은 아래와 같습니다.

 

 

 

 

WAV 음악파일 속도 변형

 

 

1. WAV 파일이란?

WAV(웨이브 오디오 포맷, Waveform audio format)은 마이크로소프트와 IBM의 오디오 파일 표준입니다.

 

덕분에 해당 포맷에 대해 상세하게 적혀있는 사이트들과 각종 pdf자료들이 존재합니다. 아래는 그중 한 사이트입니다.

 

http://soundfile.sapp.org/doc/WaveFormat/

 

Microsoft WAVE soundfile format

WAVE PCM soundfile format The WAVE file format is a subset of Microsoft's RIFF specification for the storage of multimedia files. A RIFF file starts out with a file header followed by a sequence of data chunks. A WAVE file is often just a RIFF file with a

soundfile.sapp.org

 

 

 

 

아래는 WAV 파일에 대한 포맷 정보입니다.

 

WAV 파일 포맷

 

WAV 파일은 크게 세 개의 영역으로 분류되는 것을 볼 수 있으며, Big Little dndian을 섞어 사용하는 것을 볼 수 있습니다.

 

Python에서 WAV 파일을 불러와 위의 포맷을 확인해보겠습니다.

 

binary read

단순히 샘플 파일을 하나 갖고 와서 위와 같이 열어보았습니다.

 

이를 위 사이트(http://soundfile.sapp.org/doc/WaveFormat/)에 나와있는 정보와 비교해보며 보겠습니다.

 

 

 

 

2. First Block - RIFF 영역 헤더

 

먼저 Little endian과 Big endian에 따라 hex값을 출력해주는 함수를 만들어주었습니다.

 

 

다음으로 위의 사이트에 나와있는 첫 번째 블록 정보를 보았습니다.

 

ChunkID : "RIFF"라는 문자를 ASCII로 갖고 있음. (big-endian기준 : 0x52494646)

ChunkSize : 전체 파일크기 중 ChunkID와 ChunkSize부분인 8Byte를 제외한 전체 크기를 말함

Format : "WAVE"라는 문자를 갖고 있음 (big-endian기준 : 0x57415645)

 

이번에는 파이썬에서 보겠습니다.

 

위와 같이 홈페이지에 나와있는 것과 동일한 ChunkID와 Format값을 갖고 있는 것을 볼 수 있으며, ChunkSize의 값을 10진수로 표시하고 8을 더해 전체 파일크기와 비교해보겠습니다.

 

예측되는 전체 파일크기
실제 파일정보

 

보시는 것과 같이 동일한 파일크기를 갖는 것을 볼 수 있습니다.

 

 

 

 

3. Second Block - fmt 영역 헤더

 

다음은 두 번째 블록 정보입니다.

Subchunk1ID : "fmt "값을 갖고 있음. (big-endian기준 : 0x666d7420)

Subchunk1Size : Subchunk1의 크기

AudioFormat : PCM 방식이면 1

NumChannels : Mono = 1, Stereo = 2

SampleRate : 샘플링 주기

ByteRate : SampleRate * NumChannels * BPS/8

BlockAlign : NumChannels * BPS/8

BPS : 초당 비트 값

Extra Data

 

마찬가지로 파이썬에서 실제 데이터로 보겠습니다.

 

각각의 데이터는 Hex데이터임을 생각하시고 봐주세요.

 

위의 데이터를 보게 되면, 해당 음원(wav파일)은 아래와 같은 정보를 갖고 있습니다.

 

PCM 방식 파일 압축, 스테레오 음원, 샘플링 주기는 44100Hz(0xac44), BPS는 16bit

 

위 정보를 기반으로 음원 재생 프로그램은 노래를 재생하게 되는 중요한 정보입니다.

 

 

 

 

4. Last Block - data 영역

 

마지막 블록입니다.

 

Subchunk2ID : "Data"라는 값을 갖고 있음. (big-endian 기준 : 0x64617461)

Subchunk2Size : Subchunk2의 크기를 말합니다.

Data : 실제 음원 정보를 갖고 있는 데이터입니다.

 

Data 영역은 Little endian으로 구성되어있는 모습 그대로 표시한 것입니다.

 

 

이렇게 해서 일단 WAV 파일의 정보를 모두 확인해보았습니다.

 

다음장에서는 해당 데이터를 수정하여 음원을 변경하는 것을 보여드리겠습니다.

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

 

yekyu94/WOL_python

python WOL GUI Coding. Contribute to yekyu94/WOL_python development by creating an account on GitHub.

github.com

 

Pyqt를 통해서 제작한 코드이기 때문에 pyqt가 설치되어있지 않는 경우 애러가 발생합니다.

 

 

 

 

3. Testing

 

 

실행화면
와이어샤크로 확인

 

위와같이 전송이 완료되면 입력한 IP주소와 MAC주소를 타겟으로한 WOL패킷이 3개 전송되는 것을 볼 수 있습니다.

 

이렇게 만든 프로그램을 pyinstaller같은 라이브러리를 이용하여 쉽게 exe파일등으로 변환이 가능합니다.

 

해당부분은 넘어가겠습니다.

+ Recent posts