오늘은 서버와 아두이노 간의 연동 문제를 해결하기 위해 이것저것 시도를 해보았다.
처음에는 기존 수정을 했었던 /api/relay/control 엔드포인트를 아두이노에서 요청하면 가공해둔 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
서버에서 0과 1로 조합된 4자리 문자열을 반환하기 때문에 순서대로 A, B, C, D를 0이면 HIGH, 1이면 LOW로 파싱을 해주었다.
이제 내일 로컬 테스트한 서버를 배포 테스트 한 뒤 웹 연동까지 진행하면 발표 준비만 하면 끝날 것 같다.