MQTT

아두이노에서 실시간으로 MQTT 메시지를 받을수 있을까요?

룬휘 2025. 2. 2. 02:01

아두이노 보드와 Type1SC 내장형 모뎀으로 실시간 MQTT 수신메시지 처리를 어떻게 구현해야 할 수 있는지 알고 싶다는 

질문을 받았습니다. 

 

예전에 Arduino + ESP32로 만든 프로젝트가 있어서 소개해 줬습니다. 

https://codezoo.tistory.com/28 

 

CATM1, PPPOS, MQTT로 실외 MCU 디바이스 제어

주의>해당 내용은 experimental한 작업입니다. 코드주에서 장비 제어와 해킹에 따른 책임을 지지 않습니다.공개한 개발 리소스는 디바이스 동작에 대한 완결성을 확보했다고 보장할 수 없고 상용 

codezoo.tistory.com

 

현재 사용하는 Arduino Board가 Nano Every 보드라 다른 방법이 없는지 알려 달라고 하셔서,

가장 기본적인 MQTT통신 시퀀스부터 정리 했습니다. 

https://docs.arduino.cc/hardware/nano-every/#tech-specs

 

https://docs.arduino.cc/hardware/nano-every/#tech-specs

With a length of 45 mm and a width of 18 mm the Nano Every is Arduino's smallest board and weighs only 5 grams.

docs.arduino.cc

 

Host, FW, MQTT Broker로 구성됩니다. 

 

여기서 Host는 Arduino Nano Every 입니다. FW는 LTE CATM1 내장형 모뎀입니다. MQTT Broker는 MQTT통신을 위한 서버입니다. (브로커의 Role로 움직이는데, MQTT통신에 대해서 조금 더 살펴봐야 할 필요가 있습니다.)

https://yeti.tistory.com/258

 

MQTT란, IoT용 message broker 선택하기

안녕하세요. yeTi입니다. 오늘은 MQTT에 대해서 알아보고 사용할 수 있는 broker를 알아보려고 합니다. MQTT란 MQTT는 사물인터넷(IoT)을위한 프로토콜로 OASIS(Organization for the Advancement of Structured Informatio

yeti.tistory.com

 

일단 CodeZoo Arduino 오픈소스 라이브러리로 기본적인 MQTT접속, MQTT구독, MQTT발행, MQTT구독중지, MQTT접속해제 는 모두 구현되어 있습니다. 

https://github.com/codezoo-ltd/TYPE1SC/blob/main/TYPE1SC.h

 

TYPE1SC/TYPE1SC.h at main · codezoo-ltd/TYPE1SC

Murata TYPE1SC Cat.M1 Arduino Library & example. Contribute to codezoo-ltd/TYPE1SC development by creating an account on GitHub.

github.com

/*
 * Set Change MQTT Event functionality. (0-1)
 */
int setMQTT_EV(int value);

/*
 * Set MQTT Client ID & Connection Address.
 */
int setMQTT_NODES(char *client_id, char *mqtt_addr);

/*  
 * Set MQTT Client ID & Connection Address & User ID & Password
 */
int setMQTT_NODES(char *client_id, char *mqtt_addr, char *mqtt_user, char *mqtt_pass);

/*  
 * Set MQTT Client ID & Connection Address & User ID & Password
 */
int setMQTT_NODES(char *client_id, char *mqtt_addr, char *mqtt_user);

/*
 * Set MQTT Session Timeout. (1 - 65535, Default 600 sec)
 */
int setMQTT_TIMEOUT(uint32_t value);

/*
 * MQTT Server Connect
 */
int MQTT_Connect(void);

/*
 * MQTT Server DisConnect
 */
int MQTT_DisConnect(void);

/*
 * MQTT Subscribe Topic
 * qos : 0 - at most one delivery (default)
 *       1 - Delivered at least once
 *       2 - Exactly one delivery
 */
int MQTT_SUBSCRIBE(int qos, char *topic);

/*
 * MQTT UnSubscribe Topic
 */
int MQTT_UnSUBSCRIBE(char *topic);

/*
 * MQTT Publish Topic
 * qos : 0 - at most one delivery (default)
 *       1 - Delivered at least once
 *       2 - Exactly one delivery
 */
int MQTT_Publish(int qos, char *topic, int szData, char *Data);

 

개발자가 직접 AT커맨드를 호출, 조합, 파싱해야 하는 불편함은 없지만,

MQTT 메시지 수신 실시간 처리에 대한 부분은 구현되어 있지 않습니다. 

이 부분을 구현하려면 현재 구현한 코드 내용 중 필요한 부분을 가져와서 다시 구현해야 합니다. 

https://github.com/codezoo-ltd/TYPE1SC/blob/main/TYPE1SC.cpp

MQTT_Publish에서는 구독한 Topic에 HOST 데이터를 Topic에 Publish한 후 Recv를 20초 동안 대기하면서 "PUBRCV",1로 반환된 문자열이 있는지 체크합니다. 해당 문자열이 발견되었다면 보낸 데이터 사이즈와 Recv 된 데이터 사이즈가 동일한지 체크해서 정상 송신했는지 체크합니다.(쉼표 세개를 건너 띈 다음의 값(받은 데이터 사이즈)을 읽어서 보낸 데이터 사이즈와 비교)

 

이제 외부에서 실시간으로 TOPIC이 발행되고 모뎀(FW)에서 구독하는 시퀀스입니다.

 

모뎀(FW)은 MQTT 브로커에 접속 후 TopicName을 구독한 상태입니다. MQTT 브로커에 접속 후 TopicName을 구독한 PC에서 11111을 발행 했습니다.

 

모뎀은 MQTT 브로커에 접속한 상태이고 TopicName을 구독한 상태라 PC에서 발행한 11111을 수신했습니다.

다음과 같은 실시간 이벤트 스트링이 모뎀(FW)에서 출력됩니다.

%MQTTEVU:"PUBRCV",1,0,"TopicName",5
11111

 

이제 실시간 처리가 명확해졌습니다. HOST에서는 위와 같은 형식의 실시간 수신 메시지를 처리할 수 있는 loop를

만들어서 두줄로 들어오는 (이벤트 메시지+ 실제 데이터)를 파싱 하면 됩니다. 

 

LTE-CATM1 내장형 모뎀 대량 구매 상담, 외주 개발, 협업 문의
(주)코드주
장병남 대표 010-8965-1323 rooney.jang@codezoo.co.kr

 

 

LTE-CatM1 내장형 모뎀 / 사물인터넷 통신모듈

사물인터넷 개발을 위한 LTE 모듈입니다. / CodeZoo / 사물인터넷 통신모듈 / 유심은 상품상세의 링크에서 별도 구매가 필요합니다.

www.devicemart.co.kr

 

iot유심 : codezoo

[codezoo] IoT Global SIM, IoT Connectivity, IoT Device

smartstore.naver.com