MQTT_SCHEMA HUB - zero1ne-26/doc GitHub Wiki
Hub MQTT ์คํค๋ง
์ด ๋ฌธ์๋ Hub ํ์ด ์์ฑํฉ๋๋ค. ๋น์ด์๋ ํญ๋ชฉ์ ์ฑ์์ฃผ์ธ์.
๋ชฉ์ฐจ
- ๊ฐ์
- AI_Neural_TREE ๊ตฌํ ๋ช ์ธ
- Smartfactory ๊ตฌํ ๋ช ์ธ
- DroneCenter ๊ตฌํ ๋ช ์ธ
- HydogenCenter ๊ตฌํ๋ช ์ธ
- AutonomousCenter ๊ตฌํ๋ช ์ธ
- QoS / ๊ธฐํ ์ค์
- ๋น๊ณ
๊ฐ์
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ์ ๊ณต๊ฐ | session_id (์ค์ผ์คํธ๋ ์ด์
์๋ฒ์์ ๋ฐ๊ธ) |
| ์์ฑ ์ฃผ์ฒด | Hub ํ (์ ์นํ ์ฑ ์) |
| ์ต์ข ์์ ์ผ | 2026-09-29 |
AI Neural TREE ๊ตฌํ ๋ช ์ธ
1. ๊ฐ์
AI Neural Tree๋ Physical AI Diorama ์์คํ ์ ์ค์ ํ๋ธ๋ฅผ ์๊ฐ์ ์ผ๋ก ํํํ๋ ์ฅ์น์ด๋ค.
Raspberry Pi์์ MQTT Broker์ ์ฐ๊ฒฐํ์ฌ ์ธ๋ถ Orchestration Server์ ์ ์ด ๋ช ๋ น์ ์์ ํ๊ณ , Arduino๋ฅผ ํตํด AI Neural Tree ์ ์ ๋ฐ ์ํ LED๋ฅผ ์ ์ดํ๋ค.
๋ํ AI Neural Tree์ ์์คํ ์ํ ์ ๋ณด๋ฅผ MQTT๋ฅผ ํตํด ์ธ๋ถ Orchestration Server๋ก ์ฃผ๊ธฐ์ ์ผ๋ก ์ ์กํ๋ค.
2. ์์คํ ๊ตฌ์ฑ
External Orchestration Server
โ
โ MQTT
โผ
Mosquitto Broker
jscouple.site
โ
โผ
Raspberry Pi
ai_neural_tree_control.py
โ
โ USB Serial
โผ
Arduino
โ
โโโโโโผโโโโโ
โ โ โ
โผ โผ โผ
D6 D5 D4
Relay RED GREEN
โ
โผ
AI Neural Tree
3. MQTT Broker
| ํญ๋ชฉ | ๊ฐ |
|---|---|
| Broker | jscouple.site |
| Port | 1883 |
| Protocol | MQTT |
| Authentication | Username / Password |
| QoS | 1 |
4. MQTT Topic
AI Neural Tree์ ๊ธฐ๋ณธ Topic Prefix๋ ๋ค์๊ณผ ๊ฐ๋ค.
diorama/ainueraltree/
Topic ๋ชฉ๋ก
| Topic | ๋ฐฉํฅ | ์ค๋ช |
|---|---|---|
diorama/ainueraltree/led |
Orchestration โ AI Neural Tree | Neural Tree ์ ์ ์ ์ด |
diorama/ainueraltree/status |
AI Neural Tree โ Orchestration | Neural Tree ์ํ์ ๋ณด ์ ์ก |
Mosquitto ACL
topic readwrite diorama/ainueraltree/#
5. Command
Command ๋ชฉ๋ก
| Command | ์ค๋ช |
|---|---|
LED_ON |
AI Neural Tree ์ ์ฒด ์ ์ ON |
LED_OFF |
AI Neural Tree ์ ์ฒด ์ ์ OFF |
5.1 LED_ON
AI Neural Tree ์ ์ฒด ์ ์์ ONํ๊ณ ์ํ ํ์ LED๋ฅผ GREEN์ผ๋ก ๋ณ๊ฒฝํ๋ค.
Topic
diorama/ainueraltree/led
Payload
{
"command": "LED_ON"
}
๋์
AI Neural Tree Power โ ON
D6 Relay โ ON
D5 RED โ OFF
D4 GREEN โ ON
5.2 LED_OFF
AI Neural Tree ์ ์ฒด ์ ์์ OFFํ๊ณ ์ํ ํ์ LED๋ฅผ RED๋ก ๋ณ๊ฒฝํ๋ค.
Topic
diorama/ainueraltree/led
Payload
{
"command": "LED_OFF"
}
๋์
AI Neural Tree Power โ OFF
D6 Relay โ OFF
D5 RED โ ON
D4 GREEN โ OFF
6. Arduino PIN ์ ์
| Arduino PIN | ์ฅ์น | ๊ธฐ๋ฅ |
|---|---|---|
D6 |
Relay | AI Neural Tree ์ ์ฒด ์ ์ |
D5 |
RED LED | ๋๊ธฐ / ์ด๋ฒคํธ ์ข ๋ฃ ์ํ |
D4 |
GREEN LED | ์ด๋ฒคํธ ์คํ ์ํ |
Relay ์ ์ด ๊ธฐ์ค:
HIGH = Tree Power ON
LOW = Tree Power OFF
7. AI Neural Tree ์ํ
| ์ํ | Tree Power | D5 RED | D4 GREEN |
|---|---|---|---|
| ์ด๊ธฐ / ๋๊ธฐ | OFF | ON | OFF |
| ์ด๋ฒคํธ ์คํ | ON | OFF | ON |
| ์ด๋ฒคํธ ์ข ๋ฃ | OFF | ON | OFF |
Raspberry Pi ๋ฐ Arduino๊ฐ ์์๋๋ฉด ๊ธฐ๋ณธ ์ํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
Tree Power : OFF
RED : ON
GREEN : OFF
8. STATUS
AI Neural Tree๋ ํ์ฌ ์ํ๋ฅผ ์ธ๋ถ Orchestration Server๋ก ์ฃผ๊ธฐ์ ์ผ๋ก ์ ์กํ๋ค.
Topic
diorama/ainueraltree/status
์ ์ก ์ค์
| ํญ๋ชฉ | ๊ฐ |
|---|---|
| ์ ์ก ์ฃผ๊ธฐ | 2์ด |
| QoS | 1 |
| Retain | true |
Retain=true๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ Orchestration Server๊ฐ MQTT Broker์ ์๋กญ๊ฒ ์ฐ๊ฒฐ๋๋๋ผ๋ ๋ง์ง๋ง AI Neural Tree ์ํ๋ฅผ ํ์ธํ ์ ์๋ค.
9. STATUS Payload
{
"device": "AI_NEURAL_TREE",
"hub_status": "ONLINE",
"tree_power": "OFF",
"ai_status": "READY",
"connected_devices": 8,
"active_scenario": "NONE",
"current_task": "IDLE",
"processed_commands": 152,
"mqtt_messages": 1284,
"avg_response_time_ms": 82,
"cpu_percent": 34.0,
"memory_percent": 46.0,
"timestamp": "2026-10-01T18:58:31+09:00"
}
10. STATUS ํ๋ ์ ์
| ํ๋ | ํ์ | ์ค๋ช | ๋ฐ์ดํฐ ์์ฑ ๋ฐฉ์ |
|---|---|---|---|
device |
string | ์ฅ์น ์๋ณ์ | ๊ณ ์ |
hub_status |
string | AI Hub ์ํ | ์ค์ ํ๋ก๊ทธ๋จ ์ํ |
tree_power |
string | Neural Tree ์ ์ ์ํ | ์ค์ ์ ์ด ์ํ |
ai_status |
string | AI ์ฒ๋ฆฌ ์ํ | Simulation |
connected_devices |
integer | ์ฐ๊ฒฐ๋ ๋๋ฐ์ด์ค ์ | Simulation |
active_scenario |
string | ํ์ฌ ํ์ฑ ์๋๋ฆฌ์ค | Simulation |
current_task |
string | ํ์ฌ ์ฒ๋ฆฌ Task | Simulation |
processed_commands |
integer | ์ฒ๋ฆฌํ ๋ช ๋ น ๋์ ์ | ์ค์ ์นด์ดํธ |
mqtt_messages |
integer | MQTT ๋ฉ์์ง ๋์ ์ | ์ค์ ์นด์ดํธ |
avg_response_time_ms |
integer | ํ๊ท ์๋ต์๊ฐ(ms) | Simulation |
cpu_percent |
float | Raspberry Pi CPU ์ฌ์ฉ๋ฅ | ์ค์ ์ธก์ |
memory_percent |
float | Raspberry Pi Memory ์ฌ์ฉ๋ฅ | ์ค์ ์ธก์ |
timestamp |
string | ์ํ ์์ฑ ์๊ฐ | ์ค์ ์๊ฐ |
11. Hub Status
| ๊ฐ | ์ค๋ช |
|---|---|
ONLINE |
AI Neural Tree Hub ์ ์ ๋์ |
OFFLINE |
AI Neural Tree Hub ์ฐ๊ฒฐ ์ข ๋ฃ |
12. AI Status
| ๊ฐ | ์ค๋ช |
|---|---|
READY |
๋ช ๋ น ๋๊ธฐ ์ํ |
PROCESSING |
์๋๋ฆฌ์ค ๋๋ Task ์ฒ๋ฆฌ ์ค |
์ด๋ฒคํธ ์์:
READY
โ
โผ
PROCESSING
์ด๋ฒคํธ ์ข ๋ฃ:
PROCESSING
โ
โผ
READY
13. Active Scenario
Simulation ํ๊ฒฝ์์๋ ๋ค์ ์๋๋ฆฌ์ค ๊ฐ์ ์ฌ์ฉํ ์ ์๋ค.
| ๊ฐ | ์ค๋ช |
|---|---|
DRONE_DELIVERY |
๋๋ก ๋ฐฐ์ก ์๋๋ฆฌ์ค |
SMART_FACTORY |
์ค๋งํธํฉํ ๋ฆฌ ์๋๋ฆฌ์ค |
HYDROGEN_CHARGING |
์์ ์ถฉ์ ์๋๋ฆฌ์ค |
AUTONOMOUS_DRIVING |
์์จ์ฃผํ ์๋๋ฆฌ์ค |
NONE |
ํ์ฑ ์๋๋ฆฌ์ค ์์ |
Tree OFF ์ํ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ ๊ฐ์ ์ฌ์ฉํ๋ค.
NONE
14. Current Task
Simulation ํ๊ฒฝ์์๋ ๋ค์ Task ๊ฐ์ ์ฌ์ฉํ ์ ์๋ค.
| ๊ฐ | ์ค๋ช |
|---|---|
ROUTE_PLANNING |
์ด๋ ๊ฒฝ๋ก ์์ฑ |
DATA_ANALYSIS |
๋ฐ์ดํฐ ๋ถ์ |
DEVICE_CONTROL |
Physical Device ์ ์ด |
TASK_PLANNING |
Task ๊ณํ |
IDLE |
๋๊ธฐ |
Tree OFF ์ํ์์๋ ๋ค์ ๊ฐ์ ์ฌ์ฉํ๋ค.
IDLE
15. ์ค์ ๋ฐ์ดํฐ / Simulation Data
ํ์ฌ AI Neural Tree์์๋ ์ค์ ๋ก ์ทจ๋ ๊ฐ๋ฅํ ๋ฐ์ดํฐ์ Simulation Data๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ค.
| ๋ฐ์ดํฐ | ๋ฐฉ์ |
|---|---|
| Hub Status | ์ค์ |
| Tree Power | ์ค์ |
| CPU | ์ค์ |
| Memory | ์ค์ |
| Processed Commands | ์ค์ |
| MQTT Messages | ์ค์ |
| AI Status | Simulation |
| Connected Devices | Simulation |
| Active Scenario | Simulation |
| Current Task | Simulation |
| Average Response Time | Simulation |
16. MQTT ํ ์คํธ
AI Neural Tree ON
mosquitto_pub \
-h jscouple.site \
-p 1883 \
-u oc \
-P 'PASSWORD' \
-t "diorama/ainueraltree/led" \
-m '{"command":"LED_ON"}'
๋์ ๊ฒฐ๊ณผ:
Tree Power โ ON
RED โ OFF
GREEN โ ON
AI Status โ PROCESSING
AI Neural Tree OFF
mosquitto_pub \
-h jscouple.site \
-p 1883 \
-u oc \
-P 'PASSWORD' \
-t "diorama/ainueraltree/led" \
-m '{"command":"LED_OFF"}'
๋์ ๊ฒฐ๊ณผ:
Tree Power โ OFF
RED โ ON
GREEN โ OFF
AI Status โ READY
17. STATUS ์์ ํ์ธ
AI Neural Tree์์ ์ ์กํ๋ STATUS๋ง ํ์ธ:
mosquitto_sub \
-h jscouple.site \
-p 1883 \
-u oc \
-P 'PASSWORD' \
-t "diorama/ainueraltree/status" \
-v
AI Neural Tree์์ ์ฌ์ฉํ๋ ์ ์ฒด MQTT Topic ํ์ธ:
mosquitto_sub \
-h jscouple.site \
-p 1883 \
-u oc \
-P 'PASSWORD' \
-t "diorama/ainueraltree/#" \
-v
18. Raspberry Pi ํ๋ก๊ทธ๋จ
AI Neural Tree ์ ์ด ํ๋ก๊ทธ๋จ:
/home/zer01ne/ai_neural_tree_control.py
์ฃผ์ ๊ธฐ๋ฅ:
MQTT Broker ์ฐ๊ฒฐ
โ
โโโ diorama/ainueraltree/led Subscribe
โ
โโโ LED_ON / LED_OFF ๋ช
๋ น ์ฒ๋ฆฌ
โ
โโโ Arduino Serial ์ ์ด
โ
โโโ Raspberry Pi CPU / Memory ์ธก์
โ
โโโ Simulation Data ์์ฑ
โ
โโโ diorama/ainueraltree/status Publish
19. Raspberry Pi ์๋ ์คํ
AI Neural Tree ์ ์ด ํ๋ก๊ทธ๋จ์ Raspberry Pi ๋ถํ
์ systemd๋ฅผ ํตํด ์๋ ์คํํ๋ค.
Service ์ด๋ฆ
ai-neural-tree.service
Service ํ์ผ
/etc/systemd/system/ai-neural-tree.service
Service ์ค์
[Unit]
Description=AI Neural Tree MQTT Controller
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=zer01ne
WorkingDirectory=/home/zer01ne
ExecStart=/usr/bin/python3 /home/zer01ne/ai_neural_tree_control.py
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
20. Service ๋ฑ๋ก
systemd ์ค์ ๋ฐ์:
sudo systemctl daemon-reload
๋ถํ ์๋ ์คํ ๋ฑ๋ก:
sudo systemctl enable ai-neural-tree.service
์๋น์ค ์์:
sudo systemctl start ai-neural-tree.service
21. Service ๊ด๋ฆฌ
์๋น์ค ์ํ ํ์ธ:
sudo systemctl status ai-neural-tree.service
์๋น์ค ์ฌ์์:
sudo systemctl restart ai-neural-tree.service
์๋น์ค ์ค์ง:
sudo systemctl stop ai-neural-tree.service
์ค์๊ฐ ๋ก๊ทธ ํ์ธ:
journalctl -u ai-neural-tree.service -f
22. ์ ์ฒด ๋์ ํ๋ฆ
Raspberry Pi Power ON
โ
โผ
systemd
โ
โผ
ai-neural-tree.service
โ
โผ
ai_neural_tree_control.py
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
โผ โผ
MQTT Subscribe STATUS ์์ฑ
โ โ
โผ โ
diorama/ainueraltree/led โ
โ โ
โผ โ
LED_ON / LED_OFF โ
โ โ
โผ โ
Arduino Serial โ
โ โ
โผ โ
D6 Relay โ
D5 RED โ
D4 GREEN โ
โ โ
โผ โผ
AI Neural Tree diorama/ainueraltree/status
โ
โผ
External Orchestration Server
23. ์ต์ข MQTT Interface
| ๊ธฐ๋ฅ | Topic | ๋ฐฉํฅ | QoS | Retain |
|---|---|---|---|---|
| Neural Tree ์ ์ ์ ์ด | diorama/ainueraltree/led |
Orchestration โ Tree | 1 | No |
| Neural Tree ์ํ์ ๋ณด | diorama/ainueraltree/status |
Tree โ Orchestration | 1 | Yes |
24. ์ต์ข ๊ตฌ์ฑ
AI Neural Tree๋ ์ธ๋ถ Orchestration Server๋ก๋ถํฐ MQTT ์ ์ด ๋ช ๋ น์ ์์ ํ์ฌ ๋ฌผ๋ฆฌ์ ์ธ Neural Tree ์ ์๊ณผ ์ํ LED๋ฅผ ์ ์ดํ๋ค.
๋์์ Raspberry Pi์ ์ค์ ์์คํ ์ ๋ณด์ Simulation Data๋ฅผ ์กฐํฉํ์ฌ AI Neural Tree์ ํ์ฌ ์ํ๋ฅผ ์ธ๋ถ Orchestration Server๋ก ์ง์์ ์ผ๋ก ์ ์กํ๋ค.
Orchestration
โ
โ LED_ON / LED_OFF
โผ
MQTT Broker
โ
โผ
AI Neural Tree
โ
โโโ Tree Power Control
โโโ RED / GREEN Status
โ
โโโ Status Data
โ
โผ
MQTT Broker
โ
โผ
Orchestration
Smart Factory ๊ตฌํ ๋ช ์ธ
1. ๊ฐ์
Smart Factory ๋์ค๋ผ๋ง๋ Physical AI Orchestration Server๋ก๋ถํฐ MQTT ๋ช ๋ น์ ์์ ํ์ฌ ์์ฐ ์ด๋ฒคํธ๋ฅผ ์คํํ๋ค.
Raspberry Pi๊ฐ Smart Factory์ ์ค์ ์ ์ด Hub ์ญํ ์ ์ํํ๋ฉฐ ๋ค์ ์ฅ์น๋ฅผ ํตํฉ ์ ์ดํ๋ค.
- LED Arduino
- ๋ํ Conveyor Arduino + Relay
- ACEBOTT ESP32
- ์ํ Conveyor
- Robot Arm
์์ฐ ์ด๋ฒคํธ๊ฐ ์์๋๋ฉด ์ด๋ฒคํธ ํ์ LED๊ฐ GREEN์ผ๋ก ๋ณ๊ฒฝ๋๊ณ , ๋ํ Conveyor์ ESP32 ๊ธฐ๋ฐ ์ํ Conveyor ๋ฐ Robot Arm์ด ์์ฐจ์ ์ผ๋ก ๋์ํ๋ค.
Robot Arm ๋์์ด ์๋ฃ๋๋ฉด ๋ชจ๋ ๋ฌผ๋ฆฌ ์ฅ์น๋ฅผ ์ ์งํ ํ LED๋ฅผ RED ์ํ๋ก ๋ณต๊ทํ๋ค.
2. ์์คํ ๊ตฌ์ฑ
Physical AI Orchestration Server
โ
โ MQTT
โผ
Raspberry Pi
Smart Factory Controller
โ
โโโ LED Arduino
โ โโโ RED LED
โ โโโ GREEN LED
โ
โโโ Large Conveyor Arduino
โ โโโ Relay
โ โโโ Large Conveyor
โ
โโโ ACEBOTT ESP32
โโโ Small Conveyor
โโโ Robot Arm
Raspberry Pi์์ ์คํ๋๋ Smart Factory ์ ์ด ํ๋ก๊ทธ๋จ:
/home/zer01ne/smartfactory_control.py
3. MQTT Broker
| ํญ๋ชฉ | ๊ฐ |
|---|---|
| Broker | jscouple.site |
| Port | 1883 |
| Protocol | MQTT |
| QoS | 1 |
| Authentication | ID / Password ์ธ์ฆ |
4. MQTT Topic
| ๊ตฌ๋ถ | Topic | ๋ฐฉํฅ | Retain | ์ค๋ช |
|---|---|---|---|---|
| REQUEST | diorama/smartfactory/request |
Orchestration โ Smart Factory | No | ์ ์ด ๋ช ๋ น ์์ |
| RESPONSE | diorama/smartfactory/response |
Smart Factory โ Orchestration | No | ๋ช ๋ น ์ฒ๋ฆฌ ๊ฒฐ๊ณผ |
| STATUS | diorama/smartfactory/status |
Smart Factory โ Orchestration | Yes | ํ์ฌ ์์คํ ์ํ |
| TELEMETRY | diorama/smartfactory/telemetry |
Smart Factory โ Orchestration | No | Smart Factory ์ด์ ์ ๋ณด |
5. Command
Smart Factory์ ๊ณต์ ์ ์ด Command๋ ๋ค์๊ณผ ๊ฐ๋ค.
| Command | ์ค๋ช |
|---|---|
START_SCENARIO |
์์ฐ ์ด๋ฒคํธ ์์ |
STOP_SCENARIO |
์์ฐ ์ด๋ฒคํธ ์ค์ง |
STATUS_REQUEST |
ํ์ฌ ์์ฐ ๋ฐ ์ฅ์น ์ํ ์์ฒญ |
LED_ON |
Smart Factory ์ด๋ฒคํธ LED GREEN ON |
LED_OFF |
Smart Factory ์ด๋ฒคํธ LED GREEN OFF / RED ON |
LED_ON, LED_OFF ๋ช
๋ น์ Robot Arm ๋ฐ Conveyor๋ฅผ ๋์์ํค์ง ์๊ณ LED๋ง ๋
๋ฆฝ์ ์ผ๋ก ์ ์ดํ๋ค.
6. REQUEST
Topic
diorama/smartfactory/request
Payload
{
"session_id": "SESSION-20261001-0001",
"scenario_id": "SCN-SF-001",
"command": "START_SCENARIO",
"target": "SMART_FACTORY",
"payload": {},
"timestamp": "2026-10-01T17:00:00+09:00"
}
REQUEST ํ๋ ์ ์
| ํ๋ | ํ์ | ํ์ | ์ค๋ช |
|---|---|---|---|
session_id |
string | Y | Orchestration Server์ ์คํ ์ธ์ ์๋ณ์ |
scenario_id |
string | Y | ์คํ ์๋๋ฆฌ์ค ์๋ณ์ |
command |
string | Y | Smart Factory ์ ์ด ๋ช ๋ น |
target |
string | Y | ์ ์ด ๋์. SMART_FACTORY |
payload |
object | Y | Command๋ณ ์ถ๊ฐ ์ ๋ฌ ๋ฐ์ดํฐ |
timestamp |
string | Y | ์์ฒญ ์์ฑ ์๊ฐ. ISO 8601 ํ์ |
scenario_id๋ Orchestration Server์์ ์์ฑํ UUID ๋๋ ์์คํ
์์ ์ ์ํ ๊ณ ์ ์๋๋ฆฌ์ค ID๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์:
SCN-SF-001
๋๋:
550e8400-e29b-41d4-a716-446655440000
7. START_SCENARIO
์์ฐ ์ด๋ฒคํธ ์ ์ฒด๋ฅผ ์คํํ๋ค.
REQUEST
{
"session_id": "SESSION-20261001-0001",
"scenario_id": "SCN-SF-001",
"command": "START_SCENARIO",
"target": "SMART_FACTORY",
"payload": {},
"timestamp": "2026-10-01T17:00:00+09:00"
}
๋์ ์์
START_SCENARIO
โ
โผ
LED GREEN ON
โ
โผ
Large Conveyor ON
โ
โผ
ESP32 START_EVENT
โ
โผ
Small Conveyor ์๋ณต ๋์
โ
โผ
Robot Arm 1์ฐจ ๋์
โ
โผ
Robot Arm 2์ฐจ ๋์
โ
โผ
Robot Arm HOME
โ
โผ
ESP32 EVENT_COMPLETE
โ
โผ
Robot Arm ์์ ํ ๋๊ธฐ
โ
โผ
Large Conveyor OFF
โ
โผ
๋ฌผ๋ฆฌ ์ฅ์น ๋์ ์๋ฃ
โ
โผ
LED GREEN OFF
LED RED ON
โ
โผ
STATUS COMPLETE
โ
โผ
RESPONSE SUCCESS
8. STOP_SCENARIO
์คํ ์ค์ธ Smart Factory ์์ฐ ์ด๋ฒคํธ์ ์ข ๋ฃ๋ฅผ ์์ฒญํ๋ค.
REQUEST
{
"session_id": "SESSION-20261001-0002",
"scenario_id": "SCN-SF-001",
"command": "STOP_SCENARIO",
"target": "SMART_FACTORY",
"payload": {},
"timestamp": "2026-10-01T17:01:00+09:00"
}
๋์
Large Conveyor OFF
ESP32 STOP_EVENT
LED GREEN OFF
LED RED ON
Factory State โ READY
9. STATUS_REQUEST
ํ์ฌ Smart Factory ์ํ๋ฅผ ์์ฒญํ๋ค.
REQUEST
{
"session_id": "SESSION-20261001-0003",
"scenario_id": "SCN-SF-001",
"command": "STATUS_REQUEST",
"target": "SMART_FACTORY",
"payload": {},
"timestamp": "2026-10-01T17:02:00+09:00"
}
์์ฒญ์ ์์ ํ๋ฉด ํ์ฌ ์ํ๋ฅผ STATUS Topic๊ณผ RESPONSE Topic์ผ๋ก ์ ์กํ๋ค.
10. LED_ON
Smart Factory์ ์ด๋ฒคํธ LED๋ง ๋ ๋ฆฝ์ ์ผ๋ก GREEN ์ํ๋ก ๋ณ๊ฒฝํ๋ค.
Robot Arm๊ณผ Conveyor๋ ๋์ํ์ง ์๋๋ค.
REQUEST
{
"session_id": "SESSION-20261001-0004",
"scenario_id": "SCN-SF-LED-001",
"command": "LED_ON",
"target": "SMART_FACTORY",
"payload": {},
"timestamp": "2026-10-01T17:03:00+09:00"
}
๋์
RED LED OFF
GREEN LED ON
11. LED_OFF
Smart Factory ์ด๋ฒคํธ LED๋ฅผ ํ์์ ์ํ๋ก ๋ณต๊ท์ํจ๋ค.
Robot Arm๊ณผ Conveyor์๋ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
REQUEST
{
"session_id": "SESSION-20261001-0005",
"scenario_id": "SCN-SF-LED-001",
"command": "LED_OFF",
"target": "SMART_FACTORY",
"payload": {},
"timestamp": "2026-10-01T17:04:00+09:00"
}
๋์
GREEN LED OFF
RED LED ON
12. RESPONSE
Topic
diorama/smartfactory/response
Smart Factory๋ ๋ช ๋ น ์ํ ๊ฒฐ๊ณผ๋ฅผ RESPONSE Topic์ผ๋ก ์ ์กํ๋ค.
SUCCESS ์์
{
"session_id": "SESSION-20261001-0001",
"scenario_id": "SCN-SF-001",
"command": "START_SCENARIO",
"target": "SMART_FACTORY",
"result": "SUCCESS",
"message": "SMART FACTORY EVENT COMPLETE",
"payload": {
"factory": "READY",
"event_running": false,
"event_step": "COMPLETE",
"event_progress": 100,
"led": "RED",
"large_conveyor": "STOPPED",
"small_conveyor": "STOPPED",
"robot_arm": "IDLE",
"robot_run_count": 2
},
"timestamp": "2026-10-01T17:05:00+09:00"
}
RESPONSE ํ๋ ์ ์
| ํ๋ | ํ์ | ์ค๋ช |
|---|---|---|
session_id |
string | REQUEST์ Session ID |
scenario_id |
string | REQUEST์ Scenario ID |
command |
string | ์ํํ Command |
target |
string | SMART_FACTORY |
result |
string | ๋ช
๋ น ์ฒ๋ฆฌ ๊ฒฐ๊ณผ SUCCESS / FAIL |
message |
string | ๋ช ๋ น ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ๋ฉ์์ง |
payload |
object | ๋ช ๋ น ์ฒ๋ฆฌ ํ Smart Factory ์ํ |
timestamp |
string | ์๋ต ์์ฑ ์๊ฐ |
13. STATUS
Topic
diorama/smartfactory/status
STATUS๋ Smart Factory์ ํ์ฌ ์ ์ด ์ํ์ ์ฅ์น ์ฐ๊ฒฐ ์ํ๋ฅผ ์ ๋ฌํ๋ค.
STATUS ๋ฉ์์ง๋ Retained Message๋ก ๋ฐํํ๋ฉฐ ๊ธฐ๋ณธ ๋ฐํ ์ฃผ๊ธฐ๋ 10์ด์ด๋ค. ์ฃผ์ ์ํ ๋ณ๊ฒฝ ์์๋ ๋ฐํํ๋ค.
STATUS ์์
{
"target": "SMART_FACTORY",
"connection": "ONLINE",
"factory": "OPERATING",
"event_running": true,
"event_step": "ROBOT_ARM_RUN_1",
"event_progress": 40,
"led": {
"state": "GREEN",
"connection": "ONLINE"
},
"large_conveyor": {
"state": "RUNNING",
"connection": "ONLINE"
},
"small_conveyor": {
"state": "RUNNING"
},
"robot_arm": {
"state": "RUN_1",
"run_count": 0
},
"esp32": {
"connection": "ONLINE"
},
"production_completed": 18,
"last_error": "",
"timestamp": "2026-10-01T17:00:10+09:00"
}
STATUS ์ฃผ์ ํ๋
| ํ๋ | ๊ฐ ์์ | ์ค๋ช |
|---|---|---|
connection |
ONLINE |
Smart Factory Hub ์ํ |
factory |
READY, OPERATING, ERROR |
๊ณต์ฅ ์ ์ด ์ํ |
event_running |
true, false |
์ด๋ฒคํธ ์คํ ์ฌ๋ถ |
event_step |
READY, ROBOT_ARM_RUN_1, COMPLETE |
ํ์ฌ ์ด๋ฒคํธ ๋จ๊ณ |
event_progress |
0~100 |
์ด๋ฒคํธ ์งํ๋ฅ |
led.state |
RED, GREEN |
์ด๋ฒคํธ LED ์ํ |
large_conveyor.state |
RUNNING, STOPPED |
๋ํ Conveyor ์ํ |
small_conveyor.state |
RUNNING, STOPPED |
์ํ Conveyor ์ํ |
robot_arm.state |
IDLE, RUN_1, RUN_2, RETURN_HOME |
Robot Arm ์ํ |
robot_arm.run_count |
0~2 |
Robot Arm ์๋ฃ ํ์ |
last_error |
string | ๋ง์ง๋ง ์ค๋ฅ ์ ๋ณด |
14. TELEMETRY
Topic
diorama/smartfactory/telemetry
Smart Factory์ ์์ฐ ๋ฐ ์ด์ ์ ๋ณด๋ฅผ Orchestration Server๋ก ์ ์กํ๋ค.
๊ธฐ๋ณธ ์ ์ก ์ฃผ๊ธฐ๋ 3์ด์ด๋ค.
TELEMETRY ์์
{
"target": "SMART_FACTORY",
"factory": {
"status": "RUNNING"
},
"production": {
"progress_percent": 72,
"completed": 18,
"target": 25
},
"robot_arm": {
"status": "ASSEMBLING"
},
"conveyor": {
"status": "RUNNING",
"speed_percent": 65
},
"quality": {
"result": "PASS",
"defect_rate_percent": 1.2
},
"energy": {
"power_kw": 2.4
},
"environment": {
"temperature_c": 25.3
},
"devices": {
"led_arduino": "ONLINE",
"large_conveyor": "ONLINE",
"acebott_esp32": "ONLINE"
},
"event": {
"running": true,
"step": "ROBOT_ARM_RUN_1",
"progress": 40
},
"timestamp": "2026-10-01T17:00:12+09:00"
}
15. Smart Factory ์ก์ ๋ฐ์ดํฐ
| ๊ตฌ๋ถ | ๋ฐ์ดํฐ | ์์ | ์ค๋ช |
|---|---|---|---|
| ๊ณต์ฅ | ๊ฐ๋ ์ํ | RUNNING |
Smart Factory ๊ฐ๋ ์ํ |
| ์์ฐ | ์์ฐ ์งํ๋ฅ | 72 % |
์์ฐ ์ด๋ฒคํธ ์งํ ์ ๋ณด |
| ์์ฐ | ์์ฐ ์๋ | 18 / 25 |
์๋ฃ ์๋ / ๋ชฉํ ์๋ |
| Robot Arm | ์ํ | ASSEMBLING |
Robot Arm ์์ ์ํ |
| Conveyor | ์ํ | RUNNING |
Conveyor ๋์ ์ํ |
| Conveyor | ์๋ | 65 % |
Conveyor ์ด์ ์๋ |
| ํ์ง | ๊ฒ์ฌ ๊ฒฐ๊ณผ | PASS |
ํ์ง๊ฒ์ฌ ๊ฒฐ๊ณผ |
| ํ์ง | ๋ถ๋๋ฅ | 1.2 % |
์์ฐ ํ์ง ์ด์ ์ ๋ณด |
| ์๋์ง | ์ ๋ ฅ ์ฌ์ฉ๋ | 2.4 kW |
๊ณต์ฅ ์ ๋ ฅ ์ฌ์ฉ ์ ๋ณด |
| ํ๊ฒฝ | ๊ณต์ฅ ์จ๋ | 25.3 ยฐC |
๊ณต์ฅ ํ๊ฒฝ ์จ๋ |
| ์ฅ์น | LED Arduino | ONLINE |
LED Controller ์ฐ๊ฒฐ ์ํ |
| ์ฅ์น | Large Conveyor | ONLINE |
๋ํ Conveyor Controller ์ฐ๊ฒฐ ์ํ |
| ์ฅ์น | ACEBOTT ESP32 | ONLINE |
Robot Arm Controller ์ฐ๊ฒฐ ์ํ |
| ์ด๋ฒคํธ | ์คํ ์ํ | true |
ํ์ฌ ์ด๋ฒคํธ ์คํ ์ฌ๋ถ |
| ์ด๋ฒคํธ | ์ด๋ฒคํธ ๋จ๊ณ | ROBOT_ARM_RUN_1 |
ํ์ฌ ์๋๋ฆฌ์ค ์คํ ๋จ๊ณ |
| ์ด๋ฒคํธ | ์งํ๋ฅ | 40 |
ํ์ฌ ์๋๋ฆฌ์ค ์งํ๋ฅ |
16. EVENT STEP
| Event Step | Progress | ์ค๋ช |
|---|---|---|
READY |
0 | ์ด๋ฒคํธ ๋๊ธฐ |
EVENT_START |
5 | ์ด๋ฒคํธ ์์ |
LED_GREEN |
10 | GREEN LED ํ์ฑํ |
LARGE_CONVEYOR_RUNNING |
15 | ๋ํ Conveyor ๋์ |
ESP32_COMMAND_RECEIVED |
22 | ESP32 ์ด๋ฒคํธ ๋ช ๋ น ์์ |
ESP32_EVENT_RUNNING |
25 | ESP32 ์ด๋ฒคํธ ์์ |
SMALL_CONVEYOR_RUNNING |
30 | ์ํ Conveyor ๋์ |
ROBOT_ARM_RUN_1 |
40 | Robot Arm 1์ฐจ ์์ |
ROBOT_RUN_1_COMPLETE |
55 | Robot Arm 1์ฐจ ์์ ์๋ฃ |
ROBOT_ARM_RUN_2 |
65 | Robot Arm 2์ฐจ ์์ |
ROBOT_RUN_2_COMPLETE |
85 | Robot Arm 2์ฐจ ์์ ์๋ฃ |
FINAL_HOME |
90 | Robot Arm ์์์น ๋ณต๊ท |
ESP32_COMPLETE |
95 | ESP32 ์ด๋ฒคํธ ์๋ฃ |
ROBOT_COMPLETE_WAIT |
96 | Robot Arm ์์ ํ |
LARGE_CONVEYOR_STOPPED |
98 | ๋ํ Conveyor ์ข ๋ฃ |
COMPLETE |
100 | ์ ์ฒด ์์ฐ ์ด๋ฒคํธ ์๋ฃ |
ERROR |
- | ์ด๋ฒคํธ ์ค๋ฅ |
17. Raspberry Pi - Arduino / ESP32 ์ฐ๊ฒฐ
Smart Factory๋ USB Serial ์ฐ๊ฒฐ์ ์ฌ์ฉํ๋ค.
์ฅ์น ๋ฒํธ๊ฐ ์ฌ๋ถํ
์ ๋ณ๊ฒฝ๋๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด /dev/ttyUSB0 ๋ฐฉ์ ๋์ /dev/serial/by-path/ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ค.
| ์ฅ์น | ๋ฌผ๋ฆฌ USB | Serial ์ค์ |
|---|---|---|
| ACEBOTT ESP32 | USB 1.1 | 115200 bps |
| LED Arduino | USB 1.2 | 9600 bps |
| Large Conveyor Arduino | USB 1.3 | 9600 bps |
ACEBOTT ESP32
/dev/serial/by-path/platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.1:1.0-port0
LED Arduino
/dev/serial/by-path/platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.2:1.0
Large Conveyor Arduino
/dev/serial/by-path/platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.3:1.0-port0
18. LED ๋์
| ์ํ | RED | GREEN |
|---|---|---|
| ํ์์ | ON | OFF |
| ์ด๋ฒคํธ ์คํ | OFF | ON |
| ์ด๋ฒคํธ ์๋ฃ | ON | OFF |
Arduino Pin:
D6 = RED
D7 = GREEN
19. ESP32 ์ ์ด Command
Raspberry Pi์ ACEBOTT ESP32 ์ฌ์ด์์๋ USB Serial Command๋ฅผ ์ฌ์ฉํ๋ค.
| Command | ์ค๋ช |
|---|---|
START_EVENT |
Smart Factory Robot/Conveyor ์ด๋ฒคํธ ์์ |
STOP_EVENT |
์ด๋ฒคํธ ์ข ๋ฃ ์์ฒญ |
STATUS |
ESP32 ์ํ ์์ฒญ |
PING |
ESP32 ํต์ ํ์ธ |
ESP32๋ ์ ์ฒด ์์ฐ ๋์ ์๋ฃ ํ ๋ค์ ๋ฉ์์ง๋ฅผ Raspberry Pi๋ก ์ ์กํ๋ค.
EVENT_COMPLETE
Raspberry Pi๋ EVENT_COMPLETE๋ฅผ ์์ ํ ํ Robot Arm์ ์ต์ข
๋์ ์์ ํ ์๊ฐ์ ํ๋ณดํ๊ณ ๋ํ Conveyor์ LED๋ฅผ ์์ฐจ์ ์ผ๋ก ์ข
๋ฃํ๋ค.
20. ์๋ ์คํ
Smart Factory Controller๋ Raspberry Pi ๋ถํ ์ systemd๋ฅผ ํตํด ์๋ ์คํํ๋ค.
Service:
smartfactory.service
์คํ ํ๋ก๊ทธ๋จ:
/home/zer01ne/smartfactory_control.py
์ํ ํ์ธ:
systemctl status smartfactory.service
์ค์๊ฐ ๋ก๊ทธ:
journalctl -u smartfactory.service -f
์ฌ์์:
sudo systemctl restart smartfactory.service
21. MQTT ํ ์คํธ
์ ์ฒด Topic ํ์ธ
mosquitto_sub \
-h jscouple.site \
-p 1883 \
-u oc \
-P '1234' \
-t 'diorama/smartfactory/#' \
-q 1 \
-v
์์ฐ ์ด๋ฒคํธ ์์
mosquitto_pub \
-h jscouple.site \
-p 1883 \
-u oc \
-P '1234' \
-t 'diorama/smartfactory/request' \
-q 1 \
-m '{"session_id":"TEST-001","scenario_id":"SCN-SF-001","command":"START_SCENARIO","target":"SMART_FACTORY","payload":{}}'
์์ฐ ์ด๋ฒคํธ ์ค์ง
mosquitto_pub \
-h jscouple.site \
-p 1883 \
-u oc \
-P '1234' \
-t 'diorama/smartfactory/request' \
-q 1 \
-m '{"session_id":"TEST-002","scenario_id":"SCN-SF-001","command":"STOP_SCENARIO","target":"SMART_FACTORY","payload":{}}'
์ํ ์์ฒญ
mosquitto_pub \
-h jscouple.site \
-p 1883 \
-u oc \
-P '1234' \
-t 'diorama/smartfactory/request' \
-q 1 \
-m '{"session_id":"TEST-003","scenario_id":"SCN-SF-001","command":"STATUS_REQUEST","target":"SMART_FACTORY","payload":{}}'
LED GREEN ON
mosquitto_pub \
-h jscouple.site \
-p 1883 \
-u oc \
-P '1234' \
-t 'diorama/smartfactory/request' \
-q 1 \
-m '{"session_id":"TEST-004","scenario_id":"SCN-SF-LED","command":"LED_ON","target":"SMART_FACTORY","payload":{}}'
LED RED ๋ณต๊ท
mosquitto_pub \
-h jscouple.site \
-p 1883 \
-u oc \
-P '1234' \
-t 'diorama/smartfactory/request' \
-q 1 \
-m '{"session_id":"TEST-005","scenario_id":"SCN-SF-LED","command":"LED_OFF","target":"SMART_FACTORY","payload":{}}'
22. ์ต์ข ์ธํฐํ์ด์ค ์์ฝ
Command
START_SCENARIO
STOP_SCENARIO
STATUS_REQUEST
LED_ON
LED_OFF
Topic
diorama/smartfactory/request
diorama/smartfactory/response
diorama/smartfactory/status
diorama/smartfactory/telemetry
MQTT ํต์ ๊ตฌ์กฐ
Physical AI Orchestration
โ
โ REQUEST
โผ
diorama/smartfactory/request
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ SMART FACTORY HUB โ
โ Raspberry Pi โ
โ โ
โ START_SCENARIO โ
โ STOP_SCENARIO โ
โ STATUS_REQUEST โ
โ LED_ON โ
โ LED_OFF โ
โโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโผโโโโโโโโโ
โ โ โ
โผ โผ โผ
LED Large ESP32
Arduino Conveyor โ
โโโ Small Conveyor
โโโ Robot Arm
โ
โผ
RESPONSE / STATUS
TELEMETRY
Smart Factory๋ Orchestration Server์ MQTT ๋ช ๋ น์ ๊ธฐ์ค์ผ๋ก Raspberry Pi๊ฐ LED Arduino, Large Conveyor Arduino ๋ฐ ACEBOTT ESP32๋ฅผ ํตํฉ ์ ์ดํ๋ค.
์์ฐ ์ด๋ฒคํธ์ ์คํ ๊ฒฐ๊ณผ๋ RESPONSE, ํ์ฌ ์์คํ
์ํ๋ STATUS, ์์ฐ ๋ฐ ์ด์ ์ ๋ณด๋ TELEMETRY Topic์ ํตํด Orchestration Server๋ก ์ ๋ฌํ๋ค.
Drone Center ๊ตฌํ ๋ช ์ธ
1. ๊ฐ์
Drone Station์ Physical AI Diorama์ ๋๋ก ๋ฐฐ์ก ์์ญ์ ๋ด๋นํ๋ค.
Raspberry Pi๋ฅผ ์ค์ฌ์ผ๋ก CoDrone Mini 1๋์ Arduino UNO๋ฅผ ์ฐ๋ํ๋ฉฐ, MQTT๋ฅผ ํตํด Orchestration Server์ ์๋ฐฉํฅ์ผ๋ก ํต์ ํ๋ค.
Orchestration Server
โ
โ MQTT REQUEST
โผ
Raspberry Pi
โ
โโโ CoDrone Mini
โ
โโโ Arduino UNO
โโโ D6 RED LED
โโโ D7 GREEN LED
โ
โ MQTT STATUS / RESPONSE
โผ
Orchestration Server
2. ์์คํ ๊ตฌ์ฑ
| ๊ตฌ์ฑ์์ | ์ญํ |
|---|---|
| Raspberry Pi | Drone Station ๋ฉ์ธ ์ ์ด |
| CoDrone Mini | ์ค์ ๋๋ก ๋นํ |
| Arduino UNO | EVENT LED ์ ์ด |
| 3.5" LCD | Drone Station GUI |
| MQTT Broker | Orchestration Server ์ฐ๋ |
GUI ํด์๋:
480 ร 320
Drone Control Python ํ์ผ:
/home/zer01ne/drone_control.py
3. MQTT Broker
Host : jscouple.site
Port : 1883
Username : oc
Password : 1234
Python MQTT Library:
paho-mqtt
4. MQTT Topic
Drone Station Prefix:
diorama/dronestation/
| ๊ตฌ๋ถ | Topic | ๋ฐฉํฅ |
|---|---|---|
| REQUEST | diorama/dronestation/request |
Orchestration โ Drone Station |
| RESPONSE | diorama/dronestation/response |
Drone Station โ Orchestration |
| STATUS | diorama/dronestation/status |
Drone Station โ Orchestration |
5. REQUEST
Topic
diorama/dronestation/request
Orchestration Server์์ Drone Station EVENT ์คํ ๋ช ๋ น์ ์ ๋ฌํ๋ค.
START_SCENARIO
{
"session_id": "SESSION-20261001-0001",
"scenario_id": "SCN-DRONE-001",
"command": "START_SCENARIO",
"target": "DRONE",
"payload": {
"from": "P1",
"to": "P2",
"delivery_type": "MEDICINE"
},
"timestamp": "2026-10-01T19:46:00+09:00"
}
6. REQUEST ํ๋ ์ ์
| ํ๋ | ํ์ | ํ์ | ์ค๋ช |
|---|---|---|---|
session_id |
string | Y | Orchestration Session ID |
scenario_id |
string | Y | Scenario ์๋ณ ID |
command |
string | Y | ์คํ ๋ช ๋ น |
target |
string | Y | ์ ์ด ๋์ |
payload |
object | Y | EVENT ์คํ ๋ฐ์ดํฐ |
timestamp |
string | Y | ์์ฒญ ์์ฑ ์๊ฐ |
Payload ํ๋
| ํ๋ | ํ์ | ์ค๋ช |
|---|---|---|
from |
string | ์ถ๋ฐ ์์น |
to |
string | ๋์ฐฉ ์์น |
delivery_type |
string | ๋ฐฐ์ก ์ข ๋ฅ |
๋ฐฐ์ก ์ข ๋ฅ:
MEDICINE
GROCERY
๊ธฐ๋ณธ ์ด๋ ๊ตฌ๊ฐ:
P1 โ P2
7. Command
| Command | ์ค๋ช |
|---|---|
START_SCENARIO |
Drone ๋ฐฐ์ก EVENT ์คํ |
Target:
DRONE
8. EVENT ์๋๋ฆฌ์ค
START_SCENARIO๋ฅผ ์์ ํ๋ฉด ๋ค์ ์์๋ก EVENT๋ฅผ ์คํํ๋ค.
START_SCENARIO
โ
โผ
REQUEST ๊ฒ์ฆ
โ
โผ
RESPONSE = ACCEPTED
โ
โผ
Station = OPERATING
Progress = 10%
โ
โผ
Arduino EVENT_ON
โ
โโโ D6 RED OFF
โโโ D7 GREEN ON
โ
โผ
CoDrone TAKE OFF
โ
โผ
์ ๊ณ ๋ ๋ณด์
โ
โผ
HOVER 2 SEC
โ
โโโ Drone = FLYING
โโโ Progress = 65%
โ
โผ
LANDING
โ
โโโ Progress = 90%
โ
โผ
LAND
โ
โผ
Arduino EVENT_OFF
โ
โโโ D6 RED ON
โโโ D7 GREEN OFF
โ
โผ
EVENT COMPLETE
โ
โโโ Station = READY
โโโ Drone = DOCKED
โโโ Progress = 100%
โโโ Complete = TRUE
โ
โผ
RESPONSE = COMPLETE
9. EVENT ์ํ
| ์ํ | ์ค๋ช |
|---|---|
READY |
EVENT ๋๊ธฐ |
TAKEOFF |
๋๋ก ์ด๋ฅ |
HOVER |
Hover ์ํ |
LANDING |
์ฐฉ๋ฅ ์งํ |
COMPLETE |
EVENT ์๋ฃ |
10. Station ์ํ
| ์ํ | ์ค๋ช |
|---|---|
READY |
EVENT ๋๊ธฐ |
OPERATING |
EVENT ์คํ ์ค |
์ํ ๋ณํ:
EVENT ๋๊ธฐ
READY
โ
EVENT ์คํ
OPERATING
โ
EVENT ์๋ฃ
READY
11. Drone ์ํ
ํ์ฌ Drone Station์ ์ค์ CoDrone Mini 1๋๋ฅผ ์ฌ์ฉํ๋ค.
๋ฐ๋ผ์ Drone 1, Drone 2๋ก ๊ตฌ๋ถํ์ง ์๊ณ drone ํ๋๋ง ์ฌ์ฉํ๋ค.
| ์ํ | ์ค๋ช |
|---|---|
OFFLINE |
Drone ์ฐ๊ฒฐ ์ ๋จ |
DOCKED |
Drone ์ฐ๊ฒฐ ๋ฐ ๋๊ธฐ |
FLYING |
Drone ๋นํ ์ค |
12. STATUS
Topic
diorama/dronestation/status
์ ์ก ์ฃผ๊ธฐ:
2 SEC
STATUS๋ MQTT Retained Message๋ก ์ ์กํ๋ค.
STATUS Payload
{
"device": "DRONESTATION",
"timestamp": "2026-10-01T19:46:00+09:00",
"station": {
"status": "OPERATING"
},
"drone": {
"status": "FLYING",
"battery_percent": 81,
"altitude_m": 0.23,
"speed_mps": 0.08
},
"delivery": {
"type": "MEDICINE",
"progress_percent": 65,
"from": "P1",
"to": "P2",
"complete": false
}
}
13. STATUS ํ๋ ์ ์
Root
| ํ๋ | ํ์ | ์ค๋ช |
|---|---|---|
device |
string | Device ๊ตฌ๋ถ |
timestamp |
string | ๋ฐ์ดํฐ ์์ฑ ์๊ฐ |
station |
object | Drone Station ์ํ |
drone |
object | Drone ์ํ |
delivery |
object | ๋ฐฐ์ก EVENT ์ํ |
Station
| ํ๋ | ํ์ | ๊ฐ |
|---|---|---|
status |
string | READY / OPERATING |
Drone
| ํ๋ | ํ์ | ์ค๋ช |
|---|---|---|
status |
string | OFFLINE / DOCKED / FLYING |
battery_percent |
number | ๋ฐฐํฐ๋ฆฌ ์๋ |
altitude_m |
number | ํ์ฌ ๊ณ ๋ |
speed_mps |
number | ํ์ฌ ์๋ |
Delivery
| ํ๋ | ํ์ | ์ค๋ช |
|---|---|---|
type |
string | MEDICINE / GROCERY |
progress_percent |
integer | ๋ฐฐ์ก ์งํ๋ฅ |
from |
string | ์ถ๋ฐ ์์น |
to |
string | ๋์ฐฉ ์์น |
complete |
boolean | ๋ฐฐ์ก ์๋ฃ ์ฌ๋ถ |
14. ์ค์ผ์คํธ๋ ์ด์ ํ๋ฉด ๋ฐ์ดํฐ
| ํ์ ํญ๋ชฉ | MQTT ํ๋ | ๊ฐ |
|---|---|---|
| ์คํ ์ด์ ์ํ | station.status |
READY / OPERATING |
| Drone ์ํ | drone.status |
OFFLINE / DOCKED / FLYING |
| ๋ฐฐ์ก ์ข ๋ฅ | delivery.type |
MEDICINE / GROCERY |
| ๋ฐฐ์ก ์งํ๋ฅ | delivery.progress_percent |
0 ~ 100% |
| ๋ฐฐํฐ๋ฆฌ | drone.battery_percent |
% |
| ๊ณ ๋ | drone.altitude_m |
m |
| ์๋ | drone.speed_mps |
m/s |
| ํ์ฌ ์์น/๊ตฌ๊ฐ | delivery.from โ delivery.to |
P1 โ P2 |
| ๋ฐฐ์ก ์๋ฃ ์ฌ๋ถ | delivery.complete |
TRUE / FALSE |
15. EVENT ์งํ๋ฅ
| EVENT ์ํ | ์งํ๋ฅ |
|---|---|
| READY | 0% |
| START | 10% |
| HOVER | 65% |
| LANDING | 90% |
| COMPLETE | 100% |
์๋ฃ ์ํ:
{
"progress_percent": 100,
"complete": true
}
16. ์ค์ ๋ฐ์ดํฐ์ ํ ์คํธ ๋ฐ์ดํฐ
์ค์ ์ํ ๋ฐ์ดํฐ
๋ค์ ์ ๋ณด๋ ์ค์ ํ๋ก๊ทธ๋จ ๋ฐ ์ฅ์น์ ์ํ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ค.
Station ์ํ
Drone ์ฐ๊ฒฐ ์ํ
Drone ๋นํ ์ํ
EVENT ์ํ
Arduino LED ์ ์ด ์ํ
MQTT ์ฐ๊ฒฐ ์ํ
ํ ์คํธ ๋ฐ์ดํฐ
ํ์ฌ CoDrone์์ ์ง์ ์ทจ๋ํ์ง ์๋ ๋ค์ ๊ฐ์ ์ ์ ๋ฐ ํตํฉ ํ ์คํธ์ฉ์ผ๋ก ๋์ ์ผ๋ก ์์ฑํ๋ค.
Battery
Altitude
Speed
EVENT ๋๊ธฐ ์ํ:
Altitude = 0.0 m
Speed = 0.0 m/s
๋นํ ์ค์๋ EVENT ์ํ์ ๋ง์ถฐ ํ ์คํธ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ค.
17. Arduino LED
Arduino UNO PIN ๊ตฌ์ฑ:
| PIN | LED | ์ญํ |
|---|---|---|
| D6 | RED | READY |
| D7 | GREEN | EVENT |
์ ์ ๋๊ธฐ:
D6 RED ON
D7 GREEN OFF
EVENT ์คํ:
D6 RED OFF
D7 GREEN ON
EVENT ์๋ฃ:
D6 RED ON
D7 GREEN OFF
18. Arduino Serial Command
READY
READY
๊ฒฐ๊ณผ:
RED ON
GREEN OFF
EVENT_ON
EVENT_ON
๊ฒฐ๊ณผ:
RED OFF
GREEN ON
EVENT_OFF
EVENT_OFF
๊ฒฐ๊ณผ:
RED ON
GREEN OFF
Serial ํต์ ์๋:
115200
Arduino UNO ์๋ ๊ฒ์ ๊ธฐ์ค:
VID:PID = 2341:0043
19. RESPONSE
Topic
diorama/dronestation/response
REQUEST ์ฒ๋ฆฌ ๊ฒฐ๊ณผ์ EVENT ๊ฒฐ๊ณผ๋ฅผ Orchestration Server๋ก ์ ๋ฌํ๋ค.
REQUEST ์ ์ ์ ์
{
"device": "DRONESTATION",
"session_id": "SESSION-20261001-0001",
"scenario_id": "SCN-DRONE-001",
"result": "ACCEPTED",
"event_state": "READY",
"message": "START_SCENARIO accepted",
"timestamp": "2026-10-01T19:46:00+09:00"
}
RESPONSE Result
| Result | ์ค๋ช |
|---|---|
ACCEPTED |
EVENT ์คํ ์์ฒญ ์ ์ ์ ์ |
BUSY |
๊ธฐ์กด EVENT ์คํ ์ค |
REJECTED |
๋ช ๋ น ๋๋ ์คํ ์กฐ๊ฑด ์ค๋ฅ |
ERROR |
REQUEST ์ฒ๋ฆฌ ์ค๋ฅ |
STARTED |
EVENT ์์ |
COMPLETE |
EVENT ์๋ฃ |
20. MQTT EVENT ํ ์คํธ
ํฐ๋ฏธ๋์์ Drone EVENT ์คํ:
mosquitto_pub \
-h jscouple.site \
-p 1883 \
-u oc \
-P '1234' \
-t 'diorama/dronestation/request' \
-m '{"session_id":"SESSION-TEST-001","scenario_id":"SCN-DRONE-001","command":"START_SCENARIO","target":"DRONE","payload":{"from":"P1","to":"P2","delivery_type":"MEDICINE"},"timestamp":"2026-10-01T19:46:00+09:00"}'
21. STATUS ํ์ธ
mosquitto_sub \
-h jscouple.site \
-p 1883 \
-u oc \
-P '1234' \
-t 'diorama/dronestation/status' \
-v
22. RESPONSE ํ์ธ
mosquitto_sub \
-h jscouple.site \
-p 1883 \
-u oc \
-P '1234' \
-t 'diorama/dronestation/response' \
-v
23. Python ์คํ
์์ค ์์น:
/home/zer01ne/drone_control.py
์ผ๋ฐ ์คํ:
python3 /home/zer01ne/drone_control.py
SSH์์ Raspberry Pi LCD๋ก ์คํ:
DISPLAY=:0 python3 /home/zer01ne/drone_control.py
24. ๋ถํ ์๋ ์คํ
Drone Station์ Raspberry Pi ๋ถํ
์ drone_control.py๊ฐ ์๋ ์คํ๋๋๋ก systemd Service๋ฅผ ์ฌ์ฉํ๋ค.
Service ์ด๋ฆ:
drone-control.service
Service ํ์ผ:
/etc/systemd/system/drone-control.service
25. systemd Service ์์ฑ
sudo nano /etc/systemd/system/drone-control.service
๋ค์ ๋ด์ฉ์ ์ ๋ ฅํ๋ค.
[Unit]
Description=Physical AI Drone Station Control
After=graphical.target network-online.target
Wants=network-online.target
[Service]
Type=simple
User=zer01ne
WorkingDirectory=/home/zer01ne
Environment=DISPLAY=:0
Environment=XAUTHORITY=/home/zer01ne/.Xauthority
Environment=PYTHONUNBUFFERED=1
ExecStartPre=/bin/sleep 10
ExecStart=/usr/bin/python3 /home/zer01ne/drone_control.py
Restart=on-failure
RestartSec=5
[Install]
WantedBy=graphical.target
26. Service ๋ฑ๋ก
systemd ์ค์ ๋ค์ ์ฝ๊ธฐ:
sudo systemctl daemon-reload
๋ถํ ์๋ ์คํ ํ์ฑํ:
sudo systemctl enable drone-control.service
Service ์์:
sudo systemctl start drone-control.service
27. Service ์ํ ํ์ธ
sudo systemctl status drone-control.service
์ ์ ์คํ ์ํ:
Active: active (running)
28. Service ๋ก๊ทธ ํ์ธ
์ต๊ทผ ๋ก๊ทธ:
journalctl -u drone-control.service -n 50
์ค์๊ฐ ๋ก๊ทธ:
journalctl -u drone-control.service -f
์ ์ MQTT ์ฐ๊ฒฐ ์:
[MQTT] CONNECTED
[MQTT] SUBSCRIBE: diorama/dronestation/request
29. Service ์ฌ์์
Python ์์ค๋ฅผ ์์ ํ ํ:
sudo systemctl restart drone-control.service
30. Service ์ค์ง
sudo systemctl stop drone-control.service
31. ์๋ ์คํ ํด์
sudo systemctl disable drone-control.service
32. ๋ถํ ๋์ ์์
Raspberry Pi POWER ON
โ
โผ
Linux Boot
โ
โผ
Graphical Desktop
โ
โผ
drone-control.service
โ
โผ
10 SEC WAIT
โ
โผ
drone_control.py
โ
โโโ 480ร320 GUI
โโโ Arduino Serial
โโโ CoDrone Mini
โโโ MQTT
โ
โผ
MQTT Broker ์ฐ๊ฒฐ
โ
โผ
diorama/dronestation/request
โ
โผ
START_SCENARIO ๋๊ธฐ
33. ์ต์ข MQTT ํต์ ๊ตฌ์กฐ
Orchestration Server
โ
โ REQUEST
โผ
diorama/dronestation/request
โ
โผ
Raspberry Pi
โ
โโโโโโโโโโโโดโโโโโโโโโโโ
โ โ
Arduino UNO CoDrone Mini
โ โ
โโโโโโโดโโโโโโ โ
โ โ โ
D6 RED D7 GREEN Flight
READY EVENT
โ โ
โโโโโโโโโโโโฌโโโโโโโโโโโ
โ
โผ
Drone Station
โ
โโโโโโโโโโโดโโโโโโโโโโ
โ โ
โผ โผ
STATUS RESPONSE
โ โ
โผ โผ
diorama/dronestation/status
diorama/dronestation/response
โ โ
โโโโโโโโโโโฌโโโโโโโโโโ
โผ
Orchestration Server
Hydrogen Center ๊ตฌํ ๋ช ์ธ
1. ๊ฐ์
Hydrogen / Battery Diorama๋ ์ค์ผ์คํธ๋ ์ด์ ์๋ฒ๋ก๋ถํฐ MQTT ๋ช ๋ น์ ์์ ํ์ฌ Raspberry Pi์ Arduino๋ฅผ ํตํด ์์/๋ฐฐํฐ๋ฆฌ ์ถฉ์ ์๋๋ฆฌ์ค๋ฅผ ์คํํ๋ค.
์ ์ฒด ์ ์ด ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
Orchestration Server
|
| MQTT
v
Raspberry Pi
hydrogen_control.py
|
| USB Serial
v
Arduino
|
+-- D6 RED LED
+-- D7 GREEN LED
|
+-- D5 BLUE LED
+-- D4 BLUE LED
+-- D3 BLUE LED
+-- D2 BLUE LED
์ด๋ฒคํธ ์คํ ์ค์๋ GREEN LED๊ฐ ์ผ์ง๊ณ BLUE LED๊ฐ ์์ฐจ์ ์ผ๋ก ์ ๋ฑ๋์ด ์ถฉ์ ์ํ๋ฅผ ํํํ๋ค.
2. MQTT Topic
๊ธฐ๋ณธ Topic Prefix:
diorama/hydrogen
| ๊ตฌ๋ถ | Topic | ์ค๋ช |
|---|---|---|
| REQUEST | diorama/hydrogen/request |
์ค์ผ์คํธ๋ ์ด์ โ Hydrogen |
| RESPONSE | diorama/hydrogen/response |
Hydrogen โ ์ค์ผ์คํธ๋ ์ด์ |
| STATUS | diorama/hydrogen/status |
Hydrogen ์ํ ์ ๋ณด ์ก์ |
3. Command
| Command | ์ค๋ช |
|---|---|
START_SCENARIO |
์์/๋ฐฐํฐ๋ฆฌ ์ถฉ์ ์๋๋ฆฌ์ค ์์ |
STOP_SCENARIO |
์ถฉ์ ์๋๋ฆฌ์ค ์ข ๋ฃ |
GET_STATUS |
ํ์ฌ Hydrogen/Battery ์ํ ์์ฒญ |
PING |
ํต์ ์ํ ํ์ธ |
4. REQUEST
Topic
diorama/hydrogen/request
START_SCENARIO
{
"session_id": "SESSION-TEST-001",
"scenario_id": "SCN-HYDROGEN-001",
"command": "START_SCENARIO",
"target": "HYDROGEN",
"payload": {
"vehicle": "CAR1"
},
"timestamp": "2026-10-01T19:30:00+09:00"
}
REQUEST ํ๋ ์ ์
| ํ๋ | ํ์ | ํ์ | ์ค๋ช |
|---|---|---|---|
session_id |
string | Y | ์ค์ผ์คํธ๋ ์ด์ ์ธ์ ID |
scenario_id |
string | Y | ์๋๋ฆฌ์ค ์๋ณ ID |
command |
string | Y | ์คํ ๋ช ๋ น |
target |
string | Y | ๋์ ๋์ค๋ผ๋ง |
payload |
object | Y | ๋ช ๋ น์ ํ์ํ ์์ธ ๋ฐ์ดํฐ |
timestamp |
string | N | ์์ฒญ ์์ฑ ์๊ฐ |
payload
| ํ๋ | ํ์ | ์ค๋ช |
|---|---|---|
vehicle |
string | ์ถฉ์ ๋์ ์ฐจ๋ (CAR1 ๋ฑ) |
5. STOP_SCENARIO
Request
{
"session_id": "SESSION-TEST-001",
"scenario_id": "SCN-HYDROGEN-001",
"command": "STOP_SCENARIO",
"target": "HYDROGEN",
"payload": {},
"timestamp": "2026-10-01T19:35:00+09:00"
}
์๋๋ฆฌ์ค๊ฐ ์ข ๋ฃ๋๋ฉด ์ถฉ์ ๋์ ๋ฐ BLUE LED ์ ๋๋ฉ์ด์ ์ด ์ค์ง๋๋ค.
6. RESPONSE
Topic
diorama/hydrogen/response
START_SCENARIO Response
{
"device": "HYDROGEN_BATTERY",
"command": "START_SCENARIO",
"result": "ACCEPTED",
"session_id": "SESSION-TEST-001",
"scenario_id": "SCN-HYDROGEN-001",
"timestamp": "2026-10-01T19:30:00+09:00"
}
STOP_SCENARIO Response
{
"device": "HYDROGEN_BATTERY",
"command": "STOP_SCENARIO",
"result": "COMPLETED",
"session_id": "SESSION-TEST-001",
"scenario_id": "SCN-HYDROGEN-001",
"timestamp": "2026-10-01T19:35:00+09:00"
}
RESPONSE ํ๋ ์ ์
| ํ๋ | ํ์ | ์ค๋ช |
|---|---|---|
device |
string | ๋๋ฐ์ด์ค ์๋ณ์ |
command |
string | ์ฒ๋ฆฌํ Command |
result |
string | ๋ช ๋ น ์ฒ๋ฆฌ ๊ฒฐ๊ณผ |
session_id |
string | ์ธ์ ID |
scenario_id |
string | ์๋๋ฆฌ์ค ID |
timestamp |
string | ์๋ต ์์ฑ ์๊ฐ |
result
| ๊ฐ | ์ค๋ช |
|---|---|
ACCEPTED |
์๋๋ฆฌ์ค ์์ ๋ช ๋ น ์ ์ ์ฒ๋ฆฌ |
COMPLETED |
์๋๋ฆฌ์ค ์ข ๋ฃ ๋ช ๋ น ์ ์ ์ฒ๋ฆฌ |
OK |
์ผ๋ฐ ๋ช ๋ น ์ ์ ์ฒ๋ฆฌ |
ARDUINO_ERROR |
Arduino ํต์ ์ค๋ฅ |
UNKNOWN_COMMAND |
์ ์๋์ง ์์ Command |
7. STATUS
Topic
diorama/hydrogen/status
Hydrogen/Battery Controller๋ ํ์ฌ ์ํ ๋ฐ ์ถฉ์ ๋ฐ์ดํฐ๋ฅผ ์ค์ผ์คํธ๋ ์ด์ ์๋ฒ๋ก ์ฃผ๊ธฐ์ ์ผ๋ก ์ก์ ํ๋ค.
๊ธฐ๋ณธ ์ก์ ์ฃผ๊ธฐ๋ ์ฝ 1์ด์ด๋ค.
STATUS ์์
{
"device": "HYDROGEN_BATTERY",
"station_status": "BUSY",
"charging_status": "CHARGING",
"target_vehicle": "CAR1",
"charging_progress": 64.2,
"vehicle_soc": {
"start": 42.0,
"current": 65.1,
"target": 78.0
},
"hydrogen_level": 70.1,
"supply_pressure_bar": 701.3,
"instant_power_kw": 6.2,
"cumulative_supply_kg": 2.37,
"led": {
"D6_RED": false,
"D7_GREEN": true
},
"session_id": "SESSION-TEST-001",
"scenario_id": "SCN-HYDROGEN-001",
"timestamp": "2026-10-01T19:30:00+09:00"
}
8. ์ค์ผ์คํธ๋ ์ด์ ์ก์ ๋ฐ์ดํฐ
| ํ๋ฉด ํ์ ํญ๋ชฉ | MQTT ํ๋ | ํ์ | ๋จ์ | ์์ |
|---|---|---|---|---|
| ์ถฉ์ ์ ์ํ | station_status |
string | - | BUSY |
| ์ถฉ์ ์ํ | charging_status |
string | - | CHARGING |
| ๋์ ์ฐจ๋ | target_vehicle |
string | - | CAR1 |
| ์ถฉ์ ์งํ๋ฅ | charging_progress |
number | % | 64.2 |
| ์ฐจ๋ ์ด๊ธฐ SOC | vehicle_soc.start |
number | % | 42.0 |
| ์ฐจ๋ ํ์ฌ SOC | vehicle_soc.current |
number | % | 65.1 |
| ์ฐจ๋ ๋ชฉํ SOC | vehicle_soc.target |
number | % | 78.0 |
| ์์ ์๋ | hydrogen_level |
number | % | 70.1 |
| ๊ณต๊ธ ์๋ ฅ | supply_pressure_bar |
number | bar | 701.3 |
| ์๊ฐ ์ ๋ ฅ | instant_power_kw |
number | kW | 6.2 |
| ๋์ ๊ณต๊ธ๋ | cumulative_supply_kg |
number | kg | 2.37 |
9. ์ถฉ์ ์ ์ํ
station_status๋ ํ์ฌ ์ถฉ์ ์์ ์ฌ์ฉ ๊ฐ๋ฅ ์ํ๋ฅผ ๋ํ๋ธ๋ค.
| ๊ฐ | ์ค๋ช |
|---|---|
AVAILABLE |
์ถฉ์ ๊ฐ๋ฅ |
BUSY |
์ถฉ์ ์๋๋ฆฌ์ค ์คํ ์ค |
OFFLINE |
Hydrogen Controller ์ข ๋ฃ ๋๋ ์ฐ๊ฒฐ ํด์ |
์๋๋ฆฌ์ค ์์:
AVAILABLE
|
START_SCENARIO
|
v
BUSY
์๋๋ฆฌ์ค ์ข ๋ฃ:
BUSY
|
STOP_SCENARIO
|
v
AVAILABLE
10. ์ถฉ์ ์ํ
charging_status๋ ์ฐจ๋์ ํ์ฌ ์ถฉ์ ์ํ๋ฅผ ๋ํ๋ธ๋ค.
| ๊ฐ | ์ค๋ช |
|---|---|
CHARGING |
์ถฉ์ ์งํ ์ค |
COMPLETE |
์ถฉ์ ์๋ฃ ๋๋ ์ถฉ์ ๋๊ธฐ ์ํ |
์๋๋ฆฌ์ค ์คํ ์ค:
station_status = BUSY
charging_status = CHARGING
์๋๋ฆฌ์ค ์ข ๋ฃ ๋๋ ์ถฉ์ ์๋ฃ:
station_status = AVAILABLE
charging_status = COMPLETE
11. ์ฐจ๋ SOC
์ฐจ๋ SOC๋ ๋ค์ ์ธ ๊ฐ์ง ๊ฐ์ผ๋ก ๊ด๋ฆฌํ๋ค.
{
"vehicle_soc": {
"start": 42.0,
"current": 65.1,
"target": 78.0
}
}
| ํ๋ | ์ค๋ช |
|---|---|
start |
์ถฉ์ ์์ ์ SOC |
current |
ํ์ฌ SOC |
target |
๋ชฉํ SOC |
์ถฉ์ ์๋ฎฌ๋ ์ด์ :
42%
|
v
50%
|
v
60%
|
v
70%
|
v
78%
12. LED ์ ์ด
Arduino Pin
| Arduino Pin | LED | ์ญํ |
|---|---|---|
| D2 | BLUE | ์ถฉ์ ์งํ 4๋จ๊ณ |
| D3 | BLUE | ์ถฉ์ ์งํ 3๋จ๊ณ |
| D4 | BLUE | ์ถฉ์ ์งํ 2๋จ๊ณ |
| D5 | BLUE | ์ถฉ์ ์งํ 1๋จ๊ณ |
| D6 | RED | IDLE / STOP |
| D7 | GREEN | RUNNING / START |
13. ๊ธฐ๋ณธ LED ์ํ
์๋๋ฆฌ์ค๊ฐ ์คํ๋์ง ์๋ ๊ฒฝ์ฐ:
D2 BLUE OFF
D3 BLUE OFF
D4 BLUE OFF
D5 BLUE OFF
D6 RED ON
D7 GREEN OFF
14. ์ถฉ์ ์ด๋ฒคํธ LED
START_SCENARIO ์์ ์:
D6 RED OFF
D7 GREEN ON
BLUE LED๋ ์ถฉ์ ์ํ๋ฅผ ํํํ๊ธฐ ์ํด ์์ฐจ์ ์ผ๋ก ๋์ ์ ๋ฑ๋๋ค.
D5
|
v
D5 + D4
|
v
D5 + D4 + D3
|
v
D5 + D4 + D3 + D2
ํํ๋๋ ์ถฉ์ ๋จ๊ณ:
D5 25%
D5 + D4 50%
D5 + D4 + D3 75%
D5 + D4 + D3 + D2 100%
100% ํ์ ํ BLUE LED๋ฅผ ๋ชจ๋ ๋๊ณ RUNNING ์ํ์์๋ ๋ค์ ๋ฐ๋ณตํ๋ค.
15. STOP ๋์
STOP_SCENARIO๋ฅผ ์์ ํ๋ฉด BLUE LED ์ ๋๋ฉ์ด์
์ ์ฆ์ ์ค์งํ๋ค.
D2 BLUE OFF
D3 BLUE OFF
D4 BLUE OFF
D5 BLUE OFF
D6 RED ON
D7 GREEN OFF
16. Raspberry Pi - Arduino Serial Protocol
Serial Baudrate:
115200
Raspberry Pi -> Arduino
| Command | ์ค๋ช |
|---|---|
START |
์ถฉ์ ์ด๋ฒคํธ ์์ |
STOP |
์ถฉ์ ์ด๋ฒคํธ ์ข ๋ฃ |
STATUS |
Arduino ์ํ ์์ฒญ |
PING |
Serial ํต์ ํ์ธ |
Arduino -> Raspberry Pi
| Message | ์ค๋ช |
|---|---|
READY:HYDROGEN_CONTROLLER |
Arduino ์ค๋น ์๋ฃ |
RX:START |
START ๋ช ๋ น ์์ |
ACK:START |
START ์ฒ๋ฆฌ ์๋ฃ |
STATUS:RUNNING |
์ด๋ฒคํธ ์คํ ์ค |
RX:STOP |
STOP ๋ช ๋ น ์์ |
ACK:STOP |
STOP ์ฒ๋ฆฌ ์๋ฃ |
STATUS:IDLE |
์ด๋ฒคํธ ๋๊ธฐ ์ํ |
PONG |
PING ์๋ต |
CHARGING:25 |
BLUE LED 25% ๋จ๊ณ |
CHARGING:50 |
BLUE LED 50% ๋จ๊ณ |
CHARGING:75 |
BLUE LED 75% ๋จ๊ณ |
CHARGING:100 |
BLUE LED 100% ๋จ๊ณ |
17. ์ ์ฒด ์ด๋ฒคํธ Flow
Orchestration Server
|
| START_SCENARIO
v
MQTT Broker
|
v
diorama/hydrogen/request
|
v
Raspberry Pi
hydrogen_control.py
|
| Serial START
v
Arduino
|
+----------------------+
| |
v v
D7 GREEN ON BLUE Charging LED
|
v
D5
|
v
D5 + D4
|
v
D5 + D4 + D3
|
v
D5 + D4 + D3 + D2
Raspberry Pi
|
| MQTT STATUS
v
diorama/hydrogen/status
|
v
Orchestration Server
18. MQTT ํ ์คํธ
์ ์ฒด Hydrogen Topic ๋ชจ๋ํฐ๋ง
mosquitto_sub -h jscouple.site -p 1883 -u oc -P 1234 \
-t "diorama/hydrogen/#" -v
19. START_SCENARIO ํ ์คํธ
mosquitto_pub -h jscouple.site -p 1883 -u oc -P 1234 \
-t "diorama/hydrogen/request" \
-m '{"session_id":"SESSION-TEST-001","scenario_id":"SCN-HYDROGEN-001","command":"START_SCENARIO","target":"HYDROGEN","payload":{"vehicle":"CAR1"}}'
์ ์ ๋์:
RED OFF
GREEN ON
BLUE LED
D5 -> D5+D4 -> D5+D4+D3 -> D5+D4+D3+D2
station_status = BUSY
charging_status = CHARGING
20. STOP_SCENARIO ํ ์คํธ
mosquitto_pub -h jscouple.site -p 1883 -u oc -P 1234 \
-t "diorama/hydrogen/request" \
-m '{"session_id":"SESSION-TEST-001","scenario_id":"SCN-HYDROGEN-001","command":"STOP_SCENARIO","target":"HYDROGEN","payload":{}}'
์ ์ ๋์:
BLUE OFF
GREEN OFF
RED ON
station_status = AVAILABLE
charging_status = COMPLETE
21. Raspberry Pi ์คํ ํ์ผ
Python Controller:
/home/zer01ne/hydrogen_control.py
์คํ:
python3 /home/zer01ne/hydrogen_control.py
22. systemd ์๋น์ค
์๋น์ค ํ์ผ:
/etc/systemd/system/hydrogen.service
์๋น์ค ์ค์ :
[Unit]
Description=Hydrogen Battery Diorama MQTT Controller
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=zer01ne
WorkingDirectory=/home/zer01ne
ExecStart=/usr/bin/python3 /home/zer01ne/hydrogen_control.py
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
์๋น์ค ๋ฑ๋ก:
sudo systemctl daemon-reload
sudo systemctl enable hydrogen.service
sudo systemctl start hydrogen.service
์๋น์ค ์ฌ์์:
sudo systemctl restart hydrogen.service
์๋น์ค ์ํ ํ์ธ:
sudo systemctl status hydrogen.service
์๋ ์คํ ํ์ธ:
systemctl is-enabled hydrogen.service
์ ์:
enabled
์คํ ์ํ ํ์ธ:
systemctl is-active hydrogen.service
์ ์:
active
์ค์๊ฐ ๋ก๊ทธ:
journalctl -u hydrogen.service -f
23. ์ต์ข ์์คํ ๊ตฌ์ฑ
Orchestration Server
|
| MQTT
v
MQTT Broker
|
v
Raspberry Pi Controller
hydrogen_control.py
|
| USB Serial
v
Arduino
|
+-----------+-----------+
| |
v v
Event Status LED Charging LED
D6 / D7 D5/D4/D3/D2
|
v
Hydrogen / Battery
Diorama
Hydrogen / Battery Diorama๋ ์ค์ผ์คํธ๋ ์ด์ ์๋ฒ์ MQTT ๋ช ๋ น์ ๊ธฐ๋ฐ์ผ๋ก ์ถฉ์ ์ด๋ฒคํธ๋ฅผ ์คํํ๊ณ , ์ถฉ์ ์ ์ํ, ์ถฉ์ ์ํ, ๋์ ์ฐจ๋, ์ถฉ์ ์งํ๋ฅ , ์ฐจ๋ SOC, ์์ ์๋, ๊ณต๊ธ ์๋ ฅ, ์๊ฐ ์ ๋ ฅ ๋ฐ ๋์ ๊ณต๊ธ๋์ MQTT STATUS Topic์ ํตํด ์ค์ผ์คํธ๋ ์ด์ ์๋ฒ๋ก ์ ๋ฌํ๋ค.
Autonomous Center ๊ตฌํ ๋ช ์ธ
1. ๊ฐ์
Autonomous Center๋ Physical AI ๊ธฐ๋ฐ ์์จ์ฃผํ ์ฐจ๋์ ์ด๋ ๋ฐ ๋๋ก ์ํฉ์ ํํํ๋ค.
์ด 4๋์ ์์จ์ฃผํ ์ฐจ๋์ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ธ MQTT Topic์ผ๋ก ๊ด๋ฆฌํ๋ค.
CAR1
CAR2
CAR3
CAR4
2. ์ด๋ฒคํธ ๋ช ๋ น(Command)
| Command | ์ค๋ช |
|---|---|
START_SCENARIO |
์์จ์ฃผํ ์๋๋ฆฌ์ค ์์ |
STOP_SCENARIO |
์์จ์ฃผํ ์๋๋ฆฌ์ค ์ข ๋ฃ |
MOVE |
์ฐจ๋ ์ด๋ |
STOP |
์ฐจ๋ ์ ์ง |
LED_ON |
์ฐจ๋ LED ์ผ๊ธฐ โ ์ค์ command ๊ฐ์ car1_led_on (์๋ 2.1) |
LED_OFF |
์ฐจ๋ LED ๋๊ธฐ โ ์ค์ command ๊ฐ์ car1_led_off (์๋ 2.1) |
STATUS_REQUEST |
์ฐจ๋ ์ํ ์์ฒญ |
2.1 LED_ON / LED_OFF (2026-10-09 ์ถ๊ฐ)
์ฐจ๋ LED ์ ์ด. ์ฅ์น๋ก ๋ณด๋ด๋ command ๊ฐ์ ์ฐจ ๋ฒํธ์ ๋ฌด๊ดํ๊ฒ 4๋ ๋ชจ๋ ๊ณ ์ ์ด๋ค โ
CAR2~CAR4 ์๋ car1_led_on / car1_led_off ๋ฅผ ๋ณด๋ธ๋ค. ์ด๋ ์ฐจ์ธ์ง๋ ํ ํฝ์ผ๋ก ๊ตฌ๋ถํ๋ค.
| ์ค์ผ์คํธ๋ ์ด์ ๋ช ๋ น | ์ค์ command ๊ฐ (CAR1~CAR4 ๊ณตํต) |
|---|---|
LED_ON |
car1_led_on |
LED_OFF |
car1_led_off |
์ค์ผ์คํธ๋ ์ด์
์๋ฒ(์๋ํยท๋ฐฑ์คํผ์ค)์์๋ LED_ON / LED_OFF ๋ก ๊ณ ๋ฅด๊ณ , ์๋ฒ๊ฐ ๋ฐํํ ๋ ์ ๊ฐ์ผ๋ก ๋ฐ๊ฟ ๋ณด๋ธ๋ค
(internal/mqttx/hub_catalog.go ์ HubCommand.Wire). payload ๋ ์ฐ์ง ์๋๋ค ({}).
diorama/autonomouscar/car3/request
{
"session_id": "SESSION-20260929-0005",
"scenario_id": "SCN-AUTO-LED-001",
"command": "car1_led_on",
"target": "CAR3",
"payload": {},
"timestamp": "2026-10-09T17:00:00+09:00"
}
์๋ต์ ๋ค๋ฅธ ๋ช
๋ น๊ณผ ๊ฐ์ด diorama/autonomouscar/{car_id}/response ๋ก ์จ๋ค๊ณ ๋ณธ๋ค. ์๋ฒ๋ ์๋ต์ command ๊ฐ
car1_led_on ์ด๋ LED_ON ์ด๋ (session_id, scenario_id) ๋ก ์์ฒญ์ ์ฐพ๋๋ค. ์๋ต์ด ์์ผ๋ฉด ํ ํ์์์(30์ด)์ผ๋ก ๋๋๋ค.
3. ํ ํฝ ๋ชฉ๋ก
๊ฐ ์ฐจ๋์ ๋ค์ Topic ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ค.
diorama/autonomouscar/{car_id}/request
diorama/autonomouscar/{car_id}/response
diorama/autonomouscar/{car_id}/status
CAR1
diorama/autonomouscar/car1/request
diorama/autonomouscar/car1/response
diorama/autonomouscar/car1/status
CAR2
diorama/autonomouscar/car2/request
diorama/autonomouscar/car2/response
diorama/autonomouscar/car2/status
CAR3
diorama/autonomouscar/car3/request
diorama/autonomouscar/car3/response
diorama/autonomouscar/car3/status
CAR4
diorama/autonomouscar/car4/request
diorama/autonomouscar/car4/response
diorama/autonomouscar/car4/status
4. REQUEST
CAR1 Topic ์์
diorama/autonomouscar/car1/request
Payload ์์
{
"session_id": "SESSION-20260929-0005",
"scenario_id": "SCN-AUTO-001",
"command": "START_SCENARIO",
"target": "CAR1",
"payload": {
"from": "STATION_A",
"to": "HYDROGEN_CENTER"
},
"timestamp": "2026-09-29T08:40:00+09:00"
}
REQUEST ํ๋ ์ ์
| ํ๋ | ํ์ | ํ์ | ์ค๋ช | ์์ |
|---|---|---|---|---|
session_id |
string | Y | Orchestration ์คํ ์ธ์ ID | SESSION-20260929-0005 |
scenario_id |
string | Y | ์์จ์ฃผํ ์๋๋ฆฌ์ค ID | SCN-AUTO-001 |
command |
string | Y | ์ฐจ๋ ์ ์ด ๋ช ๋ น | START_SCENARIO |
target |
string | Y | ์ ์ด ๋์ ์ฐจ๋ | CAR1 |
payload |
object | Y | ์ฃผํ ๊ด๋ จ Parameter (LED_ON/LED_OFF ๋ {}) |
{...} |
timestamp |
string | Y | ๋ช ๋ น ์์ฑ ์๊ฐ | 2026-09-29T08:40:00+09:00 |
target ์ ์
| ๊ฐ | ์ค๋ช |
|---|---|
CAR1 |
์์จ์ฃผํ ์ฐจ๋ 1 |
CAR2 |
์์จ์ฃผํ ์ฐจ๋ 2 |
CAR3 |
์์จ์ฃผํ ์ฐจ๋ 3 |
CAR4 |
์์จ์ฃผํ ์ฐจ๋ 4 |
REQUEST Payload ์ ์
| ํ๋ | ํ์ | ํ์ | ์ค๋ช | ์์ |
|---|---|---|---|---|
from |
string | Y | ์ฐจ๋ ์ถ๋ฐ ์์น | STATION_A |
to |
string | Y | ์ฐจ๋ ๋ชฉ์ ์ง | HYDROGEN_CENTER |
5. RESPONSE
CAR1 Topic ์์
diorama/autonomouscar/car1/response
Payload ์์
{
"session_id": "SESSION-20260929-0005",
"scenario_id": "SCN-AUTO-001",
"command": "START_SCENARIO",
"target": "CAR1",
"result": "SUCCESS",
"message": "Autonomous driving scenario completed",
"payload": {
"destination_reached": true,
"final_position": "HYDROGEN_CENTER"
},
"timestamp": "2026-09-29T08:40:20+09:00"
}
RESPONSE ํ๋ ์ ์
| ํ๋ | ํ์ | ํ์ | ์ค๋ช |
|---|---|---|---|
session_id |
string | Y | REQUEST์ ๋์ผํ Session ID |
scenario_id |
string | Y | REQUEST์ ๋์ผํ Scenario ID |
command |
string | Y | ์ฒ๋ฆฌํ Command |
target |
string | Y | ๋ช ๋ น์ ์ํํ ์ฐจ๋ ID |
result |
string | Y | ๋ช ๋ น ์ฒ๋ฆฌ ๊ฒฐ๊ณผ |
message |
string | Y | ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ์ค๋ช |
payload |
object | N | ์ฃผํ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ |
timestamp |
string | Y | RESPONSE ์์ฑ ์๊ฐ |
RESPONSE Payload ์ ์
| ํ๋ | ํ์ | ์ค๋ช |
|---|---|---|
destination_reached |
boolean | ๋ชฉ์ ์ง ๋์ฐฉ ์ฌ๋ถ |
final_position |
string | ์ด๋ฒคํธ ์ข ๋ฃ ์ ์ฐจ๋ ์์น |
Result ์ ์
| Result | ์ค๋ช |
|---|---|
SUCCESS |
์ฃผํ ์ด๋ฒคํธ ์ ์ ์๋ฃ |
FAILED |
์ฃผํ ์ด๋ฒคํธ ์คํจ |
BUSY |
์ฐจ๋์ด ๋ค๋ฅธ ์ด๋ฒคํธ ์ํ ์ค |
INVALID_COMMAND |
์ง์ํ์ง ์๋ ๋ช ๋ น |
DEVICE_ERROR |
์ฐจ๋ ๋๋ ์ ์ด ์ฅ์น ์ค๋ฅ |
6. ์ค์ผ์คํธ๋ ์ด์ ์ก์ ์ ๋ณด
Topic
diorama/autonomouscar/{car_id}/status
CAR1 ~ CAR4๋ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์์ ์ ์ํ ์ ๋ณด๋ฅผ Orchestration Server๋ก ์ก์ ํ๋ค.
| ํ๋ | ํ์ | ๋ฐ์ดํฐ ์ถ์ฒ | ์ค๋ช |
|---|---|---|---|
vehicle_id |
string | System | CAR1 ~ CAR4 |
status |
string | System | IDLE, DRIVING, STOPPED, ARRIVED, ERROR |
autopilot |
boolean | System | ์์จ์ฃผํ ํ์ฑํ ์ฌ๋ถ |
speed |
number | Vehicle/Simulation | ํ์ฌ ์๋ km/h |
battery |
number | Vehicle/Simulation | ์ฐจ๋ ๋ฐฐํฐ๋ฆฌ % |
traffic |
string | Simulation | LOW, NORMAL, HIGH |
current_position |
string | System/Simulation | ํ์ฌ ์์น |
destination |
string | System | ๋ชฉ์ ์ง |
progress |
number | Simulation | ์ด๋ ์งํ๋ฅ % |
estimated_time |
number | Simulation | ๋ชฉ์ ์ง๊น์ง ์์ ์๊ฐ(sec) |
distance_remaining |
number | Simulation | ์์ฌ ๊ฑฐ๋ฆฌ |
climate_control |
boolean | Simulation | ๊ณต์กฐ ์์คํ ๋์ ์ฌ๋ถ |
event_led |
string | Arduino | Station ์ด๋ฒคํธ LED |
destination_reached |
boolean | System | ๋ชฉ์ ์ง ๋์ฐฉ ์ฌ๋ถ |
scenario_id |
string | System | Scenario ID |
timestamp |
string | System | ๋ฐ์ดํฐ ์์ฑ ์๊ฐ |
STATUS Payload ์์
{
"vehicle_id": "CAR1",
"status": "DRIVING",
"autopilot": true,
"speed": 32.5,
"battery": 78,
"traffic": "NORMAL",
"current_position": "ROAD_A",
"destination": "HYDROGEN_CENTER",
"progress": 62,
"estimated_time": 35,
"distance_remaining": 1.8,
"climate_control": true,
"event_led": "GREEN",
"destination_reached": false,
"scenario_id": "SCN-AUTO-001",
"timestamp": "2026-09-29T08:40:10+09:00"
}
7. QoS / ๊ธฐํ ์ค์
| ํญ๋ชฉ | ์ค์ |
|---|---|
| REQUEST QoS | 1 |
| RESPONSE QoS | 1 |
| STATUS QoS | 1 |
| REQUEST Retain | false |
| RESPONSE Retain | false |
| STATUS Retain | true |
| Payload | JSON |
| Encoding | UTF-8 |
| Vehicle | CAR1 ~ CAR4 |
| Traffic Data | Simulation |
| Speed | Vehicle/Simulation |
| Battery | Vehicle/Simulation |
์ค์ผ์คํธ๋ ์ด์ ์๋ฒ ๊ตฌํ ๋ฉ๋ชจ (2026-10-01)
์ ๋ค์ฏ ๊ตฌ์ญ ๋ช ์ธ๋ฅผ ์๋ฒ๊ฐ ์ด๋ป๊ฒ ๋ฐ์ ์ฐ๋์ง. ํ๋ธ ํ์ด ๋ฌธ์๋ฅผ ๊ณ ์น๋ฉด ์๋ฒ๋ ์ฌ๊ธฐ๋ฅผ ๋ณด๊ณ ๋ฐ๋ผ๊ฐ๋ค.
| ํญ๋ชฉ | ์๋ฒ ๋์ |
|---|---|
| ๊ตฌ์ญ ์ ์ | internal/mqttx/hub_catalog.go ๊ฐ targetยท์ฌ๋ฌ๊ทธยทcommandยทpayload ํ๋ฅผ ๋ค๊ณ ์๊ณ , ๋ฐฑ์คํผ์ค๋ GET /api/admin/hub/catalog ๋ก ๊ฐ์ ํ๋ฅผ ๋ฐ์ ์
๋ ฅ ํผ์ ๋ง๋ ๋ค |
| ํ | ๊ตฌ์ญ๋ง๋ค ๋ฐ๋ก (hub:{์ฌ๋ฌ๊ทธ}). ๋๋ก ์ด ๋ฐฐ์กํ๋ ๋์ ํธ๋ฆฌ LED ๋ฅผ ์ผค ์ ์๊ณ , ๊ฐ์ ๊ตฌ์ญ ์์์๋ ์์๊ฐ ์ง์ผ์ง๋ค |
scenario_id |
๋น์ด ์์ผ๋ฉด ์๋ฒ๊ฐ uuid ๋ฅผ ๋ง๋ค์ด ์ฑ์ด๋ค. ์๋ต ๋งค์นญ ํค๊ฐ (session_id, scenario_id, command) ๋ผ, ๋น์ ๋๋ฉด ๊ฐ์ ์ธ์
์ ๊ฐ์ command ๋ ๊ฑด์ด ๊ฐ์ ํค๊ฐ ๋๋ค |
payload |
๋ฌธ์์ ํ์ object ๋ผ, ๋ณด๋ผ ๊ฐ์ด ์์ผ๋ฉด {} ๋ฅผ ๋ณด๋ธ๋ค |
target |
์ ์ด๋ฆ(NEURAL_TREEยทFACTORYยทDRONE_STATION ๋ฑ)๋ ๊ณ์ ๋ฐ์ ์ ์ ๊ฐ์ผ๋ก ๋ฐ๊ฟ ๋ฐํํ๋ค |
result |
SUCCESS ๋ง ์ฑ๊ณต์ผ๋ก ์น๊ณ ๋๋จธ์ง๋ ์คํจ๋ก ์ข
๊ฒฐํ๋ค. ๋ค๋ง FAILEDยทBUSYยทINVALID_COMMANDยทDEVICE_ERROR ๋ฅผ ๋ญ๊ฐ์ง ์๊ณ ๊ทธ๋๋ก ์คํ ๋ก๊ทธ์ ํ๋ฉด์ ๋จ๊ธด๋ค โ ์คํํ๊ฐ ํ ์ผ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค. ์ FAIL ๋ ๋ฐ๋๋ค |
์๋ต payload |
๊ตฌ์ญ๋ง๋ค ํ๋๊ฐ ๋ฌ๋ผ ์๋ฒ๋ ํด์ํ์ง ์๊ณ ์๋ฌธ ๊ทธ๋๋ก ๋ก๊ทธยทํ๋ฉด์ ๋จ๊ธด๋ค |
| ํ๋ธ๋ฆฟ ์ ๋ฌ (hub_mode, 149ยท150) | ์๋ฒ๊ฐ ๋ฐ์ diorama/{device}/status ๋ฅผ orchestration/diorama/{device}/status ๋ก ๊ทธ๋๋ก ๋ฆด๋ ์ดํ๋ค(mirror, ๊ธฐ๋ณธ). app_settings.hub_mode๋ฅผ simulate ๋ก ๋ฐ๊พธ๋ฉด, hub ์๋ํ ์ก์
์ ๋ฐํํ๋ ์์ ์ ์ด๋๋ฏผ์ด ๋ฐฑ์คํผ์ค(GETยทPUTยทDELETE /api/admin/hub/simulated-responses)์ ๋ฏธ๋ฆฌ ์ ์ฅํด ๋ (target, command) โ ์ํ JSON์ ๊ทธ๋๋ก ๊ฐ์ ํ ํฝ์ผ๋ก ์ฆ์ ๋ด๋ณด๋ธ๋ค โ ํ๋ธ ํ๋์จ์ด๊ฐ ๋ถ์์ ํด ์ค์ ์๋ต์ด ์ค์ง ์์๋ ํ๋ธ๋ฆฟ ํ๋ฉด์ ๋ฉ์ถ์ง ์๋๋ค. ์ ์ฅ๋ ์กฐํฉ์ด ์์ผ๋ฉด simulate ๋ผ๋ ์๋ฌด ๊ฒ๋ ๋ณด๋ด์ง ์๋๋ค. ๊ฐ์ ์๋ต์ ์ ์ฅํด ๋ ์ฅ์น(target)๋ simulate ์์ ์ค์ ํ๋ธ status ๋ฅผ ๋ฆด๋ ์ดํ์ง ์๋๋ค โ ํ๋ธ๊ฐ 2์ด๋ง๋ค ๋ณด๋ด๋ ์ค์ ์ํ๊ฐ ๊ฐ์ ์ํ๋ฅผ ๋ฎ์ด์จ์(2026-10-09). ์ ์ฅํ์ง ์์ ์ฅ์น๋ simulate ์ฌ๋ ์ค์ ์ํ๋ฅผ ๊ทธ๋๋ก ๋ฆด๋ ์ดํ๋ค |
status์connection์online/offline๋ก ๋ณด๋ด์ฃผ์ธ์. ๋ฐฑ์คํผ์ค๊ฐ ์ด ๊ฐ์ผ๋ก ๋ธ๋ฆฌ์ง ํ๋ก์ธ์ค์ ์์ฌ(LWT)๋ฅผ ํ์ ํฉ๋๋ค. Arduino ์ฐ๊ฒฐ ์ฌ๋ถ๋serial(connected/disconnected) ํ๋๋ก ๋ฐ๋ก ๋ด ๋๋ค โ ๋ฌธ์ 6์ ํ์ "Arduino ์ฐ๊ฒฐ ์ํ" ๋ ์ดserial์ ํด๋นํฉ๋๋ค.