- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当您第一次打开该应用程序时,我想要一个屏幕,您可以在其中输入经纪人信息并点击尝试并保存。
单击“尝试”时,它应该只显示一个 Snackbar
,说明该信息是否有助于成功连接。
这是按下尝试按钮时调用的代码:
private void tryConnection(View v){
if(verifyInputs()){
Snackbar.make(v, getString(R.string.trying_connection), Snackbar.LENGTH_LONG).show();
String clientId = MqttClient.generateClientId();
MqttAndroidClient client =
new MqttAndroidClient(this.getApplicationContext(), getServerAddress(),
clientId);
try {
IMqttToken token = client.connect();
final View vinner = v;
token.setActionCallback(new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
// We are connected
Snackbar.make(vinner, "Success", Snackbar.LENGTH_LONG).show();
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
// Something went wrong e.g. connection timeout or firewall problems
Snackbar.make(vinner, "Fail", Snackbar.LENGTH_LONG).show();
}
});
} catch (MqttException e) {
e.printStackTrace();
}
}
}
问题是,onFailure
似乎不会在无法连接到服务器时被调用,而是在与服务器的连接丢失时被调用。
如何只测试连接,以便存储它并返回主要 Activity ?
最佳答案
好的,所以我看不到您的完整服务、任何其他实现或您使用它的方式/位置,所以我提供了我的 MQTT 服务示例。
也许你可以比较它,找到任何问题并解决它。
或者您可以只使用我的实现。由你决定。希望对您有所帮助。
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
import org.eclipse.paho.android.service.MqttAndroidClient;
import org.eclipse.paho.client.mqttv3.IMqttActionListener;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.IMqttToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttSecurityException;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import java.util.ArrayList;
public class MyMqttService extends Service implements MqttCallback, IMqttActionListener {
private final IBinder binder = new MyBinder();
private MqttAndroidClient mqttClient;
private MqttConnectOptions mqttConnectOptions;
private static final MemoryPersistence persistence = new MemoryPersistence();
private ArrayList<MqttAndroidClient> lostConnectionClients;
private String clientId = "";
private boolean isReady = false;
private boolean doConnectTask = true;
private boolean isConnectInvoked = false;
private Handler handler = new Handler();
private final int RECONNECT_INTERVAL = 10000; // 10 seconds
private final int DISCONNECT_INTERVAL = 20000; // 20 seconds
private final int CONNECTION_TIMEOUT = 60;
private final int KEEP_ALIVE_INTERVAL = 200;
private String broker_url = "my_broker";
public MyMqttService() {}
public class MyBinder extends Binder {
public MyMqttService getService() {
return MyMqttService.this;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return binder;
}
@Override
public void onCreate() {
super.onCreate();
initMqttClient();
}
@Override
public void onDestroy() {
super.onDestroy();
disconnectClients();
if (isConnectInvoked && mqttClient != null && mqttClient.isConnected()) {
try {
// unsubscribe here
unsubscribe("¯\\_(ツ)_/¯");
mqttClient.disconnect();
} catch (MqttException e) {
Log.e("TAG", e.toString());
}
}
handler.removeCallbacks(connect);
handler.removeCallbacks(disconnect);
}
private void initMqttClient() {
if(mqttClient != null) {
mqttClient = null;
}
lostConnectionClients = new ArrayList<>();
mqttConnectOptions = new MqttConnectOptions();
mqttConnectOptions.setCleanSession(true);
mqttConnectOptions.setConnectionTimeout(CONNECTION_TIMEOUT);
mqttConnectOptions.setKeepAliveInterval(KEEP_ALIVE_INTERVAL);
setNewMqttClient();
handler.post(connect);
handler.postDelayed(disconnect, DISCONNECT_INTERVAL);
}
private void setNewMqttClient() {
mqttClient = new MqttAndroidClient(MyMqttService.this, broker_url, clientId, persistence);
mqttClient.setCallback(this);
}
public Runnable connect = new Runnable() {
public void run() {
connectClient();
handler.postDelayed(connect, RECONNECT_INTERVAL);
}
};
public Runnable disconnect = new Runnable() {
public void run() {
disconnectClients();
handler.postDelayed(disconnect, DISCONNECT_INTERVAL);
}
};
private void connectClient() {
if(doConnectTask) {
doConnectTask = false;
try {
isConnectInvoked = true;
mqttClient.connect(mqttConnectOptions, null, this);
} catch (MqttException ex) {
doConnectTask = true;
Log.e("TAG", ex.toString());
}
}
}
private void disconnectClients() {
if (lostConnectionClients.size() > 0) {
// Disconnect lost connection clients
for (MqttAndroidClient client : lostConnectionClients) {
if (client.isConnected()) {
try {
client.disconnect();
} catch (MqttException e) {
Log.e("TAG", e.toString());
}
}
}
// Close already disconnected clients
for (int i = lostConnectionClients.size() - 1; i >= 0; i--) {
try {
if (!lostConnectionClients.get(i).isConnected()) {
MqttAndroidClient client = lostConnectionClients.get(i);
client.close();
lostConnectionClients.remove(i);
}
} catch (IndexOutOfBoundsException e) {
Log.e("TAG", e.toString());
}
}
}
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
Log.e("TAG", "deliveryComplete()");
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
String payload = new String(message.getPayload());
// do something
}
@Override
public void connectionLost(Throwable cause) {
Log.e("TAG", cause.getMessage());
}
@Override
public void onSuccess(IMqttToken iMqttToken) {
isReady = true;
// subscribe here
subscribe("¯\\_(ツ)_/¯");
}
@Override
public void onFailure(IMqttToken iMqttToken, Throwable throwable) {
setNewMqttClient();
isReady = false;
doConnectTask = true;
isConnectInvoked = false;
}
private void subscribe(String topic) {
try {
mqttClient.subscribe(topic, 0);
isReady = true;
} catch (MqttSecurityException mqttSexEx) {
isReady = false;
} catch (MqttException mqttEx) {
isReady = false;
}
}
private void unsubscribe(String topic) {
try {
mqttClient.unsubscribe(topic);
} catch (MqttSecurityException mqttSecEx) {
Log.e("TAG", mqttSecEx.getMessage());
} catch (MqttException mqttEx) {
Log.e("TAG", mqttEx.getMessage());
}
}
private void publish(String topic, String jsonPayload) {
if(!isReady) {
return;
}
try {
MqttMessage msg = new MqttMessage();
msg.setQos(0);
msg.setPayload(jsonPayload.getBytes("UTF-8"));
mqttClient.publish(topic, msg);
} catch (Exception ex) {
Log.e("TAG", ex.toString());
}
}
}
我的另一个建议是只设置本地广播,这样当您的 Activity 加载并启动服务时,如果 MQTT 服务能够连接,您将发送一个广播说已连接并显示一个 Snackbar
.如果连接失败,您将发送不同的广播并显示不同的消息。
关于android - 使用 Paho MqttClient 在 Android 上尝试 Mqtt 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42189627/
当我使用 paho 和 spring 框架修复应用程序中客户端的一些问题时,我发现了 spring MQTT 集成。我不确定这是否能解决我的问题,我什至不确定这是什么。 有人可以解释一下两者一起使用有
我正在尝试设置一个 mqtt 客户端,但我收到一个 ImportError: 我安装了 paho: pip install paho-mqtt 它说:成功安装 dnspython-1.15.0 pah
我的 raspberrypi 上的以下 python 代码没有连接到我的 mqtt 代理,它只是在打印 Connecting... 后挂起: import paho.mqtt.client as mq
当我通过 MQTTLens 测试发布时,它有效。然而,当我按下按钮时,它确实会触发“on_publish”,但另一端的 on_message 没有收到任何内容;它没有被触发。有两个 Raspberry
我正在使用 Java Paho MQTT 客户端库通过 MQTT 连接到服务器。 库支持使用签名证书进行身份验证和加密的 TLS/SSL。 但是,如果我只是使用用户名和密码进行身份验证(如下所示),而
我的 python paho-mqtt client无法连接到用 java 编写的代理。代理已使用 jks 类型证书启用 SSL 连接。经纪人不在我的管理范围内。 我将 jks 证书转换为 pem 证
如果连接丢失,我的 paho-mqtt 服务无法重新连接到代理。 在连接丢失时,我使用 adb shell 从 Android 客户端 ping 两个代理,并从托管 mosquito 代理的服务器 (
我在笔记本电脑上运行 MQTT Mosquitto 代理。然后我尝试将 2 个 Paho MQTT 客户端连接到它:1)使用 Java Paho 从 Android 手机和 2)使用 Python
有没有一种优雅的方法可以从代理中提取一条消息而不必: 订阅 创建一个 on_message() 接收消息 退订 我问是因为我们使用了一个包含多个字段的 json 消息。当新数据进入时,我只想更新 js
我正在使用适用于 Android 的 Paho MQTT 库,我的应用程序正在交换实时编辑数据。我想在应用程序与代理断开连接时禁用编辑文本,并在重新建立连接时启用它。 第一部分很简单,MqttCall
我正在使用 Eclipse MQTT 库 Paho,但我找不到方法来决定客户端与代理的连接何时建立。 有人知道目前是否有办法做到这一点吗? 我似乎在文档中的 MqttCallback 类中找不到任
我对 paho mqtt 库有一个小问题。我注册了回调函数 MQTTClient_messageArrived 和 MQTTClient_connectionLost。 我在此回调函数中调用 MQTT
我使用 Apache Artemis 作为我的 mqtt 代理。我有一个以主从方式配置的 Artemis 集群。当主服务器发生故障时,备份服务器接管,客户端必须连接到从服务器。主站和从站有不同的IP。
我目前正在开发一个应该在医疗机构中运行的小型“紧急按钮”应用程序。由于该项目的假设之一是独立于 Internet,因此我决定使用在本地 WLAN 中设置服务器的 MQTT。 我已经实现了 Paho A
我正在尝试使用基本的 Eclipse Paho MQTT 客户端版本 1.1.0,用于连接到 CloudAMQP RabbitMQ 实例、订阅主题并接收消息(我从 Web 管理控制台发送的消息)。 如
我已经创建了 mqtt 连接suscribeData(),如下所示,以 24/7 从多个设备接收数据 @RequestMapping("/suscribe") @ResponseBody public
我最近开始使用 paho mqtt for java 和 mqtt,但我坚持使用 mqtt 代理和 paho 客户端本身提供的持久性机制。也许我误解了(可能就是这样)mqtt 上下文中的持久性概念。
我是 MQTT 和树莓派的新手!我正在运行一个客户端脚本,我只是使用另一个脚本发布一条消息。我正在使用自己的 Mosquitto 代理。 客户: import paho.mqtt.client as
我设法在我的 RPi 中的 Paho-MQTT 客户端和我的 VPS 中的 MQTT 代理之间建立了连接。 现在我正在尝试保护 MQTT 连接,并且我已将用户和密码添加到代理。我更改了 mosquit
为了演示 Paho MQTT,我下载了一个 Java 示例。 public class Thermometer { public static final String BROKER_URL
我是一名优秀的程序员,十分优秀!