알렉사로 컴퓨터를 켰다면 꺼 보자 !! (Feat MQTT) [2]
안녕하세요 라이프온룸 호그스 입니다. :):):)
이번 포스팅에서는 MQTT 브로커를 구독하는 윈도우 서비스를 만들어 볼게요 ! 알렉사로 컴퓨터를 끄기 위한 목적으로요 ! 작업 순서는 이래요
- 환경구성
- 라이브러리 설치
- 컴퓨터를 끄는 MQTT 섭스크라이버 코드 만들기
- 위 코드를 윈도우 서비스로 만드는 코드 만들기
- 서비스 등록 후 실행
먼저 환경 구성법부터 보고 갈게요
1. 환경, 라이브러리 설치
Python 3.6을 이용할 거에요 가상환경 설정은 아래 링크를 참조하세요 !
라이브러리는 다음과 같습니다.
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