๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๐ŸŒฎ ๐Ÿ’ฌ
๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป

[MQTT] pc 2๊ฐœ ํ†ต์‹  (python, ์–‘๋ฐฉํ–ฅ ํ†ต์‹ )

by ๋ฐ”์ฟ„๋ฆฌ 2025. 2. 25.

๊ฐœ์š”

PC 2๊ฐœ๊ฐ€ ์žˆ๋‹ค.

ํ•˜๋‚˜๋Š” User๊ฐ€ ์—…๋ฌด๋ฅผ ์š”์ฒญํ•˜๊ณ , ๋‚˜๋จธ์ง€ ํ•˜๋‚˜๋Š” Robot์ด ๊ทธ ์—…๋ฌด๋ฅผ ๋ฐ›์•„์„œ ์‹ค์‹œ๊ฐ„ ์ƒํƒœ๋ฅผ User๊ฐ€ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์ค„ ๊ฒƒ์ด๋‹ค.

์ „ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Robot์ด ํ•˜๋‚˜ ๋ฟ์ด๋ผ์„œ socket์œผ๋กœ ์—ฐ๊ฒฐ์„ ํ–ˆ๋‹ค.

์ด๋ฒˆ์—๋Š” Robot์ด ์ถ”๊ฐ€๋กœ ๋” ๋Š˜์–ด๋‚  ๊ฐ€๋Šฅ์„ฑ์„ ์—ผ๋‘ํ•ด์„œ MQTT๋ฅผ ํ™œ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

 

ํŽธํžˆ PC, Robot์ด๋ผ๊ณ  ์นญํ•˜๊ฒ ๋‹ค.

  • PC → Robot : ์ˆ˜ํ–‰ํ•  ์ž‘์—… (ํ…์ŠคํŠธ ํ˜•์‹) ์ „๋‹ฌ
  • Robot → PC : ์ž‘์—… ์ƒํƒœ (์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ) ์ „๋‹ฌ

 

๊ตฌ์กฐ

  • PC๋Š” ์ž‘์—…์ง€์‹œ๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ , ๋กœ๋ด‡์€ ์ด๋ฅผ ๊ตฌ๋…
  • ๋กœ๋ด‡์€ ์ƒํƒœ๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ , PC๋Š” ์ด๋ฅผ ๊ตฌ๋…ํ•˜์—ฌ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ƒํƒœ๋ฅผ ํ™•์ธ

Topic ์„ค๊ณ„

  • PC → Robot: "robot/task"
  • Robot → PC: "robot/status"

 

๊ฐ„๋‹จํ•œ ์ฝ”๋“œ ๊ตฌํ˜„

 

1. mqtt ์„ค์น˜ (๋ฒ„์ „ 1.6.1)

pip3 install paho-mqtt==1.6.1

 

PC ์ธก ์ฝ”๋“œ

import paho.mqtt.client as mqtt
import threading
import time

broker_ip = "๋ธŒ๋กœ์ปค_IP"
received_status = []

# ์ƒํƒœ ๋ฉ”์‹œ์ง€ ์ˆ˜์‹  ์ฝœ๋ฐฑ
def on_message(client, userdata, msg):
    status = msg.payload.decode()
    print(f"[๋กœ๋ด‡ ์ƒํƒœ ์—…๋ฐ์ดํŠธ]: {status}")
    received_status.append(status)
    
    if "์ž‘์—… ์™„๋ฃŒ" in status:
        print("๋ชจ๋“  ์ž‘์—… ์™„๋ฃŒ! ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ...")
        client.loop_stop()
        client.disconnect()

# MQTT ํด๋ผ์ด์–ธํŠธ ์„ค์ •
client = mqtt.Client("PC_Client")
client.connect(broker_ip, 1883)

# ๋กœ๋ด‡ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ์ˆ˜์‹  ๊ตฌ๋…
client.subscribe("robot/status")
client.on_message = on_message

# MQTT ์ˆ˜์‹  ๋Œ€๊ธฐ ์‹œ์ž‘
client.loop_start()

# ๋กœ๋ด‡์—๊ฒŒ ์ž‘์—… ์ง€์‹œ ๋ณด๋‚ด๊ธฐ
task_message = "์ž‘์—… ์‹œ์ž‘: ์ฝœ๋ผ ์˜ฎ๊ธฐ๊ธฐ"
print(f"[์ž‘์—… ์ „์†ก]: {task_message}")
client.publish("robot/task", task_message)

# ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์ง€ ์•Š๋„๋ก ๋Œ€๊ธฐ
while client.is_connected():
    time.sleep(1)

 

