π¨οΈ Klipper - Web Server Bridge Client μ΄ νλ‘μ νΈλ λΌμ¦λ² 리νμ΄ 4(Mainsail OS)μμ λμνλ Python κΈ°λ°μ λ―Έλ€μ¨μ΄μ λλ€.
μΈλΆ μΉ μλ²μ Socket.IOλ‘ ν΅μ νλ©°, μΉμ λͺ λ Ήμ λ°μ λ‘컬 Klipper(Moonraker)λ₯Ό μ μ΄ν©λλ€.
- π Auto Connection: λΆν μ μΈλΆ μμΌ μλ²μ μλ μ μ λ° μ¬μ°κ²°(Retry) λ‘μ§ λ΄μ₯
- π₯ Remote Printing: μΉμμ μ μ‘ν G-code URLμ λ€μ΄λ‘λ ν Moonraker APIλ‘ μ¦μ μ λ‘λ λ° μΆλ ₯
- π‘ Real-time Monitoring: Klipperμ μν(μ¨λ, μ§νλ₯ , μνκ°)λ₯Ό 2μ΄ μ£ΌκΈ°λ‘ μΉ μλ²μ μ μ‘
- π§΅ Multi-threading: μμΌ μμ λκΈ°(Blocking)μ μν μ μ‘(Non-blocking)μ λ³λ ¬ μ²λ¦¬
/home/pi/ βββ printer_bridge/ # [νλ‘μ νΈ λ©μΈ ν΄λ] βββ app.py # [μ€ν νμΌ] λ©μΈ 루ν (python3 app.pyλ‘ μ€ν) βββ env.py # [μ€μ νμΌ] URL, νλμ¨μ΄ ID λ± βββ handler.py # [λ‘μ§ νμΌ] λ€μ΄λ‘λ, Klipper ν΅μ ν¨μλ€ βββ requirements.txt # [ν¨ν€μ§ λͺ©λ‘] μ€μΉν΄μΌ ν λΌμ΄λΈλ¬λ¦¬ 리μ€νΈ βββ printer_bridge/downloads/ # λ€μ΄λ‘λν νμΌλ€ 보κ΄.
μ΄ νλ‘μ νΈλ Mainsail OSκ° μ€μΉλ Raspberry Pi 4 νκ²½μ κΈ°μ€μΌλ‘ ν©λλ€.
# μμ€ν
ν¨ν€μ§ μ
λ°μ΄νΈ
sudo apt update
sudo apt install python3-pip -yμ£Όμ: Socket.IO μλ²μμ νΈνμ±μ μν΄ python-socketio ν΄λΌμ΄μΈνΈ 6.0.0 λ²μ μ μ¬μ©ν©λλ€.
# Python λΌμ΄λΈλ¬λ¦¬ μ€μΉ
pip3 install requests "python-socketio[client]==6.0.0"# νλ‘μ νΈ λλ ν 리 μμ± λ° μ½λ λ€μ΄λ‘λ
mkdir -p ~/printer_bridge
# (main.py νμΌμ ν΄λΉ ν΄λμ μμΉμν€μΈμ)main.py νμΌ μλ¨μ μ€μ λ³μλ₯Ό νκ²½μ λ§κ² μμ ν΄μΌ ν©λλ€.
# main.py
# λΌμ¦λ² 리νμ΄ μλ³ ID (μΉ μλ² λ±λ‘μ©)
HARDWARE_ID = "pi-lab-101"
# μΈλΆ μΉ μλ² μ£Όμ (Socket.IO μλ²)
EXTERNAL_SERVER_URL = "http://YOUR_SERVER_IP:3000"
# Moonraker API μ£Όμ (κΈ°λ³Έκ° μ μ§)
MOONRAKER_URL = "http://127.0.0.1:7125"λΌμ¦λ² 리νμ΄ μ μ μΈκ° μ νλ‘κ·Έλ¨μ΄ μλμΌλ‘ μ€νλλλ‘ μλΉμ€λ‘ λ±λ‘ν©λλ€.
sudo nano /etc/systemd/system/printer-bridge.service[Unit]
Description=Klipper to External Web Socket Bridge
After=network-online.target moonraker.service
Wants=network-online.target
[Service]
Type=simple
User=pi
WorkingDirectory=/home/pi/printer_bridge
ExecStart=/usr/bin/python3 /home/pi/printer_bridge/main.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable printer-bridge.service
sudo systemctl start printer-bridge.service| Event Name | Data Payload | Description |
|---|---|---|
print |
{ "fileUrl": "http://..." } |
ν΄λΉ URLμ G-codeλ₯Ό λ€μ΄λ‘λ ν μΆλ ₯ μμ |
test |
Any |
μ°κ²° ν μ€νΈμ© μ΄λ²€νΈ |
| Event Name | Data Payload | Frequency |
|---|---|---|
register |
{ "hardwareId": "..." } |
μμΌ μ°κ²° μ§ν 1ν μ μ‘ |
status_update |
{ "temp_nozzle": float, "temp_bed": float, "state": string, "progress": float } |
2μ΄λ§λ€ μ£ΌκΈ°μ μ μ‘ |