
import paho.mqtt.client as mqtt
import time
import json
from gpiozero import Motor
# GPIO 핀 설정 (모터 제어 핀 지정)
motor1 = Motor(forward=20, backward=21)
motor2 = Motor(forward=23, backward=24)
motor3 = Motor(forward=27, backward=17)
motor4 = Motor(forward=22, backward=6)
# MQTT 브로커 및 연결 설정
BROKER = "a3p9eizp6emyml-ats.iot.ap-northeast-2.amazonaws.com" # AWS IoT > 연결 > 도메인 구성 > iot:Data-ATS
PORT = 8883
TOPIC = "$aws/things/aaa/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("Recieved 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.backward(1.0)
motor2.backward(1.0)
motor3.backward(1.0)
motor4.backward(1.0)
time.sleep(100)
motor1.stop()
motor2.stop()
motor3.stop()
motor4.stop()
elif emergency_status == "HEAVY_SNOW":
# 폭설 비상 상태
print("Heavy-Snow")
motor1.backward(1.0)
motor2.backward(1.0)
motor3.forward(1.0)
motor4.forward(1.0)
time.sleep(100)
motor1.stop()
motor2.stop()
motor3.stop()
motor4.stop()
else:
# 정상 상태 - 추후 태양 추적 알고리즘을 사용해 태양을 따라 움직이도록 설정할 예정
print("Normal")
# 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()
작동이 잘 되는 것을 확인하고 일주일 뒤 시연 영상을 촬영하기위해 라즈베리파이를 실행시키고 연결을 시도했다. 근데 잘 연결되던 인터넷이 갑자기 연결되지 않았고, 문제를 찾아보니 네트워크 설정이 초기화되어서 라즈베리파이가 인터넷에서 호스트 이름을 IP주소로 변환하는데 필요한 DNS 설정이 안돼 있던 것이었다.
시스템 재부팅 과정에서 네트워크 설정 파일인 /etc/resolv.conf가 자동으로 덮어씌어진 것으로 예상되었다.
/etc/resolv.conf 파일 생성 및 DNS 서버 설정
아래 명령어로 /etc/resolv.conf 파일을 생성한다.
sudo nano /etc/resolv.conf
열리는 파일에 다음 내용을 추가한다.
nameserver 8.8.8.8
nameserver 8.8.4.4
resolv.conf 파일 고정
또 /etc/resolv.conf 파일이 자동으로 덮어씌워질 수 있기 때문에, 파일을 수정 불가능하게 만들어 고정한다.
sudo chattr +i /etc/resolv.conf
네트워크 서비스 재시작
위 설정을 적용하기 위해 네트워크 서비스를 재시작한다.
sudo systemctl restart networking