mqtt android简书,【MQTT】客户端

Mqtt客户端

首先我们得需要mqtt3.jar包

mqtt3下载连接

package com.clientmqtt;

import android.content.Context;

import android.telephony.TelephonyManager;

import org.eclipse.paho.client.mqttv3.MqttCallback;

import org.eclipse.paho.client.mqttv3.MqttClient;

import org.eclipse.paho.client.mqttv3.MqttConnectOptions;

import org.eclipse.paho.client.mqttv3.MqttException;

import org.eclipse.paho.client.mqttv3.MqttTopic;

import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

import java.util.concurrent.ScheduledExecutorService;

import static android.content.Context.TELEPHONY_SERVICE;

public class ClientMQTT {

//注意这里 改成搭建服务器地址

public static final String HOST = "tcp://192.168.10.67:61613";

public static final String TOPIC = "topic11";

private String clientid = "client";

private MqttClient client;

private MqttConnectOptions options;

private String userName = "admin";

private String passWord = "password";

private MqttCallback mMqttCallback;

private ScheduledExecutorService scheduler;

public void start() {

try {

// host为主机名,clientid即连接MQTT的客户端ID,一般以唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存

client = new MqttClient(HOST, clientid, new MemoryPersistence());

// MQTT的连接设置

options = new MqttConnectOptions();

// 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接

options.setCleanSession(true);

// 设置连接的用户名

options.setUserName(userName);

// 设置连接的密码

options.setPassword(passWord.toCharArray());

// 设置超时时间 单位为秒

options.setConnectionTimeout(10);

// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制

options.setKeepAliveInterval(20);

// 设置回调

client.setCallback(mMqttCallback);

client.setTimeToWait(500000);

MqttTopic topic = client.getTopic(TOPIC);

//setWill方法,如果项目中需要知道客户端是否掉线可以调用该方法。设置最终端口的通知消息

options.setWill(topic, "close".getBytes(), 2, true);

client.connect(options);

//订阅消息

int[] Qos = {1};

String[] topic1 = {TOPIC};

client.subscribe(topic1, Qos);

} catch (Exception e) {

e.printStackTrace();

}

}

public ClientMQTT(MqttCallback mqttCallback ,Context context) {

TelephonyManager TelephonyMgr = (TelephonyManager)context.getSystemService(TELEPHONY_SERVICE);

this.clientid=TelephonyMgr.getDeviceId();

this.mMqttCallback=mqttCallback;

start();

}

public void connect() {

try {

client.connect(options);

//订阅消息

int[] Qos = {1};

String[] topic1 = {TOPIC};

client.subscribe(topic1, Qos);

} catch (MqttException e) {

e.printStackTrace();

}

}

public void disconnect() {

try {

client.disconnect();

} catch (MqttException e) {

e.printStackTrace();

}

}

}

package com.clientmqtt;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.support.v7.app.AppCompatActivity;

import android.view.View;

import android.widget.TextView;

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;

import org.eclipse.paho.client.mqttv3.MqttCallback;

import org.eclipse.paho.client.mqttv3.MqttMessage;

public class MainActivity extends AppCompatActivity {

private static final String TAG = "MainActivity";

private ClientMQTT mClientMQTT;

private TextView mButton;

public Handler myHandler = new Handler() {

public void handleMessage(Message msg) {

mButton.setText(msg.obj+"");

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mButton = (TextView) findViewById(R.id.jieshou);

findViewById(R.id.create).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

mClientMQTT = new ClientMQTT(new MqttCallback() {

@Override

public void connectionLost(Throwable cause) {

System.out.println("连接断开,可以做重连");

// mClientMQTT.connect();

}

@Override

public void messageArrived(String topic, MqttMessage message) throws Exception {

// subscribe后得到的消息会执行到这里面

System.out.println("接收消息主题 : " + topic);

System.out.println("接收消息Qos : " + message.getQos());

System.out.println("接收消息内容 : " + new String(message.getPayload()));

if("close".equals(new String(message.getPayload()))){

System.out.println("接收消息内容 : " + new String(message.getPayload()));

}else {

Message message1 =new Message();

message1.obj=new String(message.getPayload());

myHandler.sendMessage(message1);

System.out.println("接收消息内容 mButton: " + new String(message.getPayload()));

}

}

@Override

public void deliveryComplete(IMqttDeliveryToken token) {

System.out.println("deliveryComplete---------" + token.isComplete());

}

},MainActivity.this);

}

});

