----------------------------------------------------------------------------
[목차]
1. IoT 사물 / 인증서 / 정책 생성
2. Python + paho-mqtt 를 사용하여 주제 구독, 게시 및 테스트
3. AWS Lambda에 연결하고 텔레그램 봇 메시지 보내기
----------------------------------------------------------------------------
2. Python + paho-mqtt 를 사용하여 주제 구독, 게시 및 테스트
AWS IoT 용 파이썬 패키지도 있는 것 같았지만, 메서드명도 괴랄하고 어떻게 쓰는지 한눈에 안보여서 사용하지 않았다.
Prepare your Raspberry Pi to work with AWS IoT (Getting started with IoT #2)
글을 참고하여, 작성해보았는데, 잘되어서 걍 이거 쓸 듯.
테스트용 AWS MQTT 클라이언트 사용
우선 AWS 에서 MQTT 테스트용 클라이언트를 제공한다.
일단 임의로 test/1 토픽을 구독해본다
구독할 토픽 이름을 임의로 설정하고, 주제 구독을 누른다. 와일드카드(+) 도 사용가능하다.
그럼 이런 화면이 나오는데, 좌측에 구독 중인 주제들이 보이고, 구독한 주제에 대해 메시지가 있으면 하단에 표시된다.
구독하고 있는 주제로 바로 게시도 가능하니, 해볼 경우 이렇게 나온다.
라즈베리파이 + Python
(사실 꼭 라즈베리일 필요는 없다. 나도 처음 해볼 땐 파이에서 했지만, 지금은 맥에서 그냥 진행.)
특정 버전 이상의 ssl 이 필요하지만, 내 기억에 파이에 기본으로 설치되어 있었던 것으로 기억한다.
파이썬3 기준으로 할거니 2로 쓰고 싶으신 분은 알아서 필요한 부분을 수정.
pip 이 없다면 이것부터 설치
$ curl https://bootstrap.pypa.io/get-pip.py | sudo python3
paho-mqtt 설치
$ sudo python3 -m pip install paho-mqtt
Python 코드는 아래처럼 작성하면 된다. 적당히 mqtt.py 정도로 만들자.
대충 mqtt 연결을 수립하고, 연결되면 test/2 주제를 구독하기 시작하며,
test/2 주제로 메시지가 게시되면 json 으로 load 해서 message 키의 값을 출력하는 코드이다.
import time, json, ssl
import paho.mqtt.client as mqtt
ENDPOINT = ''
THING_NAME = 'test-thing'
def on_connect(mqttc, obj, flags, rc):
if rc == 0: # 연결 성공
print('connected!!')
mqttc.subscribe('test/2', qos=0) # 구독
def on_message(mqttc, obj, msg):
if msg.topic == 'test/2':
payload = msg.payload.decode('utf-8')
j = json.loads(payload)
print(j['message'])
mqtt_client = mqtt.Client(client_id=THING_NAME)
mqtt_client.on_connect = on_connect
mqtt_client.on_message = on_message
mqtt_client.tls_set('./certs/ca.pem', certfile='./certs/cert.pem.crt',
keyfile='./certs/private.pem.key', tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None)
mqtt_client.connect(ENDPOINT, port=8883)
mqtt_client.loop_start() # threaded network loop
'''
while True:
# 어쩌구 저쩌구 해야할 일
time.sleep(0.1)
'''
'''
payload = json.dumps({'action': 'test'})
mqtt_client.publish('test/1', payload, qos=1)
'''
--------------------------------------------------
[유의사항]
1. 클라이언트 생성자에 clean_session 인자가 있는데, True(기본값)로 해야한다. False 로 할시 AWS 에서 연결을 끊어버린다.
2. publish 할때 retain 인자는 False(기본값)로 해야한다. True 로 보내면 마찬가지로 AWS 에서 연결을 끊어버린다.
3. 같은 아이디로 두개 이상이 연결되면 둘 다 연결이 종료된다.
4. AWS IoT 에서 qos 0 은 "0번 이상 전달"을 의미한다. qos 2 는 지원되지 않는다.
* 자세한건 AWS IoT 메시지 브로커 - 프로토콜 문서 참고.
--------------------------------------------------
publish 도 테스트해보려고 메인 루프는 주석처리 해뒀으니, 인터프리터 모드로 실행
$ python3 -i mqtt.py
정상적으로 연결되었을 경우 connected 로그가 뜬다.
혹시 ssl.SSLError: [SSL: SSLV3_ALERT_CERTIFICATE_UNKNOWN] sslv3 alert certificate unknown
같은 에러가 뜬다면, AWS 에서 인증서를 활성화하지 않은 경우니 활성화해주고 다시 시도해보자.
이후 아래쪽에 주석 처리 해둔대로 publish 를 시도해보면
>>> payload = json.dumps({'action': 'test'})
>>> mqtt_client.publish('test/1', payload, qos=1)
이렇게 아까 열어둔 mqtt 테스트 클라이언트에서 정상적으로 publish 된 것을 확인할 수 있다.
마찬가지로 파이에서 구독하고 있는 test/2 주제로 게시하면, 파이에서 on_message 함수가 실행되어 로그가 찍히는걸 확인할 수 있다.
메시지는 꼭 json 일 필요는 없다. 코드를 보면 알겠지만, 보낼땐 dump 하고 받을땐 load 한다. 다만 걍 json 을 쓰자..ㅋㅋ