MQTT · 2026-05-12

Flutter 앱에서 MQTT로 실시간 IoT 제어하기

Flutter 앱을 통해 MQTT 기반 실시간 IoT 장비 제어의 원리와 구현 절차, 코드 예제, 모바일 고려사항을 초보자 관점에서 정리한 설명

작성일 : 2026-05-12 ㆍ 작성자 : 관리자
post
목차

개요

모바일 환경에서 IoT 장비를 실시간으로 제어하려면 경량 메시지 프로토콜이 유리하다. MQTT는 저전력, 낮은 대역폭 환경에서 안정적이다. 이 글은 Flutter 앱에서 MQTT를 연결하고 구독·발행하는 과정과 실제 앱 적용 시 유의점을 중심으로 설명한다. 초보자도 따라할 수 있도록 단계별로 정리한다.

MQTT 기본 개념

브로커와 클라이언트

MQTT는 브로커(서버)와 여러 클라이언트로 구성된다. 브로커는 메시지 라우팅을 담당한다. 클라이언트는 메시지를 발행(publish)하거나 구독(subscribe)한다.

토픽과 QoS

토픽은 메시지 라우팅의 경로다. 예: house/livingroom/light. QoS는 전송 보장 수준으로 0, 1, 2가 있다. 모바일에서는 네트워크 불안정에 대응해 QoS 1을 주로 사용한다.

환경 준비

필수 도구

  • Flutter SDK
  • mqtt_client 패키지
  • 테스트 브로커(예: Mosquitto 또는 public broker)

pubspec.yaml에 패키지 추가

dependencies:
  flutter:
    sdk: flutter
  mqtt_client: ^9.6.0
  mqtt_server_client: ^9.6.0

Flutter MQTT 기본 예제

아래 예제는 브로커에 연결하고, 토픽을 구독한 뒤 버튼으로 메시지를 발행하는 흐름을 담고 있다. 실무에서는 에러 처리와 재접속 로직을 보강해야 한다.

간단한 연결·구독·발행 코드

import 'package:mqtt_client/mqtt_client.dart';
import 'package:mqtt_client/mqtt_server_client.dart';

Future<void> connectAndSubscribe() async {
  final client = MqttServerClient('test.mosquitto.org', 'flutter_client_123');
  client.logging(on: false);
  client.keepAlivePeriod = 20;
  client.onDisconnected = () {
    print('브로커 연결 끊김');
  };

  final connMess = MqttConnectMessage()
      .withClientIdentifier('flutter_client_123')
      .startClean();
  client.connectionMessage = connMess;

  try {
    await client.connect();
  } catch (e) {
    client.disconnect();
    return;
  }

  if (client.connectionStatus?.state == MqttConnectionState.connected) {
    print('브로커 연결 성공');
    const topic = 'home/livingroom/light';
    client.subscribe(topic, MqttQos.atLeastOnce);

    client.updates?.listen((List<MqttReceivedMessage<MqttMessage>> c) {
      final recMess = c[0].payload as MqttPublishMessage;
      final pt = MqttPublishPayload.bytesToStringAsString(recMess.payload.message);
      print('수신 토픽: ' + c[0].topic + ', 메시지: ' + pt);
    });

    // 메시지 발행 예시
    final builder = MqttClientPayloadBuilder();
    builder.addString('ON');
    client.publishMessage(topic, MqttQos.atLeastOnce, builder.payload!);
  } else {
    print('연결 실패: ${client.connectionStatus}');
    client.disconnect();
  }
}

코드 설명

  • 브로커 주소와 클라이언트 ID를 설정한다.
  • MqttConnectMessage로 연결 옵션을 지정한다.
  • 연결 성공 시 subscribe로 토픽을 등록한다.
  • updates 스트림으로 수신 메시지를 처리한다.
  • MqttClientPayloadBuilder를 통해 발행(payload)을 만든다.

모바일 특성 고려사항

백그라운드와 연결 유지

모바일에서는 앱이 백그라운드로 가거나 네트워크가 변경될 때 연결이 끊긴다. 이를 대비해 재접속 로직과 상태 복구가 필수다. 플랫폼별 백그라운드 작업 정책을 확인한다.

배터리와 데이터 사용량

keepAlive 주기와 QoS 수준을 조절해 배터리와 데이터 사용을 최적화한다. 짧은 keepAlive는 연결 유지를 위한 트래픽을 늘린다. 상황에 맞게 균형을 맞춘다.

보안과 인증

TLS와 사용자 인증

공개 브로커 대신 자체 브로커나 클라우드 브로커를 운영할 때 TLS를 적용한다. mqtt_client는 보안 연결을 지원한다. 인증은 사용자명/비밀번호 또는 토큰 방식이 권장된다.

권한 분리

토픽 설계 시 권한을 분리한다. 기기별 토픽 구조를 통해 불필요한 데이터 노출을 막는다. 예: devices/{deviceId}/control 와 devices/{deviceId}/status.

실전 적용 팁

  • 테스트 시 public broker로 시작하되, 운영은 인증과 TLS 적용.
  • 앱 네트워크 이벤트를 감지해 재연결을 시도하도록 구현.
  • 메시지 크기를 최소화해 모바일 데이터 부담을 줄임.
  • MQTT 토픽 명명 규칙을 일관되게 유지.
  • 로그는 디버그 시에만 활성화해 성능 영향을 제한.

마무리

Flutter로 모바일 앱과 IoT 장비를 연결하는 과정은 비교적 간단하다. mqtt_client를 이용하면 연결, 구독, 발행 흐름을 빠르게 구성할 수 있다. 다만 모바일 특유의 연결 불안정과 배터리 제약을 고려해 재접속과 데이터 최적화를 설계해야 한다. 이 글의 예제는 flutter mqtt 예제와 flutter mqtt client 사용법을 이해하는 출발점이다. 모바일 mqtt flutter 연동을 실무에 적용할 때는 보안과 토픽 설계를 우선적으로 검토한다.

flutter mqtt 예제 flutter mqtt client 사용법 모바일 mqtt flutter 연동 mqtt_client IoT 제어 MQTT 보안 실시간 통신 Flutter 네트워크