注册

基于环信MQTT消息云,Android端快速实现消息收发

本文介绍Android端如何连接环信MQTT消息云快速实现消息的自收自发。

一、前提条件

1、部署Android开发环境

下载安装Android studio,配置好开发环境

2、导入项目依赖

在项目根目录build.gradle文件里配置
repositories {
maven {
url "https://repo.eclipse.org/content/repositories/paho-snapshots/"
}
}
另需要在app的build.gradle里添加依赖
dependencies {
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
}

二、实现流程

1、获取鉴权

首先需要登录环信云console控制台,获取到AppID、连接地址、连接端口,然后代码实现获取token

客户端获取token代码实例如下:

//使用okhttp实现的获取token
JSONObject reqBody = new JSONObject();
reqBody.put("grant_type", "password");
reqBody.put("username", "hxtest");
reqBody.put("password", "1");
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody requestBody = RequestBody.create(mediaType, reqBody.toString());
Request request = new Request.Builder()
.url("https://{token域名}/{org_name}/{app_name}/token")
.post(requestBody)
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "okhttp_onFailure:" + e.getMessage());
}

@Override
public void onResponse(Call call, Response response) throws IOException {
String responseBody = response.body().string();
if (response.code() == 200) {
try {
JSONObject result = new JSONObject(responseBody);
String token = result.getString("access_token");
} catch (JSONException e) {
e.printStackTrace();
}
}
}
});



2、初始化
在项目中创建MQTT客户端,客户端初始配置包括创建clientID,topic名称,QoS质量,连接地址等信息。

//连接时使用的clientId, 必须唯一
String clientId = String.format("%s@%s", userName, appId);
MqttAndroidClient mMqttClient = new MqttAndroidClient(context, String.format("tcp://%s:%s", mqttUri, mqttPort), clientId);


3、连接服务器

调用connect()函数连接至环信MQTT消息云

//连接参数
MqttConnectOptions options;
options = new MqttConnectOptions();
//设置自动重连
options.setAutomaticReconnect(true);
// 缓存
options.setCleanSession(true);
// 设置超时时间,单位:秒
options.setConnectionTimeout(15);
// 心跳包发送间隔,单位:秒
options.setKeepAliveInterval(15);
// 用户名
options.setUserName(userName);
// 密码
options.setPassword(token.toCharArray());
options.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1);
//进行连接
mMqttClient.connect(options, null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {

}

@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {

}
});


4、订阅

【订阅主题】当客户端成功连接环信MQTT消息云后,需尽快向服务器发送订阅主题消息。

try {
//连接成功后订阅主题
mMqttClient.subscribe(topic, qos, null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {

}

@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {

}
});
} catch (MqttException e) {
e.printStackTrace();
}

【取消订阅】

try {
mMqttClient.unsubscribe(topic);
} catch (MqttException e) {
e.printStackTrace();
}


5、收发消息

【发送消息】配置发送消息回调方法,向环信MQTT消息云中指定topic发送消息。

MqttMessage msg=new MqttMessage();
msg.setPayload(content.getBytes());//设置消息内容
msg.setQos(qos);//设置消息发送质量,可为0,1,2.
//设置消息的topic,并发送。
mMqttClient.publish(topic, msg, null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
Log.d(TAG, "onSuccess: 发送成功");
}

@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
Log.d(TAG, "onFailure: 发送失败="+ exception.getMessage());
}
});

【接收消息】配置接收消息回调方法,从环信MQTT消息云接收订阅消息。

// 设置MQTT监听
mMqttClient.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable cause) {
Log.d(TAG, "connectionLost: 连接断开");
}

@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
Log.d(TAG, "收到消息:"+message.toString());
}

@Override
public void deliveryComplete(IMqttDeliveryToken token) {

}
});

三、更多信息

github地址: https://github.com/wangxinjeff/mqttdemo-android




0 个评论

要回复文章请先登录注册