본문 바로가기
IoT

[MQTT Broker] Python Topic Publish

by 너드나무 2024. 4. 24.
728x90

서론

금번 구현하는 IoT 시스템의 개발 환경은 주제를 게시하여 원격으로 제어 요청을 보내는 Backend와 주제를 구독하여 작업을 수행하는 IoT Node로 구성되어 있다.
Backend Server에서 MQTT 메세지를 게시하는 방법을 점검해본다.

이론적 배경

  • Backend Server : Python(FastAPI)
  • IoT Node : Dart(Flutter)

가설

  1. awscrt, awsiot 등 AWS 지원 라이브러리를 활용하여 주제를 게시한다.
  2. mqtt_connection_builder.mtls_from_path 함수를 분석하여 MQTT 관련 패킷을 제어한다.

mqtt_connection_builder.mtls_from_path 선택 Arguments


검증

  • AWS IoT Core 라이브러리를 활용한 주제 게시 (Publish)

ENDPOINT, CLIENT_ID 참고

from awscrt import io, mqtt, auth, http
from awsiot import mqtt_connection_builder
import time as t
import json, threading

# MESSAGE는 Payload를 포함한다.
def mqtt_broker(MESSAGE, topic):
	received_all_event = threading.Event()

	# AWS IoT Core 도메인
	ENDPOINT = "{id}.ap-northeast-2.amazonaws.com"
	# 클라이언트 ID
	CLIENT_ID = "{clinetId}"
	# certificate 인증서 Filepath
	PATH_TO_CERTIFICATE = "{filepath}/certificate.pem.crt"
	# private 인증서 Filepath
	PATH_TO_PRIVATE_KEY = "{filepath}/private.pem.key"
	# CA1 인증서 Filepath
	PATH_TO_AMAZON_ROOT_CA_1 = "{filepath}/AmazonRootCA1.pem"

	# MQTT mtls 환경 설정
	event_loop_group = io.EventLoopGroup(1)
	host_resolver = io.DefaultHostResolver(event_loop_group)
	client_bootstrap = io.ClientBootstrap(event_loop_group, host_resolver)
	mqtt_connection = mqtt_connection_builder.mtls_from_path(
		endpoint=ENDPOINT,
		cert_filepath=PATH_TO_CERTIFICATE,
		pri_key_filepath=PATH_TO_PRIVATE_KEY,
		client_bootstrap=client_bootstrap,
		ca_filepath=PATH_TO_AMAZON_ROOT_CA_1,
		client_id=CLIENT_ID,
		clean_session=False,
		keep_alive_secs=1200
	)

	# MQTT 연결
	connect_future = mqtt_connection.connect()
	connect_future.result()

	# MQTT 주제 게시
	mqtt_connection.publish(
	    topic=topic,
	    payload=json.dumps(MESSAGE),
	    qos=mqtt.QoS.AT_LEAST_ONCE
	)

	# MQTT 연결 종료
	disconnect_future = mqtt_connection.disconnect()
	disconnect_future.result()

	return MESSAGE

 

  • AWS IoT Core MQTT 주제 구독 (Subscribe)


결론

  1. keep_alive_secs 등 TCP 세션이 단절됐을 경우, MQTT 재연결을 위한 로직을 염두해야 한다.
  2. 단순 기능으로보면, Socket을 활용한 채팅 기능과 유사하다.

참고 및 인용 출처

- AWS. [Github]. (Nov 3, 2023). aws-iot-device-sdk-python-v2. https://github.com/aws/aws-iot-device-sdk-python-v2/blob/main/samples/pubsub.py
- AWS. AWS IoT Device SDK v2 for Python documentation. https://aws.github.io/aws-iot-device-sdk-python-v2/awsiot/mqtt_connection_builder.html
728x90
반응형