MQTT-Reactive는 리암 빈들(Liam Bindle)의 MQTT-C 라이브러리 기반 경량 논블로킹 MQTT v3.1.1 클라이언트. 반응형 임베디드 시스템 설계, 어떤 C 기반 애플리케이션에도 통합 가능한 이식성 있는 이벤트 드리븐 통신 스택 제공.
이 글에서 먼저 반응형 시스템 정의, 그 후 동시성과 상태 기반 행동 포용하는 소프트웨어 아키텍처 개요. 마지막으로 구체적 예시 - 철도 회사용 IoT 기기 - 로 상태 머신과 이벤트 드리븐 패러다임으로 MQTT-Reactive 활용법 시연.
반응형 시스템 정의
반응형 시스템은 내부/외부 이벤트 응답, 이벤트 처리, 다음 트리거 대기하며 유휴 상태 복귀. 이 이벤트 드리븐 패러다임이 예측 가능하고 유지보수 용이한 코드 산출, 특히 여러 활성 객체(동시성 단위)가 별도 이벤트 스트림 처리할 때.
케이스 스터디: 철도 IoT 기기
케이스 스터디 기기 수행 작업:
여러 디지털 입력 변화 감지·로깅
다중 아날로그 신호 획득·필터링·저장
저장 데이터 주기적 원격 서버 전송
GSM 경유 MQTT로 브로커와 데이터 교환
MQTT 선택 이유: 경량 발행/구독 모델, GSM 같은 저대역폭·고지연 링크에 이상적.
기기 펌웨어가 반응형 시스템으로 구축돼 기존 MQTT-C 라이브러리 이벤트 통해 비동기 통신하도록 개조 필요. 결과 라이브러리 MQTT-Reactive가 상태 머신에서 호출 가능하면서 나머지 시스템 디커플링 유지하는 깔끔한 API 노출.
상태 머신: MqttMgr 활성 객체
MQTT-Reactive는 MqttMgr 활성 객체로 구동, 그림 1 상태 머신으로 동작 기술. 머신 WaitingForNetConnection서 시작, 네트워크 링크 사용 가능해지면 WaitingForSync 전이, 여기서 CONNECT와 PUBLISH 패킷 스테이징 가능. Sync서 도착 이벤트들 시스템이 수용 상태 재진입할 때까지 연기.
매 SyncTime 밀리초마다 머신 Sync 복합 상태로 이동, 네트워크 매니저에 Receive와 Send 이벤트 포스팅. 예시가 CONNECT와 PUBLISH 다루지만 SUBSCRIBE 지원 확장은 직관적.
상태 머신 액션들이 params 키워드로 이벤트 데이터 읽고 GEN() 매크로로 나가는 이벤트 생성. 예:
상태 머신은 일반 C나 C++로 다음 도구들 중 하나로 코딩 가능: RKH 프레임워크, QP 프레임워크, 야킨두(Yakindu) Statechart 툴, 래쇼날 랩소디(Rational Rhapsody) Developer. 모두 Statecharts와 C/C++ 코드 생성 지원.
MqttMgr 활성 객체가 모든 MQTT-Reactive 호출 캡슐화, 나머지 시스템이 직접 API 사용 안 하도록 차폐. 동시성은 이벤트 교환으로 달성, 세마포어, 뮤텍스, 지연, 이벤트 플래그 함정 제거.
MqttMgr 속성들 구조체에 직접 저장:
struct MqttMgr {
struct mqtt_client client; // MQTT 클라이언트 인스턴스
LocalRecvAll localRecv; // 로컬 수신 버퍼
/* 추가 데이터 항목들 */
};
이 멤버들 me 포인터로 접근:
mqtt_recvMsgError(&me->client, &me->localRecv);
표 1. MqttMgr 속성들
전체 시스템 3개 핵심 액터 포함: Collector(데이터 발행), NetMgr(네트워크 관리), MqttMgr(MQTT 관리).
그림 2. IoT 시스템 구조 초안 (출처: VortexMakes)
그림 3 시퀀스 다이어그램이 MqttMgr이 MQTT 브로커와 세션 개시 시 플로우 보여줌.
그림 3. MQTT 브로커 연결 (출처: VortexMakes)
네트워크 성공적 수립 후 Collector가 Connect(clientId, keepAlive) 전송. 브로커가 ConnAccepted 또는 ConnRefused 회신, 후자는 MQTT v3.1.1 §3.2.2.3 per 거부 코드 운반.
그림 4. 브로커가 연결 요청 거부 (출처: VortexMakes)
발행도 유사 패턴. Collector가 Publish(data, size, topic, qos) 이벤트 발행. 데이터 페이로드(일반적 JSON)는 경량 jWrite 라이브러리로 조립.
그림 5. 브로커 데이터 발행 (출처: VortexMakes)
네트워크 실패는 NetMgr이 ReceiveFail 또는 SendFail 이벤트로 신호, MqttMgr이 적절히 반응 가능.
그림 6. 네트워크 실패 (출처: VortexMakes)표 2. 시나리오 관여 이벤트들
결론
MQTT-Reactive를 활성 객체로 캡슐화하고 이벤트로 통신 오케스트레이션함으로써 블로킹 구조물 제거, 깔끔하고 테스트 가능한 설계 산출. 상태 머신 모델이 다중 동시 태스크로 확장 가능, 신뢰할 수 있는 MQTT 연결 요구하는 현대 반응형 임베디드 애플리케이션에 적합.