센서 텔레메트리 2.0.1: Azure IoT Hub를 활용한 고급 온도 모니터링
센서 텔레메트리 2.0.1은 MCP9808 센서에서 실시간 온도 데이터를 마이크로소프트 Azure IoT Hub로 전송합니다. 시스템은 Azure Stream Analytics로 텔레메트리를 처리하고, Azure SQL에 결과를 저장하며, Windows Universal 모바일 앱으로 히스토리를 시각화합니다. 2017년 5월 17일 업데이트.
스토리
업데이트: 센서 텔레메트리가 리마스터되어 2.0.1로 이름이 변경되었습니다.
소개
개요
이 프로젝트는 라즈베리파이에서 고정밀 MCP9808 온도 센서를 읽고, 텔레메트리를 Azure IoT Hub로 전송하고, Stream Analytics로 데이터를 처리하고, Azure SQL에 읽기 값을 저장하는 방법을 보여줍니다. UWP 모바일 앱은 센서 히스토리를 표시하고 SignalR을 통해 원격 제어를 허용합니다.
애플리케이션
두 개의 UWP 앱이 코드의 ~99%를 공유합니다: 하나는 라즈베리파이(IoT 측)에서, 다른 하나는 PC(클라이언트 측)에서 실행됩니다. IoT 앱은 센서 데이터를 IoT Hub와 SignalR로 전송하고, 클라이언트 앱은 SignalR을 구독해 실시간 업데이트를 받으며 장치로 명령을 다시 보낼 수 있습니다.
기술 스택
코드베이스는 Prism(Prism.Unity for IoC)과 Prism.Event를 사용해 느슨하게 결합된 이벤트 시스템으로 MVVM 패턴을 따릅니다. SignalR이 앱 인스턴스 간 실시간 통신을 담당합니다.
아키텍처
핵심 MCP9808 라이브러리는 재사용 가능한 UWP 구성 요소입니다. 클라이언트 앱에서 View는 ViewModel과 쌍을 이루며, 설정, 디버그 로그, 센서 데이터를 처리하는 세 개의 리포지토리가 있습니다. Mcp9808TemperatureRepository는 읽기 값이 변경될 때만 온도 변경 이벤트를 발행합니다. 백그라운드 서비스는 텔레메트리, 타이머, 알림 핀 모니터링, LED 제어, 푸시 버튼 처리, 알림 릴레이, 디버그 로깅을 담당합니다.
텔레메트리 서비스: 온도 변경 감지 시 Azure Service Bus Event Hub로 메시지 전달.
타이머 서비스: 500ms 틱 발행; UI 시간 표시 및 센서 폴링(1초 간격)에 사용.
알림 핀 모니터링 서비스: MCP9808 알림 핀의 GPIO 변경 감지 및 이벤트 발행.
LED 서비스: 온도 알림에 따라 LED 제어.
푸시 버튼 모니터링 서비스: GPIO 푸시 버튼을 통한 수동 알림 리셋 처리.
알림 릴레이 서비스: 내부 이벤트를 SignalR 메시지로 매핑해 앱 간 통신 가능.
디버그 콘솔 서비스: 디버깅 이벤트 수집 및 UI 노출.
애플리케이션 초기화: 앱이 StartPage를 실행해 서비스 부트스트랩 후 메인 뷰로 이동.
시작하기
회로 요구사항
- 대형 솔더리스 브레드보드 (Vilros T자형 코블러 옵션)
- MCP9808 브레이크아웃 (Adafruit)
- LED 4개, 220Ω 저항, 10kΩ 풀업 저항, 모멘터리 푸시 버튼
조립
- LED를 GPIO 18(파랑), 23(초록), 12(빨강), 16(노랑)에 220Ω 저항으로 3.3V에 연결.
- MCP9808: VDD→3.3V, GND→GND, SCL→GPIO 5, SDA→GPIO 3, ALERT→GPIO 6, 풀업 10kΩ to 3.3V.
- 푸시 버튼: 한 쪽을 GPIO 5, 다른 쪽을 GND에 연결, 풀업 10kΩ to 3.3V.
완성된 브레드보드 사진은 아래 갤러리에서 확인 가능합니다.
Microsoft Azure 요구사항
azure.com에서 무료 Azure 계정(USD 200 크레딧) 생성. portal.azure.com에 로그인.
Azure IoT Hub 설정
- 새로 만들기 → Internet of Things → IoT Hub
- 고유 이름, 구독, 리소스 그룹(새로 만들기), 위치(동일 리전)
- 가격 티어: F1 무료 (계정당 단일 무료 티어)
- 배포 대기 후 허브 개요 검토.
디바이스 생성
- GitHub에서 Azure IoT SDK for C# 다운로드 후 Visual Studio에서 DeviceExplorer 열기.
- IoT Hub 연결 문자열 붙여넣기 (허브 > 공유 액세스 정책 > iothubowner).
- 자동 생성 키로 디바이스 생성 (예: TemperatureDevice1).
Azure SQL Database 설정
- SQL Databases → 추가 → 이름: SensorTelemetry.
- 기존 리소스 그룹 사용; 고유한 이름, 관리자 사용자명/비밀번호, Basic 티어, 동일 리전으로 새 서버 생성.
- 방화벽에서 본인 IP 허용 구성.
데이터베이스 테이블 생성
- Visual Studio에서 SQL Server Object Explorer 열고 Azure SQL 서버에 연결.
- 제공된 CREATE TABLE 스크립트 실행해
SensorReadings 테이블 생성.
App Service Plan & Mobile App 생성
- App Service plans → 새로 만들기, 이름, 기존 리소스 그룹, 위치, Basic 티어 B1.
- 새로 만들기 → Web+Mobile → Mobile App, 이름, 구독, 기존 리소스 그룹, 선택한 App Service plan.
Azure Stream Analytics 설정
- 새로 만들기 → Data + Analytics → Stream Analytics Job.
- 입력을 IoT Hub로, 출력을 Azure SQL 테이블로 구성.
- 쿼리 사용: SELECT [TimestampUtc], Source, Temperature, IsCritical, IsAboveUpperThreshold, IsBelowLowerThreshold INTO [YourOutputAlias] FROM [YourInputAlias];
- 작업 시작.
소프트웨어 구성
저장소 링크에서 소스 다운로드 후 Visual Studio에서 솔루션 열기.
모바일 앱 게시
- 웹 프로젝트 우클릭 → 게시 → Microsoft Azure App Service → 본인의 App Service 선택.
- Azure SQL 연결 문자열(ADO.NET) 복사해 프로젝트의
MS_TableConnectionString에 붙여넣고 사용자명/비밀번호 업데이트.
- 게시; 웹 사이트 자동 실행.
IoT Hub 자격 증명 입력
- UWP 프로젝트의
App.xaml에서 {YOUR CONNECTION STRING HERE}를 Device Explorer의 디바이스 연결 문자열로 교체.
{YOUR DEVICE ID HERE}를 생성한 디바이스 ID로 교체.
모바일 앱 URL 입력
UnityConfiguration.cs에서 Azure 포털에서 복사한 App Service URL을 {YOUR MOBILE SERVICES URL HERE}에 붙여넣기.
자세한 지침은 전체 센서 텔레메트리 2.0.1 문서 참조.