MQTT开发-android篇

一. MQTT简介

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

MQTT Android github: https://github.com/eclipse/paho.mqtt.android

二. MQTT特点

1、使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;
2、对负载内容屏蔽的消息传输;
3、使用 TCP/IP 提供网络连接;
4、有三种消息发布服务质量:
5、小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;
6、使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制。

三.Android客户端集成MQTT

1.build.gradle中添加依赖(根目录)

maven {
    url "https://repo.eclipse.org/content/repositories/paho-releases/"
}

模块下的build.gradle

{
   implementation 	  'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.2'
   implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
}

2.开启服务,如下:在deviceservice进程开启MQTT服务

<service android:name="org.eclipse.paho.android.service.MqttService"
    android:exported="true"
    android:process=":deviceservice"
    android:enabled="true">
service>

3.初始化MQTT

 client = new MqttAndroidClient(this, host, clientId);
    // 设置MQTT监听并且接受消息
    client.setCallback(mqttCallback);
    conOpt = new MqttConnectOptions();
    // 清除缓存
    conOpt.setCleanSession(true);
    // 设置超时时间,单位:秒
    conOpt.setConnectionTimeout(10);
    // 心跳包发送间隔,单位:秒
    conOpt.setKeepAliveInterval(30);
    // 用户名
    conOpt.setUserName(userName);
    // 密码
    conOpt.setPassword(passWord.toCharArray());  

4.连接服务器

  if (!client.isConnected()) {
    try {
        client.connect(conOpt, null, iMqttActionListener);
    } catch (MqttException e) {
        SecxLog.log_E(TAG, "mqttConnect fail:" + e.getStackTrace());
    }
 }

5.监听消息

private MqttCallback mqttCallback = new MqttCallback() {

    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        String str1 = new String(message.getPayload());
        if (IGetMessageCallBack != null) {
            IGetMessageCallBack.setMessage(str1);
        }
        SecxLog.log_E(TAG, "topic:" + topic);
        SecxLog.log_E(TAG, "messageArrived1:" + str1);
        reportMsg(topic,str1);
            }
        }
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken arg0) {

    }

    @Override
    public void connectionLost(Throwable arg0) {
        SecxLog.log_E(TAG, "MQTT链接断开:" +arg0);
    }
};

6.订阅topic

public void mqttSubscribe(String topic) {
    try {
        // 订阅myTopic话题
        client.subscribe(topic, 1);
        SecxLog.log_E(TAG, "MQTT订阅成功:" + topic);
    } catch (MqttException e) {
        SecxLog.log_E(TAG, "MQTT订阅失败:" + e.getStackTrace());
    }
}

8.推送消息

   public void mqttPublish(String topic,String msg) {
        Integer qos = 0;
        Boolean retained = false;
        try {
            if (client != null) {
                client.publish(topic,msg.getBytes(), qos.intValue(), retained.booleanValue());
            }
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

四. 测试

1.以中国移动物联网平台为例,多协议接入中选择MQTT,添加产品,添加设备。
MQTT开发-android篇_第1张图片
2.在安卓的客户端设置clientId, 用户名,密码,接入地址

public String host = "tcp://mqtt.heclouds.com:6002";
public String userName = "15xxxx";//产品ID
public String passWord = "SECXxxxxxxx";//设备的鉴权信息
public String clientId = "65xxxxxx";//平台的设备ID

3.客户端启动后,可以在平台上看到在线状态
MQTT开发-android篇_第2张图片
4.服务端发送命令给客户端(hello mqtt),客户端收到如下:

12-15 16:13:24.151 1363-1363/com.secx.face:deviceservice E/ArcFace: SecxMqttService,topic:$creq/e193a8b8-fcfd-50f7-a884-0853b02dfa3c
12-15 16:13:24.153 1363-1363/com.secx.face:deviceservice E/ArcFace: SecxMqttService,messageArrived1:hello mqtt
12-15 16:13:24.154 1363-1363/com.secx.face:deviceservice E/ArcFace: SecxMqttService,messageArrived2:$creq/e193a8b8-fcfd-50f7-a884-0853b02dfa3c;qos:0;retained:false

你可能感兴趣的:(笔记,android,java)