반응형
SMALL
LTE-Cat M1 모뎀 연결 최적화 방안
문제 분석
현재 LTE-Cat M1 모뎀 연결에서 하루 1~2회 발생하는 통신 실패는 다음과 같은 원인에 기인합니다:
- 타이밍 동기화 부족
- AT 명령어 시퀀스의 비최적화
- 불충분한 재시도 메커니즘
- 네트워크 상태 검증 단계 미흡
- 전력 관리 및 슬립 모드 후 재연결 전략 부재
제공된 소스 코드를 분석한 결과, LTE_Init()
및 LTE_MQTTConnect()
함수에서 여러 개선 가능 지점을 확인했습니다.
최적화 방안
1. AT 명령어 시퀀스 최적화
현재 코드는 기본적인 모뎀 초기화 및 네트워크 연결 과정을 포함하지만, 다음과 같이 최적화할 수 있습니다:
// 모뎀 초기화 단계 최적화
case 0:
memset(<EDevice.Status, 0, sizeof(LTEDevice.Status));
LTEDevice.Status.IsPowerOn = 0; // 전원 끄기
LTEDevice.Status.IsResetOn = 0; // 리셋 끄기
LTEDevice.Status.IsWarmUp = 1;
oTMR_ResetNow(<E_InitTimer);
LTE_InitTryCount = 0;
if(oAT_Close(pATCommend) == AT_RESULT_OK){
LTE_InitStep++;
}
break;
// 하드웨어 리셋 단계 추가
case 5:
if(oTMR_Trigger(<E_InitTimer, 1000, 1)){
// ATZ 명령어로 모뎀 소프트웨어 리셋 실행
switch (oAT_TransmitCommend(LTEDevice.pAT, "ATZ\r\n", "OK", 3000, 2, True))
{
case AT_RESULT_OK:
LTE_InitStep++;
break;
case AT_RESULT_TIMEOUT:
LTE_InitTryCount++;
if(LTE_InitTryCount > 3) {
// 하드웨어 리셋 시도
LTEDevice.Status.IsResetOn = 1;
oTMR_ResetNow(<E_InitTimer);
LTE_InitStep = 3; // 리셋 사이클로 돌아가기
}
break;
default:
break;
}
}
break;
// 모뎀 기능 모드 설정 추가
case 8:
switch (oAT_TransmitCommend(LTEDevice.pAT, "AT+CFUN=1\r\n", "OK", 5000, 2, True))
{
case AT_RESULT_OK:
LTE_InitStep++;
break;
case AT_RESULT_TIMEOUT:
LTE_InitTryCount++;
break;
default:
break;
}
break;
2. 타이밍 동기화 개선 방법
Cat-M1 모뎀은 네트워크 상태 변화 및 명령 처리에 충분한 시간이 필요합니다. 타이밍 동기화를 개선하기 위해:
// 네트워크 등록 명령 최적화
case 10:
switch (oAT_TransmitCommend(LTEDevice.pAT, "AT+CEREG=2\r\n", "OK", 5000, 2, True))
{
case AT_RESULT_OK:
LTEDevice.Status.IsSerialFault = 0;
LTE_InitStep++;
LTE_InitTryCount = 0;
// 명령 사이에 충분한 대기 시간 추가
oTMR_ResetNow(<E_InitTimer);
break;
case AT_RESULT_TIMEOUT:
LTEDevice.Status.IsSerialFault = 1;
LTE_InitTryCount++;
break;
default:
break;
}
break;
case 11:
// 이전 명령 처리를 위한 추가 대기 시간
if(oTMR_Elapsed(<E_InitTimer, 2000)) {
switch (oAT_TransmitCommend(LTEDevice.pAT, "AT%CMATT=1\r\n", "OK", 10000, 2, True))
{
case AT_RESULT_OK:
LTEDevice.Status.IsSerialFault = 0;
LTE_InitStep++;
LTE_InitTryCount = 0;
// 네트워크 등록을 위한 대기 시간 추가
oTMR_ResetNow(<E_InitTimer);
break;
case AT_RESULT_TIMEOUT:
LTEDevice.Status.IsSerialFault = 1;
LTE_InitTryCount++;
break;
default:
break;
}
}
break;
case 12:
// 네트워크 등록 대기 시간 10초로 증가
if(oTMR_Elapsed(<E_InitTimer, 10000)) {
switch (oAT_TransmitCommend(LTEDevice.pAT, "AT+CEREG?\r\n", "+CEREG: ", 5000, 1, True))
{
// 기존 코드와 동일...
}
}
break;
3. 효과적인 재시도 메커니즘
현재 코드는 단순한 카운터 기반 재시도 메커니즘을 사용합니다. 다음과 같이 지수 백오프 알고리즘을 구현하여 개선할 수 있습니다:
// 지수 백오프 알고리즘 구현을 위한 변수 추가
static uint32_t LTE_InitBackoffTime = 1000; // 초기 백오프 1초
// 네트워크 등록 상태 확인 코드 개선
case 12:
if(oTMR_Elapsed(<E_InitTimer, LTE_InitBackoffTime)) {
switch (oAT_TransmitCommend(LTEDevice.pAT, "AT+CEREG?\r\n", "+CEREG: ", 5000, 1, True))
{
case AT_RESULT_TIMEOUT:
LTEDevice.Status.IsSerialFault = 1;
LTE_InitTryCount++;
// 지수 백오프 시간 증가 (최대 60초)
LTE_InitBackoffTime = MIN(LTE_InitBackoffTime * 2, 60000);
break;
case AT_RESULT_OK:
LTEDevice.Status.IsSerialFault = 0;
// 성공 시 백오프 시간 리셋
LTE_InitBackoffTime = 1000;
if ((pChar = strstr(LTEDevice.pAT->pResponseData, ",")) != NULL) {
pChar++;
if (*pChar == '1' || *pChar == '5'){
// 네트워크 등록 성공
LTEDevice.Status.IsPHYOkay = 1;
LTE_InitStep++;
LTE_InitTryCount = 0;
}
else if (*pChar == '2'){
// 검색 중일 경우 대기 시간 증가
LTE_InitBackoffTime = MIN(LTE_InitBackoffTime + 2000, 60000);
LTE_StatusMessage("LTE network searching");
}
else if (*pChar == '0' || *pChar == '3') {
// 등록 실패 시 재시도 증가
LTE_InitTryCount++;
// 신호 품질 확인 추가
LTE_InitStep = 50; // 신호 품질 확인 단계로 이동
}
}
break;
default:
break;
}
oTMR_ResetNow(<E_InitTimer);
}
break;
// 신호 품질 확인 단계 추가
case 50:
switch (oAT_TransmitCommend(LTEDevice.pAT, "AT+CSQ\r\n", "+CSQ: ", 3000, 1, True))
{
case AT_RESULT_OK:
// 신호 품질 파싱 및 로깅
int rssi, ber;
if (sscanf(LTEDevice.pAT->pResponseData, "%d,%d", &rssi, &ber) == 2) {
char msg[50];
snprintf(msg, sizeof(msg), "Signal quality: %d", rssi);
LTE_StatusMessage(msg);
if (rssi < 10) {
// 신호가 약한 경우 더 길게 대기
LTE_InitBackoffTime = 30000;
}
}
LTE_InitStep = 11; // CMATT 명령으로 돌아가기
break;
default:
LTE_InitStep = 12; // CEREG 확인으로 돌아가기
break;
}
break;
4. 연결 안정성 검증 방법
연결 안정성을 높이기 위해 다음과 같은 검증 단계를 추가합니다:
// PDN 연결 상태 확인 단계 추가
case 13:
switch (oAT_TransmitCommend(LTEDevice.pAT, "AT%PDNRDP\r\n", "%PDNRDP: ", 5000, 1, True))
{
case AT_RESULT_OK:
// IP 주소 파싱 및 저장
if (strstr(LTEDevice.pAT->pResponseData, "IPV4") != NULL) {
LTE_StatusMessage("PDN connected with IPv4");
LTE_InitStep++;
} else {
// PDN 연결 실패 시 재시도
LTE_StatusMessage("PDN connection not established");
// AT%PDNACT 명령으로 PDN 활성화 시도
LTE_InitStep = 60;
}
break;
case AT_RESULT_TIMEOUT:
LTE_InitTryCount++;
break;
default:
break;
}
break;
// PDN 활성화 단계 추가
case 60:
switch (oAT_TransmitCommend(LTEDevice.pAT, "AT%PDNACT=1,1\r\n", "OK", 10000, 1, True))
{
case AT_RESULT_OK:
LTE_StatusMessage("PDN activation requested");
// PDN 활성화 확인을 위해 대기
oTMR_ResetNow(<E_InitTimer);
LTE_InitStep = 13; // PDN 상태 확인으로 돌아가기
break;
default:
LTE_InitTryCount++;
break;
}
break;
5. 슬립 모드 후 재연결 최적화 방안
Cat-M1 모뎀의 PSM(Power Saving Mode) 및 eDRX(extended Discontinuous Reception) 기능을 활용하여 전력 소비를 줄이고 재연결 성능을 향상시킬 수 있습니다:
// PSM 설정 단계 추가
case 70:
// T3324 타이머: 30초, T3412 타이머: 1시간
switch (oAT_TransmitCommend(LTEDevice.pAT, "AT+CPSMS=1,\"00100001\",\"00000101\"\r\n", "OK", 5000, 1, True))
{
case AT_RESULT_OK:
LTE_StatusMessage("PSM configured");
LTE_InitStep++;
break;
default:
LTE_InitTryCount++;
LTE_InitStep++; // 실패해도 다음 단계로 진행
break;
}
break;
// eDRX 설정 단계 추가
case 71:
// eDRX 활성화 및 20.48초 주기 설정
switch (oAT_TransmitCommend(LTEDevice.pAT, "AT+CEDRXS=1,5,\"0101\"\r\n", "OK", 5000, 1, True))
{
case AT_RESULT_OK:
LTE_StatusMessage("eDRX configured");
LTE_InitStep++;
break;
default:
LTE_InitTryCount++;
LTE_InitStep++; // 실패해도 다음 단계로 진행
break;
}
break;
MQTT 연결 최적화
MQTT 연결 과정도 유사한 방식으로 최적화할 수 있습니다:
// MQTT 연결 최적화
case 2:
LTEDevice.Status.IsConnecting = 1;
LTEDevice.Status.IsConnected = 0;
LTEDevice.SocketNumber = 0;
// 신호 품질 먼저 확인
switch (oAT_TransmitCommend(LTEDevice.pAT, "AT+CSQ\r\n", "+CSQ: ", 3000, 1, True))
{
case AT_RESULT_OK:
// 신호 품질 확인 후 진행
int rssi, ber;
if (sscanf(LTEDevice.pAT->pResponseData, "%d,%d", &rssi, &ber) == 2) {
if (rssi < 10) {
// 신호가 약한 경우 경고 로그
LTE_StatusMessage("Warning: Low signal quality");
}
}
LTE_MQTTConnectStep++;
break;
default:
// 신호 품질 확인 실패해도 계속 진행
LTE_MQTTConnectStep++;
break;
}
break;
// MQTT 이벤트 활성화
case 3:
sprintf(StrCmd, "AT%%MQTTEV=\"ALL\",%d\r\n", 1);
switch (oAT_TransmitCommend(LTEDevice.pAT, StrCmd, "OK", 10000, 2, True))
{
case AT_RESULT_OK:
LTE_StatusMessage("MQTT events enabled");
LTE_MQTTConnectStep++;
LTE_MQTTConeectTryCount = 0;
// 충분한 대기 시간 추가
oTMR_ResetNow(<E_MQTTConnectTimer);
break;
case AT_RESULT_TIMEOUT:
LTE_MQTTConeectTryCount++;
break;
default:
break;
}
break;
LTE-Cat M1 통신의 타이밍 동기화 이해
LTE-Cat M1 통신에서 타이밍 동기화는 다음과 같은 이유로 매우 중요합니다:
- 네트워크 동기화 지연: Cat-M1 모뎀은 무선 네트워크에 접속하기 위해 시간이 필요합니다.
AT+CEREG=2
명령 후 바로 상태를 확인하면 아직 네트워크가 등록되지 않았을 수 있습니다. - 전력 절약 모드: Cat-M1은 전력 절약을 위해 PSM과 eDRX 모드를 지원합니다. 이 모드에서 네트워크 연결이 해제되고 모뎀이 절전 상태로 전환될 수 있으므로, 이에 맞는 타이밍 동기화가 필요합니다.
- 모뎀 명령 처리 시간: 모뎀이 내부적으로 명령을 처리하는 데 시간이 필요하며, 명령 간 충분한 간격이 없으면 예상치 못한 동작이 발생할 수 있습니다.
구현 권장사항
- 점진적 백오프 알고리즘: 재시도 간격을 점진적으로 늘려 네트워크 부하를 줄이고 성공 확률을 높입니다.
- 네트워크 상태 모니터링:
AT+CSQ
명령을 사용하여 신호 품질을 주기적으로 확인하고, 신호가 약한 경우 재시도 알고리즘을 조정합니다. - 타이머 기반 상태 관리: 모든 AT 명령어 사이에 적절한 대기 시간을 두어 모뎀이 이전 명령을 처리할 충분한 시간을 제공합니다.
- 연결 상태 검증: 단순히 "OK" 응답에 의존하지 말고, PDN 활성화 상태와 IP 주소 할당을 확인하여 실제 연결 상태를 검증합니다.
- 전력 관리 최적화: PSM과 eDRX 설정을 애플리케이션 요구사항에 맞게 조정하고, 슬립 모드 후 재연결 프로세스를 최적화합니다.
이러한 개선 사항을 구현하면 LTE-Cat M1 모뎀의 연결 안정성이 크게 향상되어 하루 1~2회 발생하는 연결 실패 문제를 최소화할 수 있을 것입니다.
반응형
LIST
'System' 카테고리의 다른 글
크레인, 고소작업차 등 중장비에 들어가는 각종 전자 기기들... (0) | 2025.03.17 |
---|---|
레일변위 시스템#1 (0) | 2023.03.15 |