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


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

시작을 했으면 끝을 봐야 겠죠 ? ㅋㅋ 이번 포스팅에서는 알렉사를 이용해 컴퓨터를 꺼볼게요 

전 포스팅을 좀 복습해 보자면 우리가 아두이노 모듈 코드를 짤 때 블루투스 모듈로 문자열 True를 받으면 컴퓨터를 켰었죠 ??? 여기 if 문에 False 를 추가해서 똑같은 코드를 넣으면 컴퓨터를 끌 수 있겠죠 ? 심지어 컴퓨터가 켜져있는 상태에서 

알렉솨 턴온 컴퓨터

해도 꺼지 겠죠 스위치를 누르는 것이기 때문에 !!

사실 요즘에는 전원 스위치를 딸깍 눌러서 끄나(꾸우욱 누르면 강제종료기 땜에 좋지 않을 수 있습니다.) Window에서 종료를 하나 차이는 없습니다. 그래서 위에 설명했던 방법으로 끄셔도 상관이 없어요 !! ㅋㅋ (근데 저는 준 구시대 사람이라 항상 Window에서 끔니다. ㅋㅋㅋ )

하지만 교육적인 차원에서 ㅋㅋ 그리고 아두이노 모듈을 만들기 귀찮은 피플분들을 위해서 에코닷라즈베리파이 만 가지고 컴퓨터를 꺼 볼게요 !

 

1. MQTT

이번 프로젝트에서 사용할 프로토콜 입니돠아 !! MQTT 란 발행-구독 기반의 메시징 프로토콜이에요 ! IoT를 위한 프로토콜로 TCP/IP, Non TCP/IP 환경에서 사용 가능하며 사용하기 쉽고 가볍습니다. 

MQTT는 Broker라는 서버 가 존재해요 그럼 왜 브로커냐 ? 발행자와 구독자를 연결해 주는 역할을 해서 그렇죠 ! 우리가 구성하려는 환경 상에서 설명을 해볼게요  아래 그림과 같아요 ! 

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” 을 구독하면 됩니다. 그리고 구독 중인 토픽에 메시지가 들어왔을 때 컴퓨터를 끄면 되겠죠 ? 윈도우 명령어로요 ㅋㅋㅋ 

이 내용은 다음 포스팅에서 알아 볼게요 ! 긴 글 읽으시느라 수고 하셨구요 ! 다음 시간에 뵐게요 ! ~

 

You may also like...