[XOLAR] AWS IoT Core + SpringBoot + RaspberryPi

2한나·2024년 10월 28일
0

XOLAR

목록 보기
3/4
post-thumbnail

목표
AWS IoT와 MQTT를 활용해 비상 메시지를 수신하고, 이를 통해 라즈베리파이에서 DC 모터 자동 제어하기

구현할 아키텍처 구조

Spring Boot에서 비상버튼 요청을 통해 AWS IoT 사물의 Shadow를 업데이트하면, 라즈베리파이가 이를 받아 Shadow 내용에 따라 DC모터를 제어한다.

라이브러리 설치

pip install paho-mqtt

인증서 파일 설정

AWS IoT 인증서를 만들 때 다운받았던 파일들을 라즈베리파이에 넣어준다.
나는 /home/pi/certificates 에 저장했다.
AmazonRootCA1.pem, certificate.pem.crt, private.pem.key

코드 작성

import paho.mqtt.client as mqtt
import time
import json
from gpiozero import Motor

# GPIO 핀 설정 (모터 제어 핀 지정)
motor1 = Motor(forward=20, backward=21)

# MQTT 브로커 및 연결 설정
BROKER = "{AWS IoT EndPoint}"  # AWS IoT > 연결 > 도메인 구성 > iot:Data-ATS
PORT = 8883
TOPIC = "$aws/things/{사물 이름}/shadow/update"

# 인증서 파일 경로 설정
CA_PATH = "/home/pi/certificates/AmazonRootCA1.pem"
CERT_PATH = "/home/pi/certificates/certificate.pem.crt"
KEY_PATH = "/home/pi/certificates/private.pem.key"

# MQTT 연결 콜백 함수 정의
def on_connect(client, userdata, flags, rc):
    print("MQTT Connect Success, Code:", rc)  # 연결 성공 메시지 출력
    client.subscribe(TOPIC)  # 지정된 토픽 구독 시작

# MQTT 메시지 수신 콜백 함수 정의
def on_message(client, userdata, msg):
    payload = msg.payload.decode()  # 수신된 메시지 디코딩
    print("Received Message:", payload)  # 수신된 메시지 출력

    # 수신된 메시지를 JSON으로 파싱하여 비상 상태 추출
    data = json.loads(payload)
    emergency_status = data.get("state", {}).get("reported", {}).get("status")

    # 비상 상태에 따른 모터 동작
    if emergency_status == "STRONG_WIND":
        # 강풍 비상 상태
        print("Strong-Wind")  
        motor1.forward()
        time.sleep(10)
        motor1.stop()
    elif emergency_status == "HEAVY_SNOW":
        # 폭설 비상 상태
        print("Heavy-Snow")  
        motor1.backward()
        time.sleep(10)
        motor1.stop()
    else:
        # 정상 상태
        print("Normal")  
        motor1.forward()
        time.sleep(5)
        motor1.stop()

# MQTT 클라이언트 설정 및 실행
client = mqtt.Client()
client.tls_set(CA_PATH, certfile=CERT_PATH, keyfile=KEY_PATH)  # 보안 인증 설정
client.on_connect = on_connect  # 연결 콜백 함수 설정
client.on_message = on_message  # 메시지 수신 콜백 함수 설정

# MQTT 브로커에 연결하고, 무한 루프로 메시지 수신 대기
client.connect(BROKER, PORT)
client.loop_forever()

작동 영상

트러블 슈팅

1. Error: Unsupported callback API version: version 2.0 added a callback_api_version, see docs/migrations.rst for details

문제상황
paho-mqtt 라이브러리의 최신 버전과 기존 코드의 콜백 함수 설정이 호환되지 않아 발생하는 문제이다.

해결방법
기존 코드와의 호환성을 유지하기 위해 paho-mqtt의 안정적인 이전 버전 (1.5.1)으로 설치하였다.

pip install paho-mqtt==1.5.1

2. 파이썬 코드를 실행시켰을 때 MQTT와 연결이 안 된 상황

문제상황
MQTT와 연결이 안돼 프로그램이 계속 무한 루프만 돌고 있었다.
AWS IoT 정책문제일 수도 있다고 생각했고, 처음 정책을 만들때 설정한 활성 버전의 Resource가 잘못 설정되어 있다는 것을 알게되었다.

해결방법
활성 버전을 추가하여 Resource를 *(와일드카드)로 설정해주었다.
이렇게 설정하면 해당 클라이언트는 모든 사물에 대해 연결 권한을 갖는다.
나중에 더 공부해 해당되는 사물만 연결가능하도록 막아야겠다.

0개의 댓글