-
아두이노에서 실시간으로 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통신에 대해서 조금 더 살펴봐야 할 필요가 있습니다.)
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.krLTE-CatM1 내장형 모뎀 / 사물인터넷 통신모듈
사물인터넷 개발을 위한 LTE 모듈입니다. / CodeZoo / 사물인터넷 통신모듈 / 유심은 상품상세의 링크에서 별도 구매가 필요합니다.
www.devicemart.co.kr
iot유심 : codezoo
[codezoo] IoT Global SIM, IoT Connectivity, IoT Device
smartstore.naver.com
'MQTT' 카테고리의 다른 글
MQTT 이제 모바일로 테스트 하세요 (0) 2023.10.12