251202 [ Day 99 ] - Project (21)

TaeHyun·2025년 12월 2일

TIL

목록 보기
117/184

시작하며

오늘은 서버와 아두이노 간의 연동 문제를 해결하기 위해 이것저것 시도를 해보았다.

아두이노 연동

처음에는 기존 수정을 했었던 /api/relay/control 엔드포인트를 아두이노에서 요청하면 가공해둔 JSON 값을 아두이노에서 바로 받을 수 있을 거라 생각을 했었는데 많은 문제가 있었다.
크게 정리해보면 이렇게 된다.

  • 아두이노 와이파이 모듈 버퍼 오버플로우
  • JSON 파싱 오류

버퍼 오버플로우

채널 4개에 대한 딕셔너리 값이 오버플로우가 걸릴지는 생각도 못 했었는데, 먼저 시도해본 것은 아두이노에서 딜레이를 사용해 천천히 불러오는 것이었다. 원하는 결과는 얻지 못했지만 파일이 깨지긴 했지만 무엇인가 출력은 되기 시작했다.
서버에서 전달 데이터를 더 줄이기 위해 Flask의 make_response를 사용해서 헤더 부분을 다 지워도 보았다. 하지만 그래도 데이터의 일부만 출력이 되었다.
그래서 어쩔 수 없이 딕셔너리에서 리스트를 전달하는 방향으로 수정을 해보았는데, 그래도 데이터가 여전히 컸다.
이것저것 시도해본 끝에 마지막 수단으로 생각했던 문자열에 0과 1로 정보를 전달하는 방향으로 수정을 해보았는데, 다행히 원하는 결과가 출력되었다.

@relay_bp.route("/api/relay/control", methods=["GET"])
def control_relay():
    # DB 최신 상태 조회
    current_status, message, status_code = get_current_relay_status()
    if current_status is None:
        return jsonify({"message": message}), status_code

    # 결과 가공
    result = "".join("1" if current_status.get(ch) == "on" else "0" for ch in ["A", "B", "C", "D"])

    print("\n릴레이 제어 : DB 상태 응답 전송")
    response = make_response(result)
    response.headers.clear()

    return response

JSON 파싱 오류

서버에서 0과 1로 조합된 4자리 문자열을 반환하기 때문에 순서대로 A, B, C, D를 0이면 HIGH, 1이면 LOW로 파싱을 해주었다.

마치며

이제 내일 로컬 테스트한 서버를 배포 테스트 한 뒤 웹 연동까지 진행하면 발표 준비만 하면 끝날 것 같다.

profile
Hello I'm TaeHyunAn, Currently Studying Data Analysis

0개의 댓글