-
LTE-CATM1 내장형 모뎀으로 Unix Timestamp 처리하기AWS IoT 2022. 2. 13. 16:53
IoT, AIoT에서 수집한 정보를 서버에 전송할 때
서버에서 요구하는 사항 중 하나가 Timestamp 값 (데이터를 전송하는 현재시간)입니다.
필요한 이유는 단말기에서 데이터와 데이터를 보낸시간을 받아서 처리하기 위해서입니다.
물론, 간단하게 서버를 구성할 때는 서버에서 데이터를 받은 시간으로 처리해 줘도 되지만,
데이터에 대한 무결성 검증을 위해서는 단말기에서 보낸 시간정보도 필요합니다.
글로벌 클라우드 서비스를 운영하고 있는 AWS도 AWS-IoT를 통해 데이터 전송 시 필수사항으로
TimeStamp 값을 요구(*마크)하고 있습니다.
단순히 시간값을 넣어야 하는 게 아니라 과거 시간으로 15분을 초과하거나 미래시간으로 5분을 초과하는 경우,
데이터 수집 자체를 거부합니다.
여기서 설명박스를 보면 epoch 이후 경과시간을 초로 환산해서 값을 넣어 주어야 하는데,
epoch 시간을 또 다른 용어로 POSIX 시간이라고 부릅니다.
1970년 1월 1일 00:00:00 협정 세계시(UTC)부터의 경과 시간을 초로 환산하여 정수로 나타낸 값입니다.
이제 Unix Time값을 구하기 위해 아래 두 가지 문제를 해결해야 합니다.
1. 정확한 현재시간이 필요하다 (년/월/일/시/분/초)
2. 정확한 현재시간을 Unix Time 으로 변환해야 한다.
두 가지 문제를 해결해서 TimeStamp 값을 만들어서 데이터와 함께 전송해야 클라우드 서비스에서
값을 받아주기 때문에 클라우드 서비스를 이용해서 무언가를 만드는 분들에게는
꼭 해결해야 할 과제라 생각합니다.
LTE-CATM1 내장형 모뎀을 사용하실 경우 첫번째 문제는 비교적 쉽게 해결할 수 있습니다.
LTE-CATM1이 최초 부팅해서 기지국에 연결될 때 기지국과 모뎀 간 자동으로 시간 값을 동기화시킵니다.
이 과정은 자동으로 이루어지므로 기지국에 연결이 확인되고 가상 아이피를 받아온 상태라면 이미 시간값이
동기화된 상태입니다.
이 값을 LTE-CATM1 내장형 모뎀에서 가져오는 방법은 아래 한 줄 명령어(AT+CCLK?)로 해결됩니다.
AT+CCLK?
+CCLK: "18/03/03,05:02:41-20"
OK
자 이제 현재 시간 값을 받아 온 것이 확인되었습니다.
해당 기능은 LTE-CATM1 내장형 모뎀 오픈소스에도 이미 구현해 두었습니다.
int TYPE1SC::getCCLK(char *szCCLK, int nBufferSize) {
char szCmd[16];
int ret;
TYPE1SC_serial_clearbuf();
memset(szCCLK, 0, nBufferSize);
strcpy(szCmd, "AT+CCLK?");
ret = sendATcmd(szCmd, szCCLK, nBufferSize, "+CCLK:");
return ret;
}해당 라이브러리를 예제에서 호출해서 사용하면 아래와 같은 결괏값을 얻을 수 있습니다.
char szTime[32];
if (TYPE1SC.getCCLK(szTime, sizeof(szTime)) == 0) {
DebugSerial.print("Time : ");
DebugSerial.println(szTime);
}Time : "22/02/13,16:33:51+36"
첫 번째 문제는 비교적 쉽게 해결했습니다.
두 번째로 해당 값을 이용해서 Unix Time을 구해야 하는 문제를 해결해야 합니다.
인터넷 검색을 통해 러시아 형님의 도움을 받게 되었습니다.
https://github.com/GyverLibs/UnixTime
아래 코드를 보시면 알겠지만 UnixTime을 구하는 작업, 만만하지 않습니다. (감사합니다. 러시아 형님!!)
https://github.com/GyverLibs/UnixTime/blob/main/src/UnixTime.h
자 이제 년, 월, 일, 시간, 분, 초를 해당 라이브러리에 넣고 Unix Time을 구해 보겠습니다.
중요한 연산 중 하나는 22년이 아니라 2022년을 넣어야 한다는 것입니다. ^^
if (TYPE1SC.getCCLK(szTime, sizeof(szTime)) == 0) {
DebugSerial.print("Time : ");
DebugSerial.println(szTime);
sscanf(szTime,"\"%d/%d/%d,%d:%d:%d+%d\"",&_year, &_month, &_day, &_hour, &_minute, &_second, &_tmp);
/* Debug */
DebugSerial.println(_year);
DebugSerial.println(_month);
DebugSerial.println(_day);
DebugSerial.println(_hour);
DebugSerial.println(_minute);
DebugSerial.println(_second);
}
//Set Date Time
_year += 2000;
stamp.setDateTime(_year, _month, _day, _hour, _minute, _second); // year/month/day,hour:minute:second
//Get Unix Time
uint32_t unix = stamp.getUnix();
DebugSerial.println(unix);마지막으로 구한 1644737949 가 현재 Unix Time 값입니다. 타임스탬프로 이 값을 사용하면 됩니다.
작성한 예제는 아래 깃허브 사이트 업로드했습니다. (Arduino, ESP32, Raspberry PI PICO)
https://github.com/codezoo-ltd/TYPE1SC/tree/main/examples/Arduino_New_Nano/TYPE1SC_GET_UnixTime
https://github.com/codezoo-ltd/TYPE1SC/tree/main/examples/ESP32/TYPE1SC_GET_UnixTime
https://github.com/codezoo-ltd/TYPE1SC/tree/main/examples/RPI_PICO/TYPE1SC_GET_UnixTime
Murata Type1SC 모듈 구매, 자료 관련 문의
(주)아성코리아
전지만 이사 010-5418-8812 mlcc@asung.com
박상인 차장 010-6556-5405 sipark@asung.comLTE-CATM1 내장형 모뎀 대량 구매 상담, 외주 개발, 협업 문의
(주)코드주
장병남 대표 010-8965-1323 rooney.jang@codezoo.co.krhttps://www.devicemart.co.kr/goods/view?no=14077527
https://smartstore.naver.com/codezoo/products/7153689192
'AWS IoT' 카테고리의 다른 글
LTE CATM1 모뎀에서 AWS IoT 모든 기능을 사용할 수 있습니다. (5) 2024.03.31 2023한국전자전 Murata IoT 스마트팜 전시품 제작 (0) 2023.10.09 LTE CATM1 내장형모뎀을 활용한 스마트팜 데모 영상 (0) 2022.06.17 AWS IoT SiteWise Example 오픈소스 업로드 (0) 2022.02.19 ARM mbedOS (6.15.0) Cellular PPP 작업 - AWS IoT (0) 2021.10.05