클라이언트 클러스터는 여러 MQTT 클라이언트가 동시에 브로커에 연결되어 메시지를 발행하고 구독하는 환경을 의미합니다. 이를 통해 대규모 IoT 네트워크 시나리오를 시뮬레이션하고, 브로커의 성능 및 안정성을 테스트할 수 있습니다.
우선, Mosquitto 브로커를 실행합니다. 브로커는 클러스터의 중심 역할을 하며, 모든 클라이언트는 브로커와 통신합니다.
"C:\Program Files\mosquitto\mosquitto.exe" -v
각 클라이언트는 데이터를 발행하거나 구독하는 역할을 할 수 있습니다. 여기서는 간단히 여러 클라이언트를 만들어 온도 데이터를 발행하고, 다른 클라이언트가 이를 구독하여 처리하는 예제를 만들어 보겠습니다.
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()
publisher.py를 실행합니다.python publisherCluster.pysubscriber.py를 실행합니다.python subscriberCluster.pyC:\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를 내가 직접 사용해보지는 못했지만, 이렇게나마 공부할 수 있어 뜻 깊었던 것 같다.