투케이2K

1046. (Android/Java) [간단 소스] Aws Iot Core MQTT 연결 수행 후 Timer 타이머 사용해 주기적 connect 연결 상태 변경 및 해제 감지 수행 본문

Android

1046. (Android/Java) [간단 소스] Aws Iot Core MQTT 연결 수행 후 Timer 타이머 사용해 주기적 connect 연결 상태 변경 및 해제 감지 수행

투케이2K 2025. 10. 25. 12:31
728x90

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : Java / Kotlin

 

[소스 코드]

// --------------------------------------------------------------------------------------
[개발 및 테스트 환경]
// --------------------------------------------------------------------------------------

- 언어 : Java / Kotlin


- 개발 툴 : AndroidStudio


- 기술 구분 : Android / Iot Core / MQTT / Connect


- 사전) 안드로이드 Build.gradle 설정 사항 : 

    android {

        // [컴파일 버전]
        compileSdk 34

        // [Config 셋팅]
        defaultConfig {
            // ----------------------------
            applicationId "com.example.appproject" // 앱 아이디
            // ----------------------------
            versionCode 1 // 빌드 버전
            // ----------------------------
            versionName '1.0.1' // 빌드 네임
            // ----------------------------
            minSdk 24 // 최소 빌드 버전
            // ----------------------------
            targetSdk 34 // TODO 타겟 빌드 버전
            // ----------------------------
        }

        // [컴파일 자바 버전 지정]
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }

        // [아파치 http 사용 설정]
        useLibrary ('org.apache.http.legacy')
    }


- 사전) Aws Iot Core 간단 설명 : 

  >> AWS IoT 는 IoT 디바이스를 다른 디바이스 및 AWS 클라우드 서비스에 연결하는 클라우드 서비스를 제공합니다.

  >> 디바이스가에 연결할 수 있는 경우 AWS IoT는 AWS 가 제공하는 클라우드 서비스에 디바이스를 AWS IoT 연결할 수 있습니다.

  >> AWS IoT Core 메시지 브로커는 MQTT 및 MQTT over WSS 프로토콜을 사용하여 메시지를 게시하고 구독하는 디바이스 및 클라이언트를 지원합니다. 
  
    - HTTPS 프로토콜을 사용하여 메시지를 게시하는 디바이스와 클라이언트도 지원합니다.


- 사전) Aws MQTT Shadow 간단 설명 : 

  >> AWS IoT Shadow (섀도우) 란 사물 (객체) 을 따라 다니며, AWS IoT 에 연결되어 있는지 여부에 관계없이 앱 및 기타 서비스에서 디바이스의 상태를 사용할 수 있는 것 입니다

  >> AWS IoT Shadow (섀도우) 는 디바이스, 앱 및 기타 클라우드 서비스가 데이터를 공유할 수 있는 신뢰할 수 있는 데이터 스토어를 제공하며, 이를 통해 디바이스, 앱 및 기타 클라우드 서비스가 디바이스 상태를 유지하면서 연결하거나 연결을 끊을 수 있습니다

  >> AWS IoT Shadow (섀도우) 를 통한 디바이스 현재 상태 액세스 및 제어 단계 :

    - 앱은 섀도우를 업데이트하여 디바이스 상태 변경을 요청

    - AWS IoT는 디바이스에 대한 변경 사항을 나타내는 메시지를 게시

    - 디바이스는 이 메시지를 수신하고, 메시지와 일치하도록 상태를 업데이트하고, 업데이트된 상태로 메시지를 게시

    - 디바이스 섀도우 서비스는 해당 섀도우에 이 업데이트된 상태를 반영

    - 앱은 섀도우의 업데이트를 구독하거나 섀도우에 현재 상태를 쿼리


- 사전) 안드로이드에서 Aws MQTT 연결 및 사용을 위한 의존성 설정 정보 : 

  implementation 'com.amazonaws:aws-android-sdk-iot:2.57.0'
  implementation 'com.amazonaws:aws-android-sdk-mobile-client:2.57.0'
  implementation 'com.amazonaws:aws-android-sdk-kms:2.57.0'
  implementation 'com.amazonaws:aws-android-sdk-s3:2.57.0'
  implementation 'com.amazonaws:aws-android-sdk-iot:2.57.0'

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[소스 코드]
// --------------------------------------------------------------------------------------

// ------------------------------------------------------------
[1]. AWS IAM 계정 정보를 사용해 AWS 자격 증명 설정 초기화 수행
// ------------------------------------------------------------

    // --------------------------------------------------------
    // TODO [AWS 자격 증명 설정]
    // --------------------------------------------------------
    AWSCredentials credentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY);


    // --------------------------------------------
    // TODO [AWSCredentialsProvider 생성]
    // --------------------------------------------
    /**
        * Android SDK에서는 AWSStaticCredentialsProvider 가 명시적으로 제공되지 않기 때문에,
        * 직접 BasicAWSCredentials 를 사용하고 이를 AWSCredentialsProvider 로 래핑
        * */
    AWSCredentialsProvider credentialsProvider = new AWSCredentialsProvider() {
        @Override
        public AWSCredentials getCredentials() {
            return credentials;
        }

        @Override
        public void refresh() {
        }
    };





// ------------------------------------------------------------
[2]. AWSIotMqttManager 객체 생성 및 재연결 처리 및 KeepAlive 시간 설정 수행

// ------------------------------------------------------------

    >> KeepAlive 옵션 설정 값 참고 사항 정리 : 

      - 클라이언트가 N 초마다 브로커에 ping을 보내 연결이 유지되고 있는지 확인합니다 
      - 모바일 환경에서는 보통 30~60초 정도가 적당합니다. (기본 값 60 초)
      - 실시간성이 중요한 경우에는 10~20초로 설정하기도 합니다.
      - 만약, 네트워크 문제나 브로커 응답 없음 등으로 인해 ping 응답이 없으면, 연결이 끊기고 ConnectionLost 또는 Reconnecting 상태로 콜백이 호출됩니다

    awsMqttManager = new AWSIotMqttManager(
            String.valueOf(CLIENT_ID), // [클라이언트 아이디 : 디바이스 고유값]
            String.valueOf(END_POINT) // [엔드 포인트 : AWS 접속 정보]
    );

    awsMqttManager.setAutoReconnect(false); // TODO 연결 유실 후 자동 재연결 설정 False 지정
    awsMqttManager.setKeepAlive(30); // TODO (초 단위) : 클라이언트가 N 초마다 브로커에 ping을 보내 연결이 유지되고 있는지 확인합니다





// ------------------------------------------------------------
[3]. AWSIotMqttManager.connect 이벤트 감지를 위한 필요 변수 선언 수행
// ------------------------------------------------------------

    boolean isConnected = false; // 연결 상태 체크 플래그 값
    Timer connectTimer = null; // 연결 상태 체크 폴링 타이머





// ------------------------------------------------------------
[4]. AWSIotMqttManager.connect 연결 시도 수행 및 AWSIotMqttClientStatusCallback onStatusChanged 이벤트 등록 연결 및 해제 상태 감지 이벤트 등록
// ------------------------------------------------------------

    awsMqttManager.connect(credentialsProvider, new AWSIotMqttClientStatusCallback() {
        @Override
        public void onStatusChanged(final AWSIotMqttClientStatus status, final Throwable throwable) {

            try { isConnected = (status == AWSIotMqttClientStatus.Connected); } catch (Exception e){ e.printStackTrace(); } // TODO Set Connection Flag

        }
    });





// ------------------------------------------------------------
[5]. AWSIotMqttManager.connect 이후 즉시 Timer 를 등록해 일정 주기 마다 isConnected 변수값 체크 및 AWS 연결 상태 확인 수행
// ------------------------------------------------------------

    awsMqttManager.connect(credentialsProvider, new AWSIotMqttClientStatusCallback() {
        @Override
        public void onStatusChanged(final AWSIotMqttClientStatus status, final Throwable throwable) {
            try { isConnected = (status == AWSIotMqttClientStatus.Connected); } catch (Exception e){ e.printStackTrace(); } // TODO Set Connection Flag

            if (status == AWSIotMqttClientStatusCallback.AWSIotMqttClientStatus.Connected){ // [연결 완료]

                S_Log._W_("AWSIotMqttManager Connection 연결 완료", null);
            }
            else if (status == AWSIotMqttClientStatusCallback.AWSIotMqttClientStatus.Connecting){ // [연결 중]
                S_Log._D_("AWSIotMqttManager Connection 연결 진행 중", null);
            }
            else if (status == AWSIotMqttClientStatusCallback.AWSIotMqttClientStatus.Reconnecting){ // [재연결]
                S_Log._D_("AWSIotMqttManager Connection 재연결 수행", null);
            }
            else if (status == AWSIotMqttClientStatusCallback.AWSIotMqttClientStatus.ConnectionLost){ // [연결 해제]
                S_Log._E_("AWSIotMqttManager Connection 연결 해제", null);
            }
            else {
                S_Log._E_("AWSIotMqttManager Connection Default", null);
            }
        }
    });


    if (connectTimer == null){

        connectTimer = new Timer();
        connectTimer.schedule(new TimerTask() {
            @Override
            public void run() {
                try {
                    if (mContext != null && ((Activity) mContext).isFinishing() == false){ // [액티비티가 종료 상태가 아닌 경우]

                        if (isConnected == true){                        
                            S_Log.w("KWON_TWOK", "AWS MQTT Connection Polling Check :: isConnected True");

                            // 지속 연결 상태 중 >> 뷰 화면 표시 처리
                        }
                        else {                        
                            S_Log.e("KWON_TWOK", "AWS MQTT Connection Polling Check :: isConnected False");

                            // 연결 상태 해제 >> 뷰 화면 표시 처리
                        }
                    }
                    else {
                        S_Log._E_(ACTIVITY_NAME + " :: AWS MQTT Connection Polling Check :: Error :: mContext Is Null", null);
                        isConnected = false; // 변수 초기화
                        this.cancel(); // 타이머 종료
                        connectTimer = null; // 변수 초기화
                    }
                }
                catch (Exception e){
                    e.printStackTrace();

                    S_Log._E_(ACTIVITY_NAME + " :: AWS MQTT Connection Polling Check :: Exception :: " + String.valueOf(e.getMessage()), null);
                    isConnected = false; // 변수 초기화
                    this.cancel(); // 타이머 종료
                    connectTimer = null; // 변수 초기화
                }
            }
        }, 0, 5000); // 5초 마다 확인

    }

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[참고 사이트]
// --------------------------------------------------------------------------------------

[android] Aws Iot Core MQTT 연결 수행 후 Timer 타이머 사용해 주기적 connect 연결 상태 변경 및 해제 감지 로직

https://kkh0977.tistory.com/8330


[Aws Iot Core] AWS 연결 종료 상태 ConnectionLost , Reconnecting , Disconnected 차이점 정리

https://kkh0977.tistory.com/8328


[android] Aws Shadow 섀도우 토픽 구독 및 publish 요청 이후 타임아웃 TimeOut 로직 처리

https://blog.naver.com/kkh0977/223906176453?trackingCode=blog_bloghome_searchlist


[업무 이슈] 특정 하드웨어 기기 재부팅 , 네트워크 변경 후 AWS Shadow 구독 하지 않는 이슈 - Aws 재연결 로직 추가

https://blog.naver.com/kkh0977/223540459398?trackingCode=blog_bloghome_searchlist


[Aws] 프로비저닝 수행 시 AWS Connection ClientId 랜덤 UUID 지정 및 세션 초기화 로직 - AWS 프로비저닝 로직 정리

https://blog.naver.com/kkh0977/224019138301?trackingCode=blog_bloghome_searchlist


[Aws Iot Core] Fleet provisioning 플릿 프로비저닝 수행 방법 정리 - 클레임 인증서 , 신뢰할 수 있는 사용자

https://blog.naver.com/kkh0977/223779257161?trackingCode=blog_bloghome_searchlist


[업무 이슈] Aws Iot Core Shadow 섀도우 Subscribe 구독 , Publish 전송 연동 테스트 이슈 - 구독 후 요청 전송 로직

https://blog.naver.com/kkh0977/223851954575?trackingCode=blog_bloghome_searchlist


[투케이 학습] : AWS IoT Shadow (섀도우) 개념 학습

https://blog.naver.com/kkh0977/223144838475?trackingCode=blog_bloghome_searchlist


[Aws Iot Core] Https , MQTT , Websocket 통신 Port 포트 정보 정리 - aws iot core port

https://blog.naver.com/kkh0977/223695574812?trackingCode=blog_bloghome_searchlist

// --------------------------------------------------------------------------------------
 
728x90
반응형
Comments