본문 바로가기

System

LTE-Cat M1 모뎀 연결 최적화 방안

반응형
SMALL

LTE-Cat M1 모뎀 연결 최적화 방안

문제 분석

현재 LTE-Cat M1 모뎀 연결에서 하루 1~2회 발생하는 통신 실패는 다음과 같은 원인에 기인합니다:

  1. 타이밍 동기화 부족
  2. AT 명령어 시퀀스의 비최적화
  3. 불충분한 재시도 메커니즘
  4. 네트워크 상태 검증 단계 미흡
  5. 전력 관리 및 슬립 모드 후 재연결 전략 부재

제공된 소스 코드를 분석한 결과, LTE_Init()LTE_MQTTConnect() 함수에서 여러 개선 가능 지점을 확인했습니다.

최적화 방안

1. AT 명령어 시퀀스 최적화

현재 코드는 기본적인 모뎀 초기화 및 네트워크 연결 과정을 포함하지만, 다음과 같이 최적화할 수 있습니다:

// 모뎀 초기화 단계 최적화
case 0:
    memset(&LTEDevice.Status, 0, sizeof(LTEDevice.Status));
    LTEDevice.Status.IsPowerOn = 0; // 전원 끄기
    LTEDevice.Status.IsResetOn = 0; // 리셋 끄기
    LTEDevice.Status.IsWarmUp = 1;
    oTMR_ResetNow(&LTE_InitTimer);
    LTE_InitTryCount = 0;

    if(oAT_Close(pATCommend) == AT_RESULT_OK){
        LTE_InitStep++;
    }
    break;

// 하드웨어 리셋 단계 추가
case 5:
    if(oTMR_Trigger(&LTE_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(&LTE_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(&LTE_InitTimer);
            break;
        case AT_RESULT_TIMEOUT:
            LTEDevice.Status.IsSerialFault = 1;
            LTE_InitTryCount++;
            break;
        default:
            break;
    }
    break;
case 11:
    // 이전 명령 처리를 위한 추가 대기 시간
    if(oTMR_Elapsed(&LTE_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(&LTE_InitTimer);
                break;
            case AT_RESULT_TIMEOUT:
                LTEDevice.Status.IsSerialFault = 1;
                LTE_InitTryCount++;
                break;
            default:
                break;
        }
    }
    break;
case 12:
    // 네트워크 등록 대기 시간 10초로 증가
    if(oTMR_Elapsed(&LTE_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(&LTE_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(&LTE_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(&LTE_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(&LTE_MQTTConnectTimer);
            break;
        case AT_RESULT_TIMEOUT:
            LTE_MQTTConeectTryCount++;
            break;
        default:
            break;
    }
    break;

LTE-Cat M1 통신의 타이밍 동기화 이해

LTE-Cat M1 통신에서 타이밍 동기화는 다음과 같은 이유로 매우 중요합니다:

  1. 네트워크 동기화 지연: Cat-M1 모뎀은 무선 네트워크에 접속하기 위해 시간이 필요합니다. AT+CEREG=2 명령 후 바로 상태를 확인하면 아직 네트워크가 등록되지 않았을 수 있습니다.
  2. 전력 절약 모드: Cat-M1은 전력 절약을 위해 PSM과 eDRX 모드를 지원합니다. 이 모드에서 네트워크 연결이 해제되고 모뎀이 절전 상태로 전환될 수 있으므로, 이에 맞는 타이밍 동기화가 필요합니다.
  3. 모뎀 명령 처리 시간: 모뎀이 내부적으로 명령을 처리하는 데 시간이 필요하며, 명령 간 충분한 간격이 없으면 예상치 못한 동작이 발생할 수 있습니다.

구현 권장사항

  1. 점진적 백오프 알고리즘: 재시도 간격을 점진적으로 늘려 네트워크 부하를 줄이고 성공 확률을 높입니다.
  2. 네트워크 상태 모니터링: AT+CSQ 명령을 사용하여 신호 품질을 주기적으로 확인하고, 신호가 약한 경우 재시도 알고리즘을 조정합니다.
  3. 타이머 기반 상태 관리: 모든 AT 명령어 사이에 적절한 대기 시간을 두어 모뎀이 이전 명령을 처리할 충분한 시간을 제공합니다.
  4. 연결 상태 검증: 단순히 "OK" 응답에 의존하지 말고, PDN 활성화 상태와 IP 주소 할당을 확인하여 실제 연결 상태를 검증합니다.
  5. 전력 관리 최적화: PSM과 eDRX 설정을 애플리케이션 요구사항에 맞게 조정하고, 슬립 모드 후 재연결 프로세스를 최적화합니다.

이러한 개선 사항을 구현하면 LTE-Cat M1 모뎀의 연결 안정성이 크게 향상되어 하루 1~2회 발생하는 연결 실패 문제를 최소화할 수 있을 것입니다.

반응형
LIST