[IOT-012][실무] 센서 값이 화면에 보이기까지 만들기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[IOT-012][실무] 센서 값이 화면에 보이기까지 만들기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 32회 작성일 26-09-06 21:35

본문

[이번 수업]
가짜 온도 측정값을 검증하고 메시지로 저장한 뒤 대시보드에 표시하는 로컬 프로젝트를 완성합니다. 실제 장비나 외부 서버는 사용하지 않습니다.

[선수지식]
IOT-011의 엣지 컴퓨팅 개념과 JSON, Python 실행 방법을 알면 좋습니다.

[학습목표]
1. 측정·검증·전송·저장·표시 단계를 설명합니다.
2. 단위와 시각이 분명한 센서 메시지를 설계합니다.
3. 중복과 누락을 고려해 대시보드 값을 계산합니다.

[핵심개념]
IoT는 센서가 현실의 상태를 숫자로 바꾸고 프로그램이 활용하는 구조입니다. 흐름은 측정 → 검증 → 메시지 생성 → 전송 → 저장 → 시각화 순서입니다. 실패를 추적하려면 측정 시각과 장치 식별자를 남깁니다.

메시지에는 device_id, measured_at, sequence, temperature_c를 둡니다. 시각은 시간대가 포함된 RFC 3339 형식, 값 이름은 단위가 드러나게 씁니다. device_id와 sequence 조합은 중복 판별 키가 됩니다.

MQTT는 발행/구독 메시징 표준입니다. QoS 1은 한 번 이상 전달하므로 중복될 수 있습니다. 저장 전에 중복을 제거하고, 연결이 끊기면 로컬 버퍼에 보관합니다. 대시보드에는 마지막 측정 시각과 지연 상태도 표시합니다.

[따라하기]
빈 폴더에 iot_pipeline.py를 만들고 아래 코드를 저장합니다. 표준 라이브러리만 사용합니다.

```python
import json
from pathlib import Path

samples = [21.4, 21.8, 22.1]
messages = []
for seq, value in enumerate(samples, 1):
    if not -40 <= value <= 85:
        raise ValueError("센서 범위를 벗어났습니다")
    messages.append({
        "device_id": "lab-sensor-01",
        "measured_at": f"2026-09-06T12:00:0{seq}Z",
        "sequence": seq,
        "temperature_c": value,
    })

Path("telemetry.jsonl").write_text(
    "".join(json.dumps(m, ensure_ascii=False) + "\n" for m in messages),
    encoding="utf-8",
)
values = [m["temperature_c"] for m in messages]
average = sum(values) / len(values)
page = f"""<!doctype html><html lang='ko'><meta charset='utf-8'>
<title>센서 현황</title><h1>실습 센서 현황</h1>
<p>수집 {len(values)}건</p>
<p>평균 {average:.1f}°C · 최저 {min(values):.1f}°C · 최고 {max(values):.1f}°C</p>
</html>"""
Path("dashboard.html").write_text(page, encoding="utf-8")
print(f"{len(values)}건 평균 {average:.1f}°C 범위 {min(values):.1f}~{max(values):.1f}°C")
```

macOS와 Linux에서는 `python3 iot_pipeline.py`, Windows에서는 `py iot_pipeline.py`를 실행합니다. 예상 결과는 `3건 평균 21.8°C 범위 21.4~22.1°C`입니다. 같은 폴더의 telemetry.jsonl에는 한 줄에 한 메시지가 저장되고, dashboard.html을 브라우저로 열면 수집 건수와 요약값이 보입니다.

[흔한 실수]
단위를 생략하면 값을 다르게 해석할 수 있고, 시간대 없는 시각은 순서를 헷갈리게 합니다. 비정상값을 평균에 넣지 말고 마지막 측정 시각과 지연 기준도 관리하세요.

[보안 주의]
본인 소유의 로컬·격리 환경과 가짜 데이터만 사용합니다. 장치별 고유 신원과 자격증명을 쓰고, 실제 전송은 TLS로 보호합니다. 비밀은 코드·로그에 넣지 말고 권한을 최소화하세요. 명령과 측정 경로를 분리하고 업데이트 서명을 검증합니다.

[직접 해볼 과제]
humidity_percent와 0~100 검증을 추가하세요. 같은 device_id와 sequence를 복제해 중복 제거도 구현하고, 마지막 측정이 5분 넘게 오래되면 `데이터 지연`을 표시합니다.

[확인문제]
1. 센서 메시지에 단위와 시간대를 함께 기록해야 하는 이유는 무엇인가요?
2. MQTT QoS 1 메시지를 저장할 때 중복 제거가 필요한 이유는 무엇인가요?
3. 대시보드에서 평균값 외에 마지막 측정 시각을 보여줘야 하는 이유는 무엇인가요?

[다음 학습]
이 수업으로 216개 핵심 과정을 마칩니다. 다음부터는 공식 표준·안정 릴리스·누락된 선수지식을 기준으로 확장 과정을 진행합니다.

[공식 참고 자료]
MQTT Version 5.0 OASIS 표준
https://docs.oasis-open.org/mqtt/mqtt/v5.0/mqtt-v5.0.html

NISTIR 8259 IoT 기기 사이버보안 기본 활동
https://csrc.nist.gov/pubs/ir/8259/final

NISTIR 8259A IoT 기기 사이버보안 기능 기준
https://csrc.nist.gov/pubs/ir/8259/a/final

RFC 3339 인터넷 날짜와 시각 형식
https://www.rfc-editor.org/rfc/rfc3339.html

W3C Web of Things Architecture 1.1
https://www.w3.org/TR/wot-architecture11/

Python json 공식 문서
https://docs.python.org/3/library/json.html

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
3,901
어제
6,862
최대
16,772
전체
769,852
Copyright © 소유하신 도메인. All rights reserved.