Приложение подписано на MQTT topi c, но в нем отсутствуют некоторые сообщения, опубликованные в этой теме - PullRequest
0 голосов
/ 04 августа 2020

Я использую AWS Iot на Android. Я хочу получить теневое состояние определенной вещи c. Это код:

mqttManager = new AWSIotMqttManager(clientId, CUSTOMER_SPECIFIC_ENDPOINT);

String subTopic = "$aws/things/<thingName>/shadow/get/accepted";
mqttManager.subscribeToTopic(subTopic, AWSIotMqttQos.QOS0, new AWSIotMqttNewMessageCallback() {
                        @Override
                        public void onMessageArrived(String topic, byte[] data) {
                            // do something
                        });

String pubTopic = "$aws/things/<thingName>/shadow/get";                        
mqttManager.publishString("", pubTopic, AWSIotMqttQos.QOS0);

Странно то, что он работает один раз, затем я повторно запускаю код, и он не работает, я снова запускаю его, и он работает. Почему?

1 Ответ

0 голосов
/ 05 августа 2020

Проблема в том, что клиент публикует до завершения подписки . К счастью, метод subscribeToTopi c принимает другой обратный вызов, который возвращается по завершении подписки. Вот тогда мы можем смело публиковать sh. Код выглядит так:

String subTopic = "$aws/things/<thingName>/shadow/get/accepted";
mqttManager.subscribeToTopic(subTopic, 
                        AWSIotMqttQos.QOS0, 
                        new AWSIotMqttSubscriptionStatusCallback() {
                        
                            @Override
                            public void onSuccess() {
                                String pubTopic = "$aws/things/<thingName>/shadow/get";                        
                                mqttManager.publishString("", pubTopic, AWSIotMqttQos.QOS0);
                            }

                            @Override
                            public void onFailure(Throwable exception) {

                            }
                            
                        },
                        new AWSIotMqttNewMessageCallback() {
                            @Override
                            public void onMessageArrived(String topic, byte[] data) {
                                // do something
                            } 
                        });
...