- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 AndroidService 来监听 MQTT 消息。下面是代码。由于某种原因,该服务能够连接和订阅 channel ,但无法读取消息。 messageArrived
永远不会被调用。
public class FollowService extends Service implements MqttCallback{
private final IBinder localBinder = new FollowServiceBinder();
private final String TAG = "Service";
private MqttClient mqClient;
public class FollowServiceBinder extends Binder {
public FollowService getService() {
return FollowService.this;
}
}
public FollowService() {
}
@Override
public IBinder onBind(Intent intent) {
return localBinder;
}
@Override
public void onCreate() {
super.onCreate();
try {
mqClient = new MqttClient("tcp://192.168.1.46:1883", "sadfsfi", new MemoryPersistence());
mqClient.connect();
Log.i(TAG, "Connected to client");
}
catch(MqttException me){
Log.e(TAG, "MqttClient Exception Occured in on create!!!", me);
}
}
@Keep
public void beginFollowing(){
try {
mqClient.subscribe("test");
Log.i(TAG, "Subscribed test");
}
catch (MqttException me){
Log.e(TAG, "MqttClient Exception Occured in following!!!", me);
}
}
@Override
public void connectionLost(Throwable cause) {
Log.i(TAG, "ConnectionLost");
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
Log.i(TAG, "Delivered");
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
Log.i(TAG, "Received update: " + topic + ":" + message.toString());
}
}
最佳答案
有Eclipse Paho Android Service您可以使用它专用于 Android 而不是常规 MqttClient
,它可能会解决您的问题(如果您确定问题不在您的 MQTT 服务器端)以及您将来如果想解决 Android MQTT 服务可能遇到的其他问题:
如果你想尝试一下:
在build.gradle
:
compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.0.3-SNAPSHOT'
compile ('org.eclipse.paho:org.eclipse.paho.android.service:1.0.3-SNAPSHOT'){
exclude module: 'support-v4'
}
compile 'com.android.support:support-v4:22.1.0'
在AndroidManifest.xml
:
<uses-permission android:name="android.permission.INTERNET" />
在你的<application></application>
:
<service android:name="org.eclipse.paho.android.service.MqttService" />
这是一个例子MqttHandler.java
:
public class MqttHandler {
protected final static String TAG = DeviceHandler.class.getSimpleName();
/**
* MQTT client
*/
private MqttAndroidClient mClient = null;
/**
* client ID used to authenticate
*/
protected String mClientId = "";
/**
* Android context
*/
private Context mContext = null;
/**
* callback for MQTT events
*/
private MqttCallback mClientCb = null;
/**
* callback for MQTT connection
*/
private IMqttActionListener mConnectionCb = null;
/**
* Sets whether the client and server should remember state across restarts and reconnects
*/
protected boolean mCleanSessionDefault = false;
/**
* Sets the connection timeout value (in seconds)
*/
protected int mTimeoutDefault = 30;
/**
* Sets the "keep alive" interval (in seconds)
*/
protected int mKeepAliveDefault = 60;
/**
* connection state
*/
private boolean connected = false;
/**
* list of message callbacks
*/
private List<IMessageCallback> mMessageCallbacksList = new ArrayList<>();
private final static String SERVER_URI = "192.168.1.46";
private final static int SERVER_PORT = 1883;
public MqttHandler(Context context) {
this.mContext = context;
this.mClientCb = new MqttCallback() {
@Override
public void connectionLost(Throwable cause) {
connected = false;
for (int i = 0; i < mMessageCallbacksList.size(); i++) {
mMessageCallbacksList.get(i).connectionLost(cause);
}
}
@Override
public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
for (int i = 0; i < mMessageCallbacksList.size(); i++) {
mMessageCallbacksList.get(i).messageArrived(topic, mqttMessage);
}
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
for (int i = 0; i < mMessageCallbacksList.size(); i++) {
mMessageCallbacksList.get(i).deliveryComplete(token);
}
}
};
}
public boolean isConnected() {
if (mClient == null)
return false;
else
return connected;
}
public void connect() {
try {
if (!isConnected()) {
MqttConnectOptions options = new MqttConnectOptions();
String serverURI = "";
options.setCleanSession(mCleanSessionDefault);
options.setConnectionTimeout(mTimeoutDefault);
options.setKeepAliveInterval(mKeepAliveDefault);
mClient = new MqttAndroidClient(mContext, "tcp://" + SERVER_URI + ":" + SERVER_PORT, mClientId);
mClient.setCallback(mClientCb);
mConnectionCb = new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken iMqttToken) {
connected = true;
for (int i = 0; i < mMessageCallbacksList.size(); i++) {
mMessageCallbacksList.get(i).onConnectionSuccess(iMqttToken);
}
}
@Override
public void onFailure(IMqttToken iMqttToken, Throwable throwable) {
connected = false;
for (int i = 0; i < mMessageCallbacksList.size(); i++) {
mMessageCallbacksList.get(i).onConnectionFailure(iMqttToken, throwable);
}
}
};
try {
mClient.connect(options, mContext, mConnectionCb);
} catch (MqttException e) {
e.printStackTrace();
}
} else {
Log.v(TAG, "cant connect - already connected");
}
} catch (IllegalArgumentException e) {
Log.v(TAG, "parameters error. cant connect");
}
}
public void disconnect() {
if (isConnected()) {
try {
mClient.disconnect(mContext, mConnectionCb);
} catch (MqttException e) {
e.printStackTrace();
}
} else {
Log.v(TAG, "cant disconnect - already disconnected");
}
}
/**
* Publish a message to MQTT server
*
* @param topic message topic
* @param message message body
* @param isRetained define if message should be retained on MQTT server
* @param listener completion listener (null allowed)
* @return
*/
public IMqttDeliveryToken publishMessage(String topic, String message, boolean isRetained, IMqttActionListener listener) {
if (isConnected()) {
MqttMessage mqttMessage = new MqttMessage(message.getBytes());
mqttMessage.setRetained(isRetained);
mqttMessage.setQos(0);
try {
return mClient.publish(topic, mqttMessage, mContext, listener);
} catch (MqttPersistenceException e) {
e.printStackTrace();
} catch (MqttException e) {
e.printStackTrace();
}
} else {
Log.e(TAG, "cant publish message. Not connected");
}
return null;
}
/**
* Subscribe to topic
*
* @param topic topic to subscribe
* @param listener completion listener (null allowed)
* @return
*/
public void subscribe(String topic, IMqttActionListener listener) {
if (isConnected()) {
try {
mClient.subscribe(topic, 0, mContext, listener);
} catch (MqttException e) {
e.printStackTrace();
}
} else {
Log.e(TAG, "cant publish message. Not connected");
}
}
/**
* Unsubscribe a topic
*
* @param topic topic to unsubscribe
* @param listener completion listener (null allowed)
*/
public void unsubscribe(String topic, IMqttActionListener listener) {
if (isConnected()) {
try {
mClient.unsubscribe(topic, mContext, listener);
} catch (MqttException e) {
e.printStackTrace();
}
} else {
Log.e(TAG, "cant publish message. Not connected");
}
}
public void addCallback(IMessageCallback callback) {
mMessageCallbacksList.add(callback);
}
}
有了这个监听器 IMessageCallback.java
:
public interface IMessageCallback {
/**
* This method is called when the connection to the server is lost.
*
* @param cause the reason behind the loss of connection.
*/
void connectionLost(Throwable cause);
/**
* This method is called when a message arrives from the server.
*
* @param topic name of the topic on the message was published to
* @param mqttMessage the actual message
* @throws Exception
*/
void messageArrived(String topic, MqttMessage mqttMessage) throws Exception;
/**
* Called when delivery for a message has been completed, and all acknowledgments have been received.
*
* @param messageToken he delivery token associated with the message.
*/
void deliveryComplete(IMqttDeliveryToken messageToken);
/**
* Called when connection is established
*
* @param iMqttToken token for this connection
*/
void onConnectionSuccess(IMqttToken iMqttToken);
/**
* Called when connection has failed
*
* @param iMqttToken token when failure occured
* @param throwable exception
*/
void onConnectionFailure(IMqttToken iMqttToken, Throwable throwable);
/**
* Called when disconnection is successfull
*
* @param iMqttToken token for this connection
*/
void onDisconnectionSuccess(IMqttToken iMqttToken);
/**
* Called when disconnection failed
*
* @param iMqttToken token when failure occured
* @param throwable exception
*/
void onDisconnectionFailure(IMqttToken iMqttToken, Throwable throwable);
}
你可以这样调用它:
final MqttHandler mqttHandler = new MqttHandler(mContext);
mqttHandler.addCallback(new IMessageCallback() {
@Override
public void connectionLost(Throwable cause) {
Log.v(TAG, "connectionLost");
}
@Override
public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
Log.v(TAG, "messageArrived : " + topic + " : " + new String(mqttMessage.getPayload()));
}
@Override
public void deliveryComplete(IMqttDeliveryToken messageToken) {
try {
Log.v(TAG, "deliveryComplete : " + new String(messageToken.getMessage().getPayload()));
} catch (MqttException e) {
e.printStackTrace();
}
}
@Override
public void onConnectionSuccess(IMqttToken iMqttToken) {
Log.v(TAG, "connection success");
mqttHandler.subscribe("test", new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
Log.v(TAG, "subscribe success");
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
Log.e(TAG, "subscribe failure");
}
});
}
@Override
public void onConnectionFailure(IMqttToken iMqttToken, Throwable throwable) {
Log.v(TAG, "connection failure");
}
@Override
public void onDisconnectionSuccess(IMqttToken iMqttToken) {
Log.v(TAG, "disconnection success");
}
@Override
public void onDisconnectionFailure(IMqttToken iMqttToken, Throwable throwable) {
Log.v(TAG, "disconnection failure");
}
});
mqttHandler.connect();
您可以使用 Paho Mqtt Android 客户端找到完整的工作用例 here
关于使用 Paho 客户端的安卓 MQTT。无法接收消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38426855/
当我使用 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
我是一名优秀的程序员,十分优秀!