Kotlin 客户机如何知道它是否已经订阅了MQTT主题?

Kotlin 客户机如何知道它是否已经订阅了MQTT主题?,kotlin,mqtt,aws-iot,Kotlin,Mqtt,Aws Iot,我订阅了一个MQTT主题(在我的例子中,它是应用程序唯一的用户id)。我正在使用AWS IOT核心服务进行订阅。每当主屏幕打开,我收到来自awsConnectClient的连接回调时,我都会呼叫订阅。现在,如果应用程序被打开三次,它会订阅同一主题三次。现在,每当任何消息发布到该主题时,它都会被应用程序接收三次 现在我想做的是,我想知道,如果这个用户ID已经从这个设备上订阅了,我不会再从同一个设备上调用订阅 一种方法是,如果我在我的应用程序中保存我已经订阅了这个主题,并且不再进行订阅呼叫。但我怀疑

我订阅了一个MQTT主题(在我的例子中,它是应用程序唯一的用户id)。我正在使用AWS IOT核心服务进行订阅。每当主屏幕打开,我收到来自awsConnectClient的连接回调时,我都会呼叫订阅。现在,如果应用程序被打开三次,它会订阅同一主题三次。现在,每当任何消息发布到该主题时,它都会被应用程序接收三次

现在我想做的是,我想知道,如果这个用户ID已经从这个设备上订阅了,我不会再从同一个设备上调用订阅

一种方法是,如果我在我的应用程序中保存我已经订阅了这个主题,并且不再进行订阅呼叫。但我怀疑这种方法是否适用于所有场景。如果任何aws iot api可以告诉我这已经订阅了,我们是否可以仅从服务器端驱动这种逻辑

fun connectClick() {
    Log.d(TAG, "clientId = $clientId")

    try {
        mqttManager.connect(clientKeyStore) { status, throwable ->
            Log.d(TAG, "Status = " + status.toString())
            var formattedStatus = String.format(getString(R.string.status_msg),status.toString())

            if (status == AWSIotMqttClientStatusCallback.AWSIotMqttClientStatus.Connected) {
                Log.i(TAG, " subscribed to - " + VoiceXPreference(this).rosterName)
                unsubscribe()
                subscribeClick(VoiceXPreference(this).rosterName)
            }
            runOnUiThread {
                tv_iot_status.text = formattedStatus
                if (throwable != null) {
                    Log.e(TAG, "Connection error.", throwable)
                }
            }
        }
    } catch (e: Exception) {
        Log.e(TAG, "Connection error.", e)
    }

}
上面是我的订阅代码。虽然我总是在订阅之前取消订阅,但这对我来说不起作用

下面是发出连接请求的initClient调用。我添加了if检查mqttManager是否已初始化首先断开连接,然后发出连接请求。虽然我将initRequest放在应用程序屏幕的onCreate()回调中,当应用程序打开时只调用一次。我检查了日志,只调用了一次

AWSMobileClient.getInstance().initialize(this, object : Callback<UserStateDetails> {
            override fun onResult(result: UserStateDetails) {
                Log.i(TAG,"connect request called");
                if(mqttManager != null){
                    mqttManager?.disconnect()
                }
                initIoTClient()
            }

            override fun onError(e: Exception) {
                Log.e(TAG, "onError: ", e)
            }
        })
我也总是在我的应用程序屏幕的onDestroy()内发出disconnect()请求

mqttManager?.disconnect()

但我仍然收到3条订阅消息,而不是1条。

您收到3条重复消息不是因为您订阅了3次,而是因为您创建了3个单独的连接

报告明确指出

如果服务器接收到包含与现有订阅的主题筛选器相同的主题筛选器的订阅数据包,则必须使用新订阅完全替换该现有订阅

这意味着每次连接都不会发生重复订阅,除非服务器的实现已损坏

当调用代码块时,在创建新连接时,您的代码看起来不会发送断开连接请求


您应该保留一个MQTT会话,或者确保在应用程序关闭时关闭连接。

非常感谢您的回复。我已经采纳了您在这里提到的所有建议,但我仍然面临相同的问题。我已经更新了上面的帖子,添加了订阅和连接代码片段。请看看你是否真的能在这里提供更多帮助。@priyadhingra19 1。我不知道您使用的是什么API,特别是
mqttManager
是什么实例?2.在调用
connect()
3之前,应该先检查连接。考虑使用<代码> ONPAUSER()/<代码>或<代码> OnStutter()/<代码>,而不是<代码> OnDeSturyYes()/代码>。它现在起作用了。我发现问题是在服务器端,服务器正在进行多重连接。我已经修复,它现在工作正常。非常感谢您的快速回复help@priyadhingra19没问题。但奇怪的是,服务器建立了多个连接。请考虑投票和标记答案,如果它有帮助:对标题的简短回答是,它不能,除非它跟踪它的自我
mqttManager?.disconnect()