๋กœ๋ด‡ ์ธก ์ฝ”๋“œ

(1) ์ƒํƒœ ์ „์†ก์šฉ ๋ชจ๋“ˆ (robot_status.py)

import paho.mqtt.client as mqtt

class RobotStatusUpdater:
    def __init__(self, broker_ip, topic="robot/status"):
        self.client = mqtt.Client("Robot_Status_Updater")
        self.client.connect(broker_ip, 1883)
        self.topic = topic

    def send_status(self, message):
        self.client.publish(self.topic, message)
        print(f"[์ƒํƒœ ์ „์†ก๋จ]: {message}")

# ์ „์—ญ์ ์œผ๋กœ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ
status_updater = RobotStatusUpdater("๋ธŒ๋กœ์ปค_IP")

def send_status(message):
    status_updater.send_status(message)

 

(2) ์‹ค์ œ ๋กœ๋ด‡ ์ฝ”๋“œ (robot.py)

  • send_status ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•
import paho.mqtt.client as mqtt
import threading
import time
from robot_status import send_status

broker_ip = "๋ธŒ๋กœ์ปค_IP"

# PC์—์„œ ์ž‘์—… ์ง€์‹œ ๋ฐ›๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜
def on_message(client, userdata, msg):
    task = msg.payload.decode()
    print(f"[๋ฐ›์€ ์ž‘์—… ์ง€์‹œ]: {task}")
    execute_task(task)

# ์‹ค์ œ ๋กœ๋ด‡์˜ ์ž‘์—… ์ˆ˜ํ–‰ ํ•จ์ˆ˜
def execute_task(task):
    # ๊ธฐ์กด ๋กœ๋ด‡ ์ฝ”๋“œ์˜ ์˜ˆ์‹œ (๋‹จ๊ณ„๋ณ„๋กœ ์ƒํƒœ ์ „์†ก ์ถ”๊ฐ€)
    time.sleep(1)
    send_status("์ดˆ๊ธฐํ™” ์™„๋ฃŒ")

    time.sleep(1)
    send_status("๋ชฉํ‘œ ์œ„์น˜ ๋„์ฐฉ ์™„๋ฃŒ")

    time.sleep(1)
    send_status("๋ฌผ์ฒด ํ”ฝ์—… ์„ฑ๊ณต")

    time.sleep(1)
    send_status("๋ชฉํ‘œ ์œ„์น˜ ์ด๋™ ์™„๋ฃŒ")

    time.sleep(1)
    send_status("๋ฌผ์ฒด ๋‚ด๋ ค๋†“๊ธฐ ์™„๋ฃŒ")

    send_status("์ „์ฒด ์ž‘์—… ์™„๋ฃŒ")

# MQTT ํด๋ผ์ด์–ธํŠธ ์„ค์ • (์ž‘์—…์ง€์‹œ ๋ฐ›๊ธฐ์šฉ)
client = mqtt.Client("Robot_Client")
client.connect(broker_ip, 1883)
client.subscribe("robot/task")
client.on_message = on_message

# MQTT ์ˆ˜์‹  ๋ฃจํ”„ ์‹œ์ž‘
threading.Thread(target=client.loop_forever, daemon=True).start()

# ๋กœ๋ด‡์€ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ๋Œ€๊ธฐ ์ค‘...
while True:
    time.sleep(1)

 

+ ๋ฉ”์„ธ์ง€ ๋ธŒ๋กœ์ปค๋Š” PC ์ธก์—์„œ ๋„์–ด์„œ ํ…Œ์ŠคํŠธํ–ˆ๋‹ค. ์•„๋งˆ ๊ณ„์† PC ์ธก์—์„œ ๋„์–ด์„œ ์‚ฌ์šฉํ•  ๋“ฏ ..?

 

์‹ค์ œ ํ…Œ์ŠคํŠธ (๋™์˜์ƒ)

(1) MQTT Explorer : ๋กœ์ปฌ mqtt ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๊ณ 

(2) python3 robot.py : robot์€ ๋Œ€๊ธฐ ์ƒํƒœ์— ๋†“์€ ์ƒํƒœ ์œ ์ง€ํ•˜๊ณ 

(3) python3 pc.py : pc์—์„œ task ์š”์ฒญ ๋“ค์–ด๊ฐ€๋ฉด

(4) robot์—์„œ ๋ฐ›์•„์„œ task ์‹คํ–‰ํ•˜๋ฉฐ ์‹ค์‹œ๊ฐ„ status์„ ๊ณต์œ ํ•œ๋‹ค (pc์ธก์—์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ›์•„์„œ ํ™•์ธ ๊ฐ€๋Šฅ)