๐ฉ๐ป๐ป/python12 MQTT Keep Alive ์ต๊ทผ์ MQTT ํต์ ๊ฐ๋ฐ์ ์งํํ๋ฉด์ Keep Alive ์ค์ ์ ๊ด๋ จํ ๋ฌธ์ ๋ฅผ ๊ฒช์๋ค. Status Update ํ๋ mqtt ํด๋ผ์ด์ธํธ๋ฅผ ์๋์ ๊ฐ์ด ์์ฑํ๊ณ send_status ๋ผ๋ ํจ์๋ฅผ ํธ์ถํด์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ค. import paho.mqtt.client as mqttimport uuidimport timeclass RobotStatusUpdater: def __init__(self, broker_ip, topic="robot/status"): self.client = mqtt.Client(f"Robot_Status_Updater_{uuid.uuid4()}") self.client.connect(broker_ip, 1883) self.topic = to.. 2025. 3. 12. Redis ์ค์๊ฐ ๋ชจ๋ํฐ๋ง ๊ฐ์ํ ์คํธ ์งํํ๋๋ฐ redis๋ฅผ ์ค์๊ฐ ๋ชจ๋ํฐ๋ง ํ๋ ค๊ณ ํจ์งํRedis ์ค์๊ฐ ๋ก๊ทธRedis์ ๋ชจ๋ ์์ฒญ์ ์ค์๊ฐ์ผ๋ก ํ์ธํ๋ ๋ช ๋ น์ด:redis-cli monitor → Redis์ ๋ชจ๋ ์์ ์ ์ค์๊ฐ์ผ๋ก ํ์ธํ๋ค. ๋๋ฌด ๋ง์ ๋ก๊ทธ๊ฐ ์ถ๋ ฅ๋๊ณ ์์ด์ ๊ฐ๋ ์ฑ์ด ์ข์ง ์๋ค. Celery ์์ฒด ๋ชจ๋ํฐ๋งRedis์ ๋ก๊ทธ ์ค์์ ๋ด๊ฐ ๋ฑ๋กํ celery app์ ๋ํ ๋ก๊ทธ๋ง ์ถ๋ ฅํ๊ณ ์ถ์ด์ ์ฐพ์๋ดค๋๋ฐ, Celery์์ ์คํ๋๋ ์์ ์ ์ค์๊ฐ์ผ๋ก ํ์ธํ ์ ์๋ celery ์์ฒด ๋ชจ๋ํฐ๋ง์ด ์์๋ค.โ celery worker ์คํํ ๋ -E ์ต์ ์ถ๊ฐํด์ ์ด๋ฒคํธ ๋ก๊น ํ์ฑํํ๊ธฐ (์๋๋ฉด ์๋ฌด๊ฒ๋ ์๋ธ)pkill -9 -f "celery worker" # ๊ธฐ์กด ์์ปค ์ข ๋ฃcelery -A celery_tasks.c.. 2025. 2. 13. Redis and Celery ๊ฐ์Redis์ Celery์ ๊ด๊ณ๋ฅผ ์ข ๋ ์์ธํ๊ฒ ์ ๋ฆฌํด๋ณด๋ ค ํ๋ค.์ ๋ฆฌRedis์ Celery๋ ๋น๋๊ธฐ ํ์คํฌ ํ ์์คํ ์ ๊ตฌ์ถํ ๋ ์ฌ์ฉ๋๋ฉฐ, ๊ฐ๊ฐ ๋ฉ์์ง ๋ธ๋ก์ปค์ ๋ฐฑ์๋ ์ ์ฅ์ ์ญํ ์ ํ๋ค.Celery๋น๋๊ธฐ ์์ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ถ์ฐ ํ์คํธ ํ ์์คํ ์ผ๋ก, ๋ฉ์์ง ๋ธ๋ก์ปค(Message Broker)๋ฅผ ํตํด ์์ ๊ด๋ฆฌProducer (Client)์ฌ์ฉ์๊ฐ ์์ฒญ์ ๋ณด๋Celery๊ฐ ์์ฒญ์ ๋ฐ์ Redis์ ์์ ์ ๋ฑ๋ก(Queue)ํจBroker (Redis)Celery๊ฐ ์คํํด์ผ ํ ์์ ์ ํ(Queue) ํํ๋ก ์ ์ฅWorker๊ฐ ๋๊ธฐํ๋ค๊ฐ ์์ ์ ๊ฐ์ ธ๊ฐ์ ์คํWorker (Celery Worker)Redis์์ ์์ ์ ๊บผ๋ด ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅ์ฌ๋ฌ ๊ฐ์ Worker๊ฐ ๋์์ ์คํ ๊ฐ๋ฅ (๋ณ๋ ฌ ์ฒ๋ฆฌ)Bac.. 2025. 2. 12. Celery๋ฅผ ์ด์ฉํ ํฌ๋กค๋ง ์์ ๊ฐ์Airflow์ Celery๋ฅผ ๋น๊ตํ๋ค. ํฌ๋กค๋ง ๊ด๋ฆฌ Airflow vs Celery๊ฐ์๊ธฐ์กด ํ๋ก์ ํธ์ ํฌ๋กค๋ง ์์คํ ์ Airflow๋ก ๊ด๋ฆฌํ๋ค.Airflow ์ด์ ์ค์ด๋ ์๋ฒ์ ๋ฌธ์ ๊ฐ ๋ง์๋ ๋ฐ, ๊ทธ ์ค์์ ์ ์ผ ํฐ ๋ฌธ์ ๋ cpu ์ ์ ์จ์ด 100์ผ๋ก ์น์์ ๋๊ฐ ๋ง์๋ค๋ ๊ฒ์ด๋ค.Airflow๋ก ์ด์bonory.tistory.com ํฌ๋กค๋ง ์งํ ์, Celery๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๋ ์ ํฉํ๋ค๋ ํ๋จ๊ณผ ํจ๊ป ์์ ๋ฅผ ์์ฑํ๋ค. FastAPI + Celery + requests + BeautifulSoup ๋ฅผ ํ์ฉํ ํฌ๋กค๋ง ์์ ์ ์ํํ๋ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ ์์ ํฌ๋กค๋ง์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๋๋ก ์งํ๊ธฐ๋ณธ ๊ตฌ์กฐFastAPI: ์ฌ์ฉ์๊ฐ API๋ฅผ ํตํด ํฌ๋กค๋ง ์์ฒญ์ ๋ณด๋Celery: ์์ฒญ์ ํ์ ๋ฃ๊ณ , ๋ฐฑ๊ทธ๋ผ์ด๋์์ .. 2025. 2. 5. [python] gRPC ๊ฐ๋จํ๊ฒ ๊ตฌํํด๋ณด๊ธฐ ๋คํธ์ํฌ ํต์ ํ๋กํ ์ฝ gRPC์ websocket์ ๋น๊ตํด๋ณด์๋ค [gRPC] gRPC๊ณผ websocket ๋น๊ต ์ ๋ฆฌ๊ธฐ์กด์ ๊ฐ๋ฐํ๋ ์๋น์ค์์ ํด๋ผ์ด์ธํธ์ ์๋ฒ ํต์ ์ websocket ์ผ๋ก ๊ตฌํํ๋ค.๋ค ๋๋ด๊ณ ๋์ ํด๋ผ์ด์ธํธ, ์๋ฒ ํต์ ํ๋ ๋ฐฉ๋ฒ์ ์ข ๋ ์์นํด๋ณด๊ณ ์ถ์๋ค๊ทธ๋ ๊ฒ ์๊ฒ๋ gRPC. ์ ๋ฆฌํด๋ณด์ โ gRPCbonory.tistory.com ์ต์ํ์ง ์์ gRPC๋ฅผ python์ผ๋ก ๊ฐ๋จํ๊ฒ ๊ตฌํํด๋ณด์๋ค 1. Protocol Buffers (Protobuf) ์ ์gRPC์ ํต์ฌ์ API ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ Protobuf ํ์ผ์ด๋ค!.proto ํ์ผ ์์ฑํ๋ค = ์๋น์ค์ ๋ฉ์์ง์ ์คํค๋ง๋ฅผ ์ ์ํ๋ค greeter.protosyntax = "proto3";service Greeter { rpc Sa.. 2025. 1. 2. [python] PySide6๋ก ์ฌ๋ฆฐ gui๋ก ์๊ฒฉ ์๋ฒ์ ํ์ผ ๋ค์ด๋ก๋ํ๊ธฐ ๊ฐ์์ด๋ฒ์ ์งํํ ํ๋ก์ ํธํด์ 2๊ฐ์ง๋ฅผ ๊ฐ๋ฐํด์ผํ๋ค. 1. ์๊ฒฉ ์๋ฒ์ ์๋ ํ์ผ์ ๋ก์ปฌ์ ๋ค์ด๋ก๋ํด์ผํ๋ค. (ํ์ผ์ด ์ปค์ ์ค๋ ๊ฑธ๋ฆฌ๋, progress bar๋ก ์งํ ์ฌํญ์ ๋ณด์ฌ์ฃผ์)2. PySide6๋ก gui๋ฅผ ์ฌ๋ฆฐ๋ค. 1๏ธโฃ ํ์ผ ๋ค์ด๋ก๋import paramikoimport timedef download_file(hostname, port, username, password, remote_file_path, local_file_path, progress_callback): try: start = time.perf_counter() ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(par.. 2024. 12. 31. [python] Fastapi ์ ํ๋ฆฌ์ผ์ด์ exe ํ์ผ๋ก ๋ฐฐํฌํ๊ธฐ ๊ฐ์์น ์๋น์ค๋ฅผ ์ฝ๋ ๊ณต๊ฐ ์์ด ์ธ๋ถ์์ ์คํํ ์ ์๋๋ก exe ํ์ผ๋ก ๋ณํํ๋ ค ํจํ์ธFastapi ์๋ฒ๋ python์ผ๋ก ์์ฑ๋์ด ์์ผ๋ฏ๋ก pyinstaller ๋ฅผ ์ฌ์ฉํ์ฌ ์คํ ํ์ผ์ ํจํค์งํ๋ ค ํจ์งํ1. main.py ์์ if __name__ == "__main__": ๋ธ๋ก์ผ๋ก ์คํ๋๋ uvicorn ๋ถ๋ฆฌํ๊ธฐ์ด์ pyinstaller๋ application์ ํจํค์งํ ๋ model import ์์์ ์ฐธ์กฐ ๋ฐฉ์์ ์ํฅ์ ๋ฐ์ ์ ์๋ค.if __name__ == "__main__": ๋ธ๋ก์ ์ ์์ ์ผ๋ก ์ธ์ํ์ง ๋ชปํด์ ASGI ์๋ฒ(์ฆ, uvicorn)๋ฅผ ์คํํ์ง ๋ชปํ๋ค.์งํmain.py ์์๋ ๋จ์ํ Fastapi ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ํ๋ ์ญํ ๋ง ํ๊ณ , run_server.py์์ main.py๋ฅผ m.. 2024. 11. 5. [python] socket ๋์ ์ฐ๊ฒฐ ์ต๊ทผ์ ๊ฐ๋ฐํ ๊ธฐ๋ฅ ์ค์ 2๊ฐ์ ๋ก๋ด๊ณผ socket ํต์ ์ด ์์๋ค.2๊ฐ์ ๋ก๋ด์ ๋์์ ์์ฒญ์ด ๋ค์ด๊ฐ๋ฉด 1๋ฒ ๋ก๋ด → 2๋ฒ ๋ก๋ด ์ด๋ ๊ฒ ์์๋๋ก ์งํ๋์ด์๋์์ ์งํ๋๋๋ก ํด๋ณด๋ ค๊ณ ํ๋ค.ํ์ธ๋ฉํฐ์ค๋ ๋ ๋ฐฉ์, ๋น๋๊ธฐ ๋ฐฉ์ ๋๊ฐ์ง๊ฐ ์๋ค.๋ฉํฐ์ค๋ ๋๋ฉํฐ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ ์์ผ ์ฐ๊ฒฐ์ ๋ณ๋์ ์ค๋ ๋์์ ์ฒ๋ฆฌํ์ฌ ๋ ๊ฐ์ ์ฐ๊ฒฐ์ ๋์์ ๊ด๋ฆฌํ ์ ์๋คimport socketimport threading# ์ฒซ ๋ฒ์งธ ์์ผ ์ฐ๊ฒฐ ํจ์def connect_to_robot_a(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('123.123.123.123', 65432)) # ๋ฐ์ดํฐ ์ ์ก ์์ data = "Hello from .. 2024. 10. 22. [python] fastapi ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ์ด๋ฏธ์ง ์ก์ถ ์ด๋ฒ์ ์๋ก ์งํํ ํ๋ก์ ํธ์ ๊ธฐ๋ฅ ์ค ํ๋๋ ์ผ๊ตด ์ธ์์ผ๋ก ํ๋ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ด์๋ค์ผ๊ตด ์ธ์ํ๋ model์ cvteam์์ ๋ฐ์์ ๋๋ ui์ ๊ธฐ๋ฅ๋ง ๊ตฌํํ๋ฉด ๋๋ ์ํฉmain.pyfrom fastapi import FastAPIfrom fastapi.responses import StreamingResponseimport cv2app = FastAPI()def generate_frames(): cap = cv2.VideoCapture(0) while True: success, frame = cap.read() if not success: break ret, buffer = cv2.imencode('.jpg', frame) .. 2024. 10. 21. ์ด์ 1 2 ๋ค์