알렉사로 컴퓨터를 켰다면 꺼 보자 !! (Feat MQTT) [2]


안녕하세요 라이프온룸 호그스 입니다. :):):)

이번 포스팅에서는 MQTT 브로커를 구독하는 윈도우 서비스를 만들어 볼게요 ! 알렉사로 컴퓨터를 끄기 위한 목적으로요 ! 작업 순서는 이래요 

  1. 환경구성
  2. 라이브러리 설치
  3. 컴퓨터를 끄는 MQTT 섭스크라이버 코드 만들기 
  4. 위 코드를 윈도우 서비스로 만드는 코드 만들기 
  5. 서비스 등록 후 실행

먼저 환경 구성법부터 보고 갈게요 

1. 환경, 라이브러리 설치 

 

Python 3.6을 이용할 거에요 가상환경 설정은 아래 링크를 참조하세요 !

Python 개발환경 (Virtualenv)

라이브러리는 다음과 같습니다. 

pip install pywin32
pip install pyinstaller
pip install paho-mqtt

2. 컴퓨터를 끄는 MQTT 섭스크라이버 코드 만들기

코드는 아래와 같습니다. 윈도우 서비스의 Broker 는 라즈베리파이에 설치된 브로커 입니다. 그래서 라즈베리 파이 아이피가 필요 하구요 이 코드를 돌려서 테스트 해보려면 # 테스트 용도 및에 Print 구문에 주석을 풀고 os.system.. 은 주석 처리하고 테스트를 해보세요 !! 

  • controlDeskTop.py
#-*- coding: utf-8 -*-
import paho.mqtt.client as mqtt
import time
import os

MQ_SHUTDOWN = "/home_iot/Desktop"
MQ_BROKER_IP = "라즈베리파이아이피"

def on_connect(client, userdata, flags, rc):
    try:
        client.subscribe(MQ_SHUTDOWN)
    except:
        pass


# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
    print(msg.payload)
    try:
        if msg.topic == MQ_SHUTDOWN:
            if msg.payload == b'Off':
                # 테스트 용도
                #print("--------------Shut Down Computer--------------")
                # 컴퓨터 끄는 window 명령어
                os.system("shutdown /s /t 0")

    except Exception as e:
        pass



def serviceRun():
    client = mqtt.Client()
    client.on_connect = on_connect
    client.on_message = on_message
    while True:
        try:
            client.connect(MQ_BROKER_IP, 1883, 60)
            break
        except Exception as e:
            time.sleep(10)
    print("Service Run")
    client.loop_forever()


if __name__ == "__main__":
    serviceRun()

3. 위 코드를 윈도우 서비스로 만드는 코드

아래와 같이 짜주시면 됩니다. 

  • controlDeskTopService.py
import win32service
import win32serviceutil
import win32event
import servicemanager
import controlDeskTop as condesk
import socket
import sys

class controlService(win32serviceutil.ServiceFramework):
_svc_name_ = "DeskTopControl"
_svc_display_name_ = 'Remote Control Desktop Service'

def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
socket.setdefaulttimeout(60)



def SvcStop(self):

self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)

def SvcDoRun(self):

servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_, ''))
self.main()


def main(self):
print('Start Service')
condesk.serviceRun()
#win32event.WaitForSingleObject(self.hWaitStop,
# win32event.INFINITE)


if __name__ == "__main__":

if len(sys.argv) == 1:
servicemanager.Initialize()
servicemanager.PrepareToHostSingle(controlService)
servicemanager.StartServiceCtrlDispatcher()
else:
win32serviceutil.HandleCommandLine(controlService)

4. 윈도우 서비스 등록 후 실행 

먼저 위 controlDeskTopService.py 파일을 .exe 파일로 만들어 줄게요 

pyinstaller --onefile --hidden-import win32timezone controlDeskTopService.py

여기서 –onefile 은 .exe 파일 한개만 만들겠다는 의미입니다. 이 옵션을 안주면 여러가지 잡다한 파일이 추가 생성됩니다. 

–hidden은 .exe 파일을 실행 할 때 CMD 창을 숨기겠다는 의미 입니다. 이 옵션을 안주면 .exe 파일을 실행할 때 CMD 창이 뜨게 됩니다. 

 

그럼 dist 라는 폴더가 생성되었을 겁니다. 들어가면 controlDeskTopService.exe 파일이 있을 거에요 

CMD 를 관리자 권한으로 열어 줍니다. 그리고 .exe 파일이 있는 폴더로 가주세요 !

cd C:\controlDeskTop\mainController\dist

그리고 아래와 같이 입력해 줍니다. 

controlDeskTopService.exe install

넵 인스톨이 완료 되었어요 ㅋㅋ 간단하쥬 ? 그럼 작업 관리자를 열어서 서비스탭에 가서 DeskTopControl 을 찾아보세요 아래와 같이 떠 있을 거에요 

그럼 우클릭 해서 서비스 열기를 선택합니다. Remote Control Desktop Service를 찾아보세요 !! 

아래서 시작 유형이 자동으로 안되어 있으면 

우클릭 -> 속성 -> 시작유형 을 자동으로 변경해 줍니다. 

넵 그러면 우리는 모든 준비를 마쳤어요 !! 알렉사에게 외쳐줍니다.

(혹시 뭔가 작업중이셨다면 반드시 저장을 하고 외치세요 ! 저는 유튭영상찍고 편집중에 테스트 하다가 편집 자료 다 날렸어요 ㅜㅜ)

 

알렉사 턴 오프 데스크탑

넵 재부팅 후 돌아 오셨나요 ?? ㅋㅋㅋㅋㅋ 여튼 이렇게 해서 알렉사 로 컴퓨터를 꺼 봤습니다. 이제 까지 긴글 읽어 주셔서 넘나 감사드리구요 이 글이 여러분께 큰 도옴이 됬으면 좋겠습니다. 감솨합니다. ~~~

아 그리고 오늘의 내용은 아래 Github에서 확인 가능 하시구요 가상환경 만들기, 활성화 하기 등을 bat 파일로 만들어 놨으니 쉽게 사용하실 수 있으실 거에요 ㅋㅋㅋ 

https://github.com/hog225/echowemoclient/tree/master/IOT_Client/DesktopOffWindowService

 

You may also like...

댓글 남기기

이메일은 공개되지 않습니다.