알렉사로 컴퓨터를 켰다면 꺼 보자 !! (Feat MQTT) [1]
안녕하세요 라이프온 룸 호그입니다.
시작을 했으면 끝을 봐야 겠죠 ? ㅋㅋ 이번 포스팅에서는 알렉사를 이용해 컴퓨터를 꺼볼게요
전 포스팅을 좀 복습해 보자면 우리가 아두이노 모듈 코드를 짤 때 블루투스 모듈로 문자열 True를 받으면 컴퓨터를 켰었죠 ??? 여기 if 문에 False 를 추가해서 똑같은 코드를 넣으면 컴퓨터를 끌 수 있겠죠 ? 심지어 컴퓨터가 켜져있는 상태에서
알렉솨 턴온 컴퓨터
해도 꺼지 겠죠 스위치를 누르는 것이기 때문에 !!
사실 요즘에는 전원 스위치를 딸깍 눌러서 끄나(꾸우욱 누르면 강제종료기 땜에 좋지 않을 수 있습니다.) Window에서 종료를 하나 차이는 없습니다. 그래서 위에 설명했던 방법으로 끄셔도 상관이 없어요 !! ㅋㅋ (근데 저는 준 구시대 사람이라 항상 Window에서 끔니다. ㅋㅋㅋ )
하지만 교육적인 차원에서 ㅋㅋ 그리고 아두이노 모듈을 만들기 귀찮은 피플분들을 위해서 에코닷과 라즈베리파이 만 가지고 컴퓨터를 꺼 볼게요 !
1. MQTT
이번 프로젝트에서 사용할 프로토콜 입니돠아 !! MQTT 란 발행-구독 기반의 메시징 프로토콜이에요 ! IoT를 위한 프로토콜로 TCP/IP, Non TCP/IP 환경에서 사용 가능하며 사용하기 쉽고 가볍습니다.
MQTT는 Broker라는 서버 가 존재해요 그럼 왜 브로커냐 ? 발행자와 구독자를 연결해 주는 역할을 해서 그렇죠 ! 우리가 구성하려는 환경 상에서 설명을 해볼게요 아래 그림과 같아요 !
더 쉽게 설명 하자면 유튜브로 설명해 볼게요 MQTT Broker 는 유튜브에요 그리고 Fauxmo 는 유튜버 그리고 윈도우 서비스는 구독자에요 알림설정까지 해논 ㅋㅋㅋ 참 쉽죠잉
이걸 좀 기술 스멜나게 설명을 하면 Fauxmo는 에코닷에게 OFF 명령을 받아서 이 명령을 MQTT Broker 한테 Publish 할거에요 ! 그럼 Window Service는 라즈베리파이에서 돌고 있는 MQTT Broker를 구독하고 있다가 Broker에 신호가 들어오면 잽싸게 받아서 할 일을 하면 되요 (명령어로 컴퓨터를 끄는 일)
그러면 우리가 할일은 크게 두가지 입니다.
- 라즈베리파이
- MQTT Broker를 설치 한다.
- Fauxmo 가 MQTT 브로커에게 에코닷의 명령을 발행 할 수 있게 한다.
- 내컴퓨터 : MQTT 브로커를 구독하는 Python Window Service를 만들고 이를 컴퓨터가 켜질때 마다 실행 시킨다.
명확하쥬 ? ~~ 그럼 바로 해봅시다.
2. 라즈베리 파이에서 MQTT Broker 및 사용
apt-get 으로 설치 후 버전 확인을 하면 에러가 날거에요 Mosquitto 가 보통 설치 되자 마자 돌아 가기 때문에 그런거니 무시하셔도 됩니다.
#설치 sudo apt-get install -y mosquitto mosquitto-clients #버전확인 mosquitto -v
그리고 시스템 재부팅 시 자동 시작을 시키고 싶다면 아래와 같이 입력합니다.
sudo systemctl enable mosquitto.service
그럼 테스트를 해볼게요 ! Shell 을 두 개 열거에요!
한 Shell에서는 구독 다른 Shell 에서는 알림설정 .. 아니 발행을 해볼게요 아래처럼 말이죠
여기서 -t 옆에 붙는게 토픽이라는 건데요 섭스크라이버는 이 test 라는 토픽을 구독 중이고 이때 퍼블리셔가 test 토픽으로 메시지를 발행하면 구독자는 그 메시지를 받을 수 있습니다. 다 브로커의 역할 때문이죠 !
그럼 이제 파이썬에서 MQTT를 이용해 보겠습니다. 우선 라이브러리를 설치 해야 됩니다. 가상환경을 켜고 아래와 같이 입력합니다.
pip install paho-mqtt
설치가 완료 되었으면 퍼블리셔와 섭스크라이버 파일을 만들고 아래 코드를 입력합니다.
- mqtt_sub.py
import paho.mqtt.client as mqtt # The callback for when the client receives a CONNACK response from the server. def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) # Subscribing in on_connect() means that if we lose the connection and # reconnect then subscriptions will be renewed. client.subscribe("test") # The callback for when a PUBLISH message is received from the server. def on_message(client, userdata, msg): print(msg.topic+" "+str(msg.payload)) client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.connect("127.0.0.1", 1883, 60) # Blocking call that processes network traffic, dispatches callbacks and # handles reconnecting. # Other loop*() functions are available that give a threaded interface and a # manual interface. client.loop_forever()
- mqtt_pub.py
import paho.mqtt.client as mqtt client = mqtt.Client() client.connect("127.0.0.1",1883) client.publish("test", 'Hello how are you') client.loop(2)
결과가 어떻게 나왔나요 ? 섭스크라이버 쪽에서 아래와 같은 결과가 나오면 성공입니다. !
테스트도 했겠다 Fauxmo 코드를 변경해 보죠 Fauxmo에서는 퍼블리싱만 하면 되기 때문에 비교적 간단 합니다.
echowemoclient 및에 있는 example-minimal.py를 열어 줍니다.
파일 두 개를 수정할 건데요 저번 Post 에서만들었던 threadFunction.py 와 fauxmo의 예제 코드인 example-minimal.py 에요 원래 있던 코드에서 아래와 같이 추가해 주면 됩니다.
- example-minimal.py
import fauxmo import logging import time import threadFunction as tf from debounce_handler import debounce_handler logging.basicConfig(level=logging.DEBUG) # ------------ MQTT INFO ----------- BROKER_IP = "127.0.0.1" BROKER_PORT = 1883 MQ_TOPIC = "/home_iot/Desktop" # .....생략.......... class device_handler(debounce_handler): """Publishes the on/off state requested, and the IP address of the Echo making the request. """ # Device TRIGGERS = {COMPUTER: 51999} def act(self, client_address, state, name): print "State", state, "on ", name, "from client @" # "Desktop" 에 관한 명령이 Echo dot 으로 들어오면 처리해 주는 부분 if name == COMPUTER: if state == True: tf.bt_q.put_nowait('True') elif state == False: tf.publishMSG(BROKER_IP, BROKER_PORT, MQ_TOPIC, 'Off') return True # .....생략..........
- threadFunction.py
# -*- coding: utf-8 -*- #!/usr/bin/env python #...생략.......... import paho.mqtt.client as mqtt #...생략.......... #--- MQTT ---------- def publishMSG(broker_ip, broker_port, topic, msg): client = mqtt.Client() client.connect(broker_ip, broker_port) client.publish(topic, msg) if __name__ == "__main__": pass
넵 이렇게 하고 아까 만들었던 mqtt_sub.py 에서 토픽 부분을 “/home_iot/Desktop” 으로 변경하고 Fauxmo 를 죽였다 살려 줍니다. 아래 처럼요
그리고 외쳐 보세요
알렉사 턴 오프 데스크탑 !!!!!!!!!!!!!!!!!!!!!!!
그러면 mqtt_sub.py를 실행 시킨 Shell에 뭔가가 나올 겁니다. 한번 확인해 보세요 !!
그럼 이제 윈도우 서비스를 만들어서 “/home_iot/Desktop” 을 구독하면 됩니다. 그리고 구독 중인 토픽에 메시지가 들어왔을 때 컴퓨터를 끄면 되겠죠 ? 윈도우 명령어로요 ㅋㅋㅋ
이 내용은 다음 포스팅에서 알아 볼게요 ! 긴 글 읽으시느라 수고 하셨구요 ! 다음 시간에 뵐게요 ! ~