Friday, June 9, 2023

Android에서 AWS SDK와 Coroutine을 활용한 MQTT 통신 구현

Android에서 AWS SDK와 MQTT를 이용한 IoT 통신

Android 개발에서 AWS SDK를 활용하면, IoT 기기와의 소통을 위해 MQTT 프로토콜을 사용할 수 있습니다. MQTT는 메시지 발행과 구독을 중심으로 하는 경량 프로토콜입니다. 이러한 특성들을 구현하기 위해, AWS SDK는 AWSIotMqttManager 클래스를 제공합니다.

subscribeToTopic 메소드를 통한 메시지 구독 및 콜백 등록

subscribeToTopic 메소드를 사용하면, 우리는 특정 주제(topic)에 대해 구독할 수 있으며, 동시에 발행되는 메시지에 대한 콜백도 등록할 수 있습니다. 아래 Kotlin 코드 예제에서 확인해볼 수 있습니다.


val topic = "your/topic"
val qos = 0

awsIotMqttManager.subscribeToTopic(topic, qos) { topic, message ->
    // 여기서 받은 메시지 처리
    val msg = String(message.payload, Charset.forName("UTF-8"))
    Log.d("MQTT message received", ": $topic, Message: $msg")
}

AWSIotMqttManager의 disconnect()메소드 오류 해결 방법

구독과 콜백이 정상적으로 진행되더라도 일부 경우에서 연결 종료가 필요할 때가 있습니다. 그런데 이럴 때 콜백 내부에서 AWSIotMqttManager의 disconnect() 메소드를 호출하려고 하면 아래와 같은 에러가 발생합니다:

"콜백 메소드로부터 연결을 끊는 것이 허용되지 않음 (32107)"

Kotlin 언어의 Coroutine 기능을 활용하여 이 문제를 해결하는 방법이 있습니다. Coroutine은 비동기 작업을 간단하게 처리하는 기능으로 멀티스레딩 작업에 유용합니다.

kotlinx.coroutines 라이브러리 추가 및 CoroutineScope 객체 생성

kotlinx.coroutines 라이브러리를 프로젝트에 포함시킨 후 콜백 내부에서 CoroutineScope 객체를 생성하고 그 안에서 AWSIotMqttManager의 disconnect()를 호출합니다. 이렇게 하면 콜백 메소드 내에서도 안전하게 연결을 종료하고 에러를 방지할 수 있습니다.

예제 코드


import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

// ...

val topic = "your/topic"
val qos = 0

awsIotMqttManager.subscribeToTopic(topic, qos) { topic, message ->
    // 여기서 받은 메시지 처리
    val msg = String(message.payload, Charset.forName("UTF-8"))
    Log.d("MQTT message received", ": $topic, Message: $msg")

    // 연결 종료 처리 (예: 특정 메시지를 받았을 때)
    CoroutineScope(Dispatchers.Default).launch {
        awsIotMqttManager.disconnect()
    }
}

결론

위와 같이 코드를 구성하면, 콜백 메소드 내에서도 안전하게 연결을 종료할 수 있습니다. 이는 "콜백 메소드로부터 연결을 끊는 것이 허용되지 않음 (32107)" 같은 에러를 방지하는데 큰 도움이 됩니다.


0 개의 댓글:

Post a Comment