findViewById(R.id.connect).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

mClientMQTT.connect();

}

});

findViewById(R.id.disconnect).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

mClientMQTT.disconnect();

}

});

}

}

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

>

android:id="@+id/create"

android:onClick="onClick"

android:layout_width="match_parent"

android:layout_height="50dp"

android:text="创建连接!"

/>

android:id="@+id/connect"

android:text="重新连接!"

android:onClick="onClick"

android:layout_width="match_parent"

android:layout_height="50dp"/>

android:id="@+id/disconnect"

android:text="断开连接!"

android:onClick="onClick"

android:layout_width="match_parent"

android:layout_height="50dp"/>

android:id="@+id/jieshou"

android:gravity="center"

android:layout_width="match_parent"

android:layout_height="wrap_content"/>

服务端发来的消息

68efe68a2c51

Paste_Image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现 MQTT Android 客户端可以使用 Eclipse Paho MQTT 客户端库。下面是一个简单的实现步骤: 1. 添加依赖 在项目的 build.gradle 文件中添加以下依赖: ```groovy dependencies { implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5' implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1' } ``` 2. 创建 MQTT 客户端 创建一个 MqttAndroidClient 对象,并设置连接参数。这里需要设置 MQTT 服务器的 URL、客户端 ID、用户名和密码等信息。 ```java String serverUri = "tcp://mqtt.eclipse.org:1883"; String clientId = MqttClient.generateClientId(); MqttAndroidClient client = new MqttAndroidClient(context, serverUri, clientId); MqttConnectOptions options = new MqttConnectOptions(); options.setUserName("username"); options.setPassword("password".toCharArray()); ``` 3. 连接到 MQTT 服务器 使用 MqttAndroidClient 对象连接到 MQTT 服务器。可以设置一个回调函数来处理连接结果。 ```java IMqttToken token = client.connect(options); token.setActionCallback(new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { // 连接成功 } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { // 连接失败 } }); ``` 4. 订阅 MQTT 主题 通过 MqttAndroidClient 对象订阅一个或多个 MQTT 主题。可以设置一个回调函数来处理接收到的消息。 ```java String topic = "my/topic"; int qos = 1; IMqttToken subToken = client.subscribe(topic, qos); subToken.setActionCallback(new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { // 订阅成功 } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { // 订阅失败 } }); client.setCallback(new MqttCallbackExtended() { @Override public void connectComplete(boolean reconnect, String serverURI) { // 连接完成 } @Override public void connectionLost(Throwable cause) { // 连接断开 } @Override public void messageArrived(String topic, MqttMessage message) throws Exception { // 接收到消息 } @Override public void deliveryComplete(IMqttDeliveryToken token) { // 消息传递完成 } }); ``` 5. 发布 MQTT 消息 通过 MqttAndroidClient 对象发布一条 MQTT 消息到指定主题。 ```java String topic = "my/topic"; String payload = "Hello, MQTT!"; int qos = 1; boolean retained = false; IMqttDeliveryToken pubToken = client.publish(topic, payload.getBytes(), qos, retained); pubToken.setActionCallback(new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { // 发布成功 } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { // 发布失败 } }); ``` 以上就是一个简单的 MQTT Android 客户端的实现步骤。需要注意的是,如果需要在后台使用 MQTT 客户端,可以使用 Eclipse Paho Android Service,它提供了在后台运行的 MQTT 连接和订阅功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值