我正在制作一个 android 应用程序,以使用 android studio 与自行车安全系统进行通信。该应用程序使用 MQTT 协议与远程服务器通信,该服务器将充当代理并将消息中继到安全系统,该安全系统具有允许互联网连接的微控制器和 GSM 模块。
我遇到的问题与 Eclipse Paho Mqtt Android 客户端有关。这是一个简洁的库,包含实现 MQTT 协议的函数。到目前为止,我已经设法在服务器和应用程序之间建立了连接。至少它看起来是这样的。请参阅下图,其中显示了我的 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/