티스토리 뷰

 

1. 문제 상황

라즈베리파이와 Spring 서버는 Mqtt로 통신한다.

이때 AWS IoT 라이브러리 또한 사용한다.

근데 왜인지... Connection이 3~4초 단위로 끊긴다...

 

 

 

2. 문제 해결

 

(1) AWSIotMqttClient 설정 문제?

 

나와 같은 문제를 겪는 사람을 스택오버플로우에서 찾았다.

차이점은 저 사람은 10분 단위로 끊기고 나는 3초 단위로 끊긴다는 거... 

답변에 있는 방법으로 setKeepAliveInterval 속성 등을 수정해보고, setConnectionTimeout 등도 수정해 보았지만 오류는 여전하다...

 

(2) Client ID 문제?

다른 사이트에 올라온 코드를 보다가 Client ID를 동적으로 생성하는 부분을 보았다.

나는 위 사진처럼 Client ID를 고정된 값으로 두고 있다.

client = new AWSIotMqttClient(MQTT_CLIENT_ENDPOINT, 
		    MQTT_CLIENT_ID + new BigInteger(64, new SecureRandom()).toString(32), 
                    readStore(), 
                    KEYPASS);

 

GPT

따라서, 여러 디바이스 또는 애플리케이션이 AWS IoT에 동시에 연결되는 경우, 각각 고유한 clientId를 사용해야 합니다. 동일한 디바이스가 여러 번 재연결하는 경우에는 같은 clientId를 사용할 수 있지만, 동시에 여러 연결을 유지하려면 clientId가 고유해야 합니다.

특정 상황에서 필요에 따라 clientId를 동적으로 생성하여 사용할 수도 있습니다. 예를 들어, UUID를 사용하거나 디바이스의 고유 식별자를 기반으로 clientId를 생성할 수 있습니다.

 

 

그렇다고 한다! 나는 로컬, 서버 등등에서 동시에 같은 ID를 사용해서 접속을 해왔다. 

동적으로 바꿔보자.

    @Bean
    public AWSIotMqttClient mqttClient() {
        // CLient ID 동적 생성
        AWSIotMqttClient mqttClient = new AWSIotMqttClient(clientEndpoint, clientId  + new BigInteger(64, new SecureRandom()).toString(32), accessKeyId, secretAccessKey);
        mqttClient.setConnectionTimeout(30);
        mqttClient.setServerAckTimeout(10);
        mqttClient.setKeepAliveInterval(0);
        return mqttClient;
    }

 

 

헉 된다!!!! 연결 안정적으로 된다!!! 값도 잘가져온다!!!

몇 주동안 고생했던 문제라 너무 뿌듯하다...

 

Mqtt 통신에 사용되는 Client ID는 고유한 값이어야 한다!

기억하자!

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함