투케이2K

935. (Android/Java) AWSIotMqttManager 사용해 Aws Mqtt Shadow 통신 Subscribe 구독 및 publish 요청 소스 코드 본문

Android

935. (Android/Java) AWSIotMqttManager 사용해 Aws Mqtt Shadow 통신 Subscribe 구독 및 publish 요청 소스 코드

투케이2K 2025. 1. 13. 19:47

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : Java / Kotlin

 

[소스 코드]

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

- 언어 : Java / Kotlin

- 개발 툴 : AndroidStudio

- 기술 구분 : Aws / Provisioning / Template

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






// --------------------------------------------------------------------------------------
[사전) Aws Shadow 통신 설명]
// --------------------------------------------------------------------------------------

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

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

3. 디바이스, 앱 및 기타 클라우드 서비스가 AWS IoT에 연결되어 있는 동안 해당 섀도우를 통해 디바이스의 현재 상태에 액세스하고 제어할 수 있습니다

4. 디바이스가 오프라인으로 전환되더라도 앱은 여전히 AWS IoT 및 디바이스의 섀도우와 통신할 수 있습니다. 디바이스가 다시 연결되면 섀도우의 현재 상태를 수신하여 섀도우와 일치하도록 상태를 업데이트한 다음 업데이트된 상태로 메시지를 게시할 수 있습니다

5. 섀도우는 JSON 섀도우 문서를 사용하여 데이터를 저장하고 검색합니다

  >> desired : 앱은 desired 객체를 업데이트하여 디바이스 속성에 대해 원하는 상태를 지정합니다

  >> reported : 디바이스는 reported 객체에 현재 상태를 보고합니다

  >> delta : AWS IoT는 delta 객체에서 원하는 상태와 보고된 상태 간의 차이를 보고합니다

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





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

// TODO [사전 라이브러리 추가 설정 : Build.gradle]
implementation 'com.amazonaws:aws-android-sdk-core:2.57.0'
implementation 'com.amazonaws:aws-android-sdk-iot:2.57.0'
implementation 'com.amazonaws:aws-android-sdk-mobile-client:2.57.0'



// TODO [객체 생성 실시 예시]
AWSIotMqttManager awsDeviceMqttManager = new AWSIotMqttManager(
        String.valueOf(CLIENT_ID), // [클라이언트 아이디 : 디바이스 고유값]
        String.valueOf(END_POINT) // [엔드 포인트 : AWS 접속 정보]
);



// TODO [Subscribe 구독 소스 코드]
public static void device_Subscribe(Context mContext, String topic) {

    // -------------------------------------------------------------------
    // [Subscribe 구독 Topic 참고]
    // -------------------------------------------------------------------
    // $aws/things/{thingName}/shadow/name/{ShadowTopicPrefix}/get/accepted
    // -------------------------------------------------------------------
    // $aws/things/{thingName}/shadow/name/{ShadowTopicPrefix}/get/rejected
    // -------------------------------------------------------------------
    // $aws/things/{thingName}/shadow/name/{ShadowTopicPrefix}/update/accepted
    // -------------------------------------------------------------------
    // $aws/things/{thingName}/shadow/name/{ShadowTopicPrefix}/update/rejected
    // -------------------------------------------------------------------

    // [중괄호 내에 문자 >> ThingName 으로 변경]
    String subscribe_topic = topic.replaceAll("\\{.*\\}", S_Preference.getString(mContext, PRE_DEVICE_THING_NAME));
    
    S_Log._D_("[Aws] :: Subscribe 구독 수행", new String[]{ "TOPIC :: " + String.valueOf(subscribe_topic) });

    // [로직 처리 실시]
    try {

        if (device_Mqtt_IsConnect() == true){ // [MqttManager 연결 상태 인 경우]

            // TODO [awsDeviceMqttManager 구독 실시]
            awsDeviceMqttManager.subscribeToTopic(String.valueOf(subscribe_topic),
                    QOS, new AWSIotMqttSubscriptionStatusCallback() {
                        @Override
                        public void onSuccess() { // [성공]
                            S_Log._W_("[Aws] :: Subscribe 구독 성공 :: onSuccess", new String[]{ "TOPIC :: " + String.valueOf(subscribe_topic) });

                        }

                        @Override
                        public void onFailure(Throwable exception) { // [에러]
                            S_Log._E_("[Aws] :: Subscribe 구독 실패 :: onFailure", new String[]{ "TOPIC :: " + String.valueOf(subscribe_topic), "ERROR :: " + String.valueOf(exception.getMessage())});

                        }
                    }, new AWSIotMqttNewMessageCallback() {
                        @Override
                        public void onMessageArrived(String topic, byte[] data) { // [메시지 수신]
                            S_Log._D_("[Aws] :: Subscribe 실시간 메시지 수신 확인 :: onMessageArrived", new String[]{
                                    "TOPIC :: " + String.valueOf(topic),
                                    "MESSAGE :: " + String.valueOf(new String(data))
                            });

                        }
                    });
        }
        else {
            S_Log._E_("[Aws] :: Subscribe 구독 실패", new String[]{
                    "TOPIC :: " + String.valueOf(subscribe_topic),
                    "MESSAGE :: " + String.valueOf("AWSIotMqttManager Connection 연결 되지 않았습니다. 연결 상태를 다시 확인해 주세요.")
            });

        }
    }
    catch (Exception e){
        S_Log._printStackTrace_(null, S_FinalData.LOG_BUG_STATE, null, e);
    }
}

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





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

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

https://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/iot-device-shadows.html

https://dongwon18.github.io/aws_iot/AWS-IoT-Shadow-Tutorial/

// --------------------------------------------------------------------------------------
 
반응형
Comments