[MQTT] 실습 - 클라이언트 클러스터

IRISH·2024년 7월 27일

MQTT

목록 보기
3/3
post-thumbnail

클라이언트 클러스터는 여러 MQTT 클라이언트가 동시에 브로커에 연결되어 메시지를 발행하고 구독하는 환경을 의미합니다. 이를 통해 대규모 IoT 네트워크 시나리오를 시뮬레이션하고, 브로커의 성능 및 안정성을 테스트할 수 있습니다.

클라이언트 클러스터를 통한 MQTT 실습

1. Mosquitto 브로커 실행

우선, Mosquitto 브로커를 실행합니다. 브로커는 클러스터의 중심 역할을 하며, 모든 클라이언트는 브로커와 통신합니다.

"C:\Program Files\mosquitto\mosquitto.exe" -v

2. 여러 클라이언트 시뮬레이션

각 클라이언트는 데이터를 발행하거나 구독하는 역할을 할 수 있습니다. 여기서는 간단히 여러 클라이언트를 만들어 온도 데이터를 발행하고, 다른 클라이언트가 이를 구독하여 처리하는 예제를 만들어 보겠습니다.

3. 클러스터 클라이언트 코드 작성

Publisher 클라이언트 코드 (여러 클라이언트를 생성할 수 있습니다):

publisherCluster.py:

# "C:\Program Files\mosquitto\mosquitto.exe" -v
import paho.mqtt.client as mqtt
import time
import random
import threading

broker = "localhost"
topic = "sensors/temperature"

def publish_temperature(client_id):
    client = mqtt.Client(client_id, protocol=mqtt.MQTTv311)
    client.connect(broker)
    
    while True:
        temperature = 25.0 + (5.0 * random.random())
        print(f"Client {client_id} publishing temperature: {temperature}")
        client.publish(topic, temperature)
        time.sleep(5)

# 여러 클라이언트 생성
num_clients = 5
threads = []

for i in range(num_clients):
    t = threading.Thread(target=publish_temperature, args=(f"client_{i}",))
    t.start()
    threads.append(t)

for t in threads:
    t.join()

Subscriber 클라이언트 코드:

subscriberCluster.py:

import paho.mqtt.client as mqtt

broker = "localhost"
topic = "sensors/temperature"

def on_message(client, userdata, message):
    print(f"Received message: {message.payload.decode()} on topic {message.topic}")

client = mqtt.Client()
client.on_message = on_message
client.connect(broker)
client.subscribe(topic)
client.loop_forever()

실행 방법

  1. Mosquitto 브로커 실행:
    • 위에서 설명한 대로 Mosquitto 브로커를 실행합니다.
  2. Publisher 클라이언트 실행:
    • VS Code 터미널에서 publisher.py를 실행합니다.
      python publisherCluster.py
  3. Subscriber 클라이언트 실행:
    • 새로운 터미널에서 subscriber.py를 실행합니다.
      python subscriberCluster.py

결과

C:\Users\path>"C:\Program Files\mosquitto\mosquitto.exe" -v
1722085370: mosquitto version 2.0.18 starting
1722085370: Using default config.
1722085370: Starting in local only mode. Connections will only be possible from clients running on this machine.
1722085370: Create a configuration file which defines a listener to allow remote access.
1722085370: For more details see https://mosquitto.org/documentation/authentication-methods/
1722085370: Opening ipv4 listen socket on port 1883.
1722085370: Opening ipv6 listen socket on port 1883.
1722085370: mosquitto version 2.0.18 running
1722085380: New connection from ::1:63439 on port 1883.
1722085380: New connection from ::1:63438 on port 1883.
1722085380: New connection from ::1:63442 on port 1883.
1722085380: New connection from ::1:63441 on port 1883.
1722085380: New connection from ::1:63440 on port 1883.
1722085380: New client connected from ::1:63439 as client_4 (p2, c1, k60).
1722085380: No will message specified.
1722085380: Sending CONNACK to client_4 (0, 0)
1722085380: New client connected from ::1:63438 as client_2 (p2, c1, k60).
1722085380: No will message specified.
1722085380: Sending CONNACK to client_2 (0, 0)
1722085380: New client connected from ::1:63442 as client_0 (p2, c1, k60).
1722085380: No will message specified.
1722085380: Sending CONNACK to client_0 (0, 0)
1722085380: New client connected from ::1:63441 as client_3 (p2, c1, k60).
1722085380: No will message specified.
1722085380: Sending CONNACK to client_3 (0, 0)
1722085380: New client connected from ::1:63440 as client_1 (p2, c1, k60).
1722085380: No will message specified.
1722085380: Sending CONNACK to client_1 (0, 0)
1722085380: Received PUBLISH from client_4 (d0, q0, r0, m0, 'sensors/temperature', ... (17 bytes))
1722085380: Received PUBLISH from client_2 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085380: Received PUBLISH from client_0 (d0, q0, r0, m0, 'sensors/temperature', ... (17 bytes))
1722085380: Received PUBLISH from client_3 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085380: Received PUBLISH from client_1 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085384: New connection from ::1:63443 on port 1883.
1722085384: New client connected from ::1:63443 as auto-B05F8ADD-404B-6EDA-DF0A-1A1CE0CAC382 (p2, c1, k60).
1722085384: No will message specified.
1722085384: Sending CONNACK to auto-B05F8ADD-404B-6EDA-DF0A-1A1CE0CAC382 (0, 0)
1722085384: Received SUBSCRIBE from auto-B05F8ADD-404B-6EDA-DF0A-1A1CE0CAC382
1722085384:     sensors/temperature (QoS 0)
1722085384: auto-B05F8ADD-404B-6EDA-DF0A-1A1CE0CAC382 0 sensors/temperature
1722085384: Sending SUBACK to auto-B05F8ADD-404B-6EDA-DF0A-1A1CE0CAC382
1722085385: Received PUBLISH from client_0 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085385: Sending PUBLISH to auto-B05F8ADD-404B-6EDA-DF0A-1A1CE0CAC382 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085385: Received PUBLISH from client_4 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085385: Sending PUBLISH to auto-B05F8ADD-404B-6EDA-DF0A-1A1CE0CAC382 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085385: Received PUBLISH from client_2 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085385: Sending PUBLISH to auto-B05F8ADD-404B-6EDA-DF0A-1A1CE0CAC382 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085385: Received PUBLISH from client_3 (d0, q0, r0, m0, 'sensors/temperature', ... (17 bytes))
1722085385: Sending PUBLISH to auto-B05F8ADD-404B-6EDA-DF0A-1A1CE0CAC382 (d0, q0, r0, m0, 'sensors/temperature', ... (17 bytes))
1722085385: Received PUBLISH from client_1 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085385: Sending PUBLISH to auto-B05F8ADD-404B-6EDA-DF0A-1A1CE0CAC382 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085390: Received PUBLISH from client_1 (d0, q0, r0, m0, 'sensors/temperature', ... (17 bytes))
1722085390: Sending PUBLISH to auto-B05F8ADD-404B-6EDA-DF0A-1A1CE0CAC382 (d0, q0, r0, m0, 'sensors/temperature', ... (17 bytes))
1722085390: Received PUBLISH from client_0 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085390: Sending PUBLISH to auto-B05F8ADD-404B-6EDA-DF0A-1A1CE0CAC382 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085390: Received PUBLISH from client_4 (d0, q0, r0, m0, 'sensors/temperature', ... (17 bytes))
1722085390: Sending PUBLISH to auto-B05F8ADD-404B-6EDA-DF0A-1A1CE0CAC382 (d0, q0, r0, m0, 'sensors/temperature', ... (17 bytes))
1722085390: Received PUBLISH from client_2 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085390: Sending PUBLISH to auto-B05F8ADD-404B-6EDA-DF0A-1A1CE0CAC382 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085390: Received PUBLISH from client_3 (d0, q0, r0, m0, 'sensors/temperature', ... (17 bytes))
1722085390: Sending PUBLISH to auto-B05F8ADD-404B-6EDA-DF0A-1A1CE0CAC382 (d0, q0, r0, m0, 'sensors/temperature', ... (17 bytes))
1722085395: Received PUBLISH from client_1 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085395: Sending PUBLISH to auto-B05F8ADD-404B-6EDA-DF0A-1A1CE0CAC382 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085395: Received PUBLISH from client_0 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085395: Sending PUBLISH to auto-B05F8ADD-404B-6EDA-DF0A-1A1CE0CAC382 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085395: Received PUBLISH from client_4 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085395: Sending PUBLISH to auto-B05F8ADD-404B-6EDA-DF0A-1A1CE0CAC382 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085395: Received PUBLISH from client_2 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085395: Sending PUBLISH to auto-B05F8ADD-404B-6EDA-DF0A-1A1CE0CAC382 (d0, q0, r0, m0, 'sensors/temperature', ... (18 bytes))
1722085395: Received PUBLISH from client_3 (d0, q0, r0, m0, 'sensors/temperature', ... (17 bytes))
1722085395: Sending PUBLISH to auto-B05F8ADD-404B-6EDA-DF0A-1A1CE0CAC382 (d0, q0, r0, m0, 'sensors/temperature', ... (17 bytes))
1722085396: mosquitto version 2.0.18 terminating

마무리 소감

MQTT가 무엇인지, 그리고 기초 및 클라이언트 클러스터 실습을 하며 새로운 IT Tech를 경험할 수 있었다.

IoT 경험이 없었는데, IoT 회사에서 입사를 하게 되어서 IoT Tech를 내가 직접 사용해보지는 못했지만, 이렇게나마 공부할 수 있어 뜻 깊었던 것 같다.

profile
#Software Engineer #IRISH

0개의 댓글