上云无忧 > 文档中心 > 环信MQTT消息云服务使用教程 - 消息收发(Android端)
MQTT消息云服务
环信MQTT消息云服务使用教程 - 消息收发(Android端)

文档简介:
本文介绍Android端如何连接环信MQTT消息云快速实现消息的自收自发。 1. 前提条件: 1.1 部署Android开发环境。 下载安装Android studio,配置好开发环境。 1.2 导入项目依赖: 在项目根目录build.gradle文件里配置。
*此产品及展示信息均由环信官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠

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

1.1 部署Android开发环境

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

1.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'
}

2.1 获取初始化信息

登录console后台
1.点击菜单栏【MQTT】→【服务概览】→【服务配置】,获取「连接地址」、「连接端口」、

「AppID」以「及REST API地址」等信息。
注:clientID由两部分组成,组织形式为“deviceID@AppID”,deviceID由用户自定义,AppID见【服务配置】。
示例:正确的clientID格式为:“device001@aitbj0”;
2.点击菜单栏【应用概览】→【应用详情】→【开发者ID】,获取「Client ID」与「ClientSecret」信息。
3.初始化代码

String host = "xxx.xxx.xxx.xxx"; //环信MQTT服务器地址 通过console后台[MQTT]->[服务概览]->[服务配置][连接地址]获取
String port="xx" // 协议服务端口 通过console后台[MQTT]->[服务概览]->[服务配置][连接端口]获取
String appId="xx"; // appID 通过console后台[MQTT]->[服务概览]->[服务配置][AppID]获取
String deviceId = "deviceId"; // 自定义deviceID
String restApi = "xxx.xxx.xxx.xxx"; //环信MQTT REST API地址 通过console后台[MQTT]->[服务概览]->[服务配置][REST API地址]获取
String appClientId = "xxx"; //开发者ID 通过console后台[应用概览]->[应用详情]->[开发者ID][ Client ID]获取
String appClientSecret = "xxx"; // 开发者密钥 通过console后台[应用概览]->[应用详情]->[开发者ID][ ClientSecret]获取
String clientId = deviceId + "@" + appId;
String userName = "test"; //自定义用户名 长度不超过64位即可

 

2.2 获取token

  • 首先获取App Token
try {
            JSONObject reqBody = new JSONObject();
            reqBody.put("appClientId", appClientId);
            reqBody.put("appClientSecret", appClientSecret);
            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(restApi + "/openapi/rm/app/token")
                    .post(requestBody)
                    .build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() {
                @Override public void onFailure(Call call, IOException e) {
                    
                }

                @Override public void onResponse(Call call, Response response) throws IOException 
{ String responseBody = response.body().string(); if (response.code() == 200 && !responseBody.isEmpty()) {
                        try {
                            JSONObject result = new JSONObject(responseBody); String appToken = result.optJSONObject
("body").optString("access_token");
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
        }catch (JSONException e){
            e.printStackTrace();
        }
  • 然后根据App Token获取User Token,User Token作为连接服务的密码
try {
            JSONObject reqBody = new JSONObject();
            reqBody.put("username", userName);
            reqBody.put("expires_in", 86400);//过期时间,单位为秒,默认为3天,如需调整,可提工单调整 reqBody.put("cid", clientId);
            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(restApi + "/openapi/rm/user/token")
                    .addHeader("Authorization", appToken)
                    .post(requestBody)
                    .build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() {
                @Override public void onFailure(Call call, IOException e) {

                }

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

2.3 连接服务器

创建MqttAndroidClient对象,并配置连接密码、cleansession标志、心跳间隔、超时时间等信息,调用connect()函数连接至环信MQTT消息云。

MqttAndroidClient mMqttClient = new MqttAndroidClient(context, String.format("tcp://%s:%s", host, port),
 clientId); //连接参数 MqttConnectOptions options; options = new MqttConnectOptions(); //设置自动重连 
options.setAutomaticReconnect(true); // 缓存 options.setCleanSession(true); // 设置超时时间,单位:秒
 options.setConnectionTimeout(60); // 心跳包发送间隔,单位:秒 options.setKeepAliveInterval(45); 
// 用户名 options.setUserName(userName); // 密码 options.setPassword(userToken.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) {

    }

2.4 订阅(subscribe)

2.4.1 订阅主题
当客户端成功连接环信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();
}

2.4.2 取消订阅

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

2.5 收发消息

2.5.1 发送消息
配置发送消息回调方法,向环信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());
    }
});

2.5.2 接收消息
配置接收消息回调方法,从环信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) {

    }
});

  • 完整demo示例,请参见demo下载。
  • 目前MQTT客户端支持多种语言,请参见 SDK下载。
  • 如果您在使用MQTT服务中,有任何疑问和建议,欢迎您联系我们。
相似文档
  • 本文介绍快速使用 MQTT Web版SDK 实现MQTT客户端消息的自收自发。 1. 前提条件: 1.1 部署web开发环境。 安装IDE。您可以使用VS Code或者WebStorm,本文以VS Code IDEA为例。 下载安装浏览器,本文使用谷歌浏览器。 1.2 导入项目依赖: 在VS Code IDEA中创建index.html文件,并在文件中引入Eclipse Paho JavaScript SDK。
  • 本文介绍微信小程序端如何连接环信MQTT消息云快速实现消息的自收自发。 1. 前提条件: 1.1 配置小程序开发环境 1、注册微信小程序帐号,并下载微信开发者工具。 2、由于微信小程序安全要求比较高,在与后台服务器之间的通讯必须使用加密传输协议,连接地址前缀必须携带'wxs:'。
  • 本文介绍支付宝小程序端如何连接环信MQTT消息云快速实现消息的自收自发。 1. 前提条件: 1.1 配置小程序开发环境。 注册支付宝小程序帐号,并下载小程序开发者工具。由于支付宝小程序安全要求比较高,在与后台服务器之间的通讯必须使用加密传输协议,连接地址前缀必须携带'alis:'。
  • 本文介绍PHP服务端通过调用环信MQTT消息云REST API接口快速实现消息下发,使用时可参阅REST 发送消息接口介绍。 1. 前提条件: 1.1 获取服务器信息。 调用环信MQTT消息云 REST API接口前,需要获取四个配置信息,包括:应用clientID、应用clientSecret、REST API地址及应用ID。
  • 本文介绍Python服务端通过调用环信MQTT消息云 REST API接口快速实现消息下发,使用时可参阅REST 发送消息接口介绍。 1. 前提条件: 1.1 获取服务器信息。 调用环信MQTT消息云 REST API接口前,需要获取四个配置信息,包括:应用clientID、应用clientSecret、REST API地址及应用ID。
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部