关于 Eclipse Paho Mqtt Android 客户端库函数“isConnected”的问题?

物联网 MQTT 安卓 帕霍 eclipse-iot
2021-05-29 17:44:15

我正在制作一个 android 应用程序,以使用 android studio 与自行车安全系统进行通信。该应用程序使用 MQTT 协议与远程服务器通信,该服务器将充当代理并将消息中继到安全系统,该安全系统具有允许互联网连接的微控制器和 GSM 模块。

我遇到的问题与 Eclipse Paho Mqtt Android 客户端有关。这是一个简洁的库,包含实现 MQTT 协议的函数。到目前为止,我已经设法在服务器和应用程序之间建立了连接。至少它看起来是这样的。请参阅下图,其中显示了我的 logcat 消息。Android Studio 中的 logcat 消息

它似乎确实已连接,每分钟发出一次 ping 信号。唯一的问题是,当我尝试使用 isConnected 函数验证连接是否存在时,它总是告诉我我没有连接。你可以在下面看到我的代码。如果你需要下载这个库或者你想看它,这里是一个链接 -> https://github.com/eclipse/paho.mqtt.android

另外,我想稍微解释一下我的代码,以便您知道您在看什么。请仔细阅读。

它在科特林。我创建了一个在主要活动中实例化的 Client_MQTT 类。此类包含 MqttAndroidClient 的实例(来自 paho 库)。此实例在构造函数中实例化,并命名为 MqttClient。有一个连接功能可以完成所有繁忙的工作并连接到服务器。还有一个名为 ConnectionAlive 的函数。它所做的唯一一件事就是返回 MqttClient.isConnected()。

我的代码的另一部分是 MainActivity,其中实例化了 Client_MQTT 类并调用了连接函数。最重要的是,这是我做一个简单的 if 检查连接是否有效的地方。它总是说不,但我知道那不可能是对的。

现在你可以看到代码了。

package com.chymera_security.application

import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import org.eclipse.paho.android.service.MqttAndroidClient
import org.eclipse.paho.client.mqttv3.IMqttActionListener
import org.eclipse.paho.client.mqttv3.IMqttToken
import org.eclipse.paho.client.mqttv3.MqttException
import org.eclipse.paho.client.mqttv3.MqttClient
import androidx.core.app.ComponentActivity.ExtraData
import androidx.core.content.ContextCompat.getSystemService
import android.icu.lang.UCharacter.GraphemeClusterBreak.T
import androidx.fragment.app.FragmentActivity
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    var Client = Client_MQTT(this.getApplicationContext()) //passing in the context
    //var client = MqttAndroidClient(this.getApplicationContext(), "tcp://io.adafruit.com:1883",
    //   ConnectThis.ClientId)
    Client.connect()
    if (Client.ConnectionAlive()) {
     ViewAlarmStatus.text = "Connected to server." //You can replace this with a simple log statement
    } else {
      ViewAlarmStatus.text = "Not connected to server."
    }
  }
}

——

package com.chymera_security.application

import android.content.Context
import android.util.Log
import org.eclipse.paho.android.service.MqttAndroidClient
import org.eclipse.paho.client.mqttv3.*

class Client_MQTT constructor(context_param: Context){

  internal var options = MqttConnectOptions()
    internal lateinit var ClientId : String
    internal lateinit var MqqtClient: MqttAndroidClient
    internal lateinit var context : Context

    init {
      options.userName = "Put your username here"
      options.password = "password here".toCharArray()
      ClientId = MqttClient.generateClientId()
      context = context_param
      MqqtClient = MqttAndroidClient(context, "tcp://io.adafruit.com:1883", ClientId)
  }

  fun connect() {
    try {
      val token = MqqtClient.connect(options)
      token.actionCallback = object : IMqttActionListener {
        override fun onSuccess(asyncActionToken: IMqttToken) {
          Log.i("Connection", "Connected to server ")
          //connectionStatus = true
          // Give your callback on connection established here
        }
        override fun onFailure(asyncActionToken: IMqttToken, exception: Throwable) {
          //connectionStatus = false
          Log.i("Connection", "failure")
          // Give your callback on connection failure here
          exception.printStackTrace()
        }
      }
    } catch (e: MqttException) {
      // Give your callback on connection failure here
      e.printStackTrace()
    }

  }
  fun ConnectionAlive (): Boolean{
    return MqqtClient.isConnected()
  }
}

如果您对此有任何了解,请分享。我真的连接到服务器了吗?看起来像,但 isConnected 不同意。关于我如何使用 isConnected 是否存在一些概念上的误解?我只是用错了,还是这是一些疯狂的错误?很想听听你的意见。

额外资源:https : //medium.com/@chaitanya.bhojwani1012/eclipse-paho-mqtt-android-client-using-kotlin-56129ff5fbe7

https://www.hivemq.com/blog/mqtt-client-library-enyclopedia-paho-android-service/

1个回答

所以事实证明问题不在于 isConnected() 函数。问题是我正在检查它是否连接得太快。connect 函数是异步的,这意味着它在后台执行。所以当它尝试连接时,我问它是否在完成之前连接。为了解决这个问题,我向我的一个按钮添加了一个 onClickListener 并在应用程序启动几秒钟后按下按钮来检查状态。