Processor

아파치 웹(Web)에서 소켓을 이용한 라즈베리파이 LED On/Off 제어하기

작성자 임베디드코리아 작성일26-06-04 00:32 조회72회 댓글0건
< 웹(Web)에서 소켓을 이용한 라즈베리파이 LED 제어>
◆ 아파치 웹서버와 파이썬 Soket.io 서버를 구성한다.
◆ 라즈베리파이에 파이썬을 이용한 Soket.io 서버를 실행한다.
◆ 아파치 웹서버의 'index.html'에 Socket 클라이언트로 구성하여 브라우저로 접속하여 실행한다.

( 1 ) RaspberryPI 에서 python 소스를 작성하여 실행한다.
■ flask 설치하기
$ pip install flask flask-socketio eventlet

■ 파이썬 소스 코드 작성
    : Soket.io 서버
 ---< flask_Socket-LED.py >-----------------------------------------------
from flask import Flask
from flask_socketio import SocketIO
from flask import request
try:
    import RPi.GPIO as GPIO
except (ImportError, RuntimeError):
    from mockgpio import GPIO  # 인스턴스를 직접 가져옴
# GPIO 초기화
LED_PIN = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)
# Flask 및 SocketIO 설정
app = Flask(__name__)
socketio = SocketIO(app, cors_allowed_origins="*", async_mode="eventlet")
# 현재 LED 상태 반환 함수
def get_led_state():
    return "on" if GPIO.input(LED_PIN) else "off"
# 클라이언트로부터 제어 요청 수신
@socketio.on("led_control")
def control_led(data):
    state = data.get("state")
    if state == "on":
        GPIO.output(LED_PIN, GPIO.HIGH)
    elif state == "off":
        GPIO.output(LED_PIN, GPIO.LOW)
    # 상태 응답
    state = get_led_state()
    print(f"led 상태 : {state}")
    socketio.emit("led_status", {"state": state}, room=request.sid)
# 초기 상태 요청 처리
@socketio.on("get_led_status")
def handle_status_request():
    state = get_led_state()
    print(f"led 상태 : { get_led_state()}")
    socketio.emit("led_status", {"state": state}, room=request.sid)
# 서버 실행
if __name__ == "__main__":
    socketio.run(app, host="0.0.0.0", port=5000) 
----------------------------------------------------------------------------------------------------------------
▶ host="0.0.0.0" : 라즈베리파이 IP (RaspBerryPI 가 Server 임)

( 2 ) PC 등 다른 기기에서 아파치 웹 서버를 설치하고,
        'index,html'를 다음과 같이 수정한다.

---< index.html  >-----------------------------------------------------
<!DOCTYPE html>
<html>
<head>
  <meta  charset=utf-8">
  <title>LED 제어</title>
  <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  <script src="https://cdn.socket.io/4.0.0/socket.io.min.js"></script>
</head>
<body>
  <h3>LED 제어</h3>
  <label><input type="radio" name="led" value="on"> ON</label>
  <label><input type="radio" name="led" value="off"> OFF</label>
  <p id="status">LED 상태: 알 수 없음</p>

  <script>
    const socket = io("http://라즈베리파이_IP:5000");
    socket.on("connect", function() {
      socket.emit("get_led_status");
    });

    socket.on("led_status", function(data) {
      $("#status").text("LED 상태: " + data.state);
      $("input[name='led'][value='" + data.state + "']").prop("checked", true);
    });

    $("input[name='led']").change(function() {
      const state = $(this).val();
      socket.emit("led_control", { state: state });
    });
  </script>
</body>
</html>
-----------------------------------------------------------------------------------
▶ const socket = io("http://라즈베리파이_IP:5000");
    --> 라즈베리파이가 서버이므로 라즈베리파이 IP를 사용한다.