1.在项目根目录下的build.gradle中添加

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

Android MQTT_第1张图片
2.在app目录下的build.gradle中添加:

 //mqtt    implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'    implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'   //implementation 'com.android.support:support-v4:4.4.1'

3.权限

    <uses-permission android:name="android.permission.WAKE_LOCK" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <uses-permission android:name="android.permission.READ_PHONE_STATE" />    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />    <uses-permission android:name="android.permission.INTERNET" />

4.在AndroidManifest.xml中添加

    <!-- Mqtt服务 -->    <service android:name="org.eclipse.paho.android.service.MqttService" />

5.新建EasyMqttMethod.class

public class EasyMqttMethod {         private static OnConnectListener onConnectListener;    /**     * 构建EasyMqttService对象     */    public EasyMqttService buildEasyMqttService() {             EasyMqttService mMQTTService = new EasyMqttService.Builder()                //设置自动重连                .autoReconnect(true)                //设置不清除回话session 可收到服务器之前发出的推送消息                .cleanSession(false)                //唯一标示 保证每个设备都唯一就可以 建议 imei                .clientId("RelayUAVGround")     //中继无人机地面端                //mqtt服务器地址 格式例如:tcp://10.0.261.159:1883                .serverUrl("tcp://212.64.56.66:1883")                //心跳包默认的发送间隔                .keepAliveInterval(20)                //构建出EasyMqttService 建议用application的context                .bulid(CompleteWidgetActivity.getContext().getApplicationContext());        connect(mMQTTService);        return mMQTTService;    }    /**     * 连接Mqtt服务器     */    public void connect(final EasyMqttService mqttService) {             mqttService.connect(new IEasyMqttCallBack() {                 @Override            public void messageArrived(String topic, String message, int qos) {                     //推送消息到达                //通过接口传递接收到的数据                getOnConnectListener().onConnectSuccess(message);            }            @Override            public void connectionLost(Throwable arg0) {                     //连接断开                Log.e("-----------", "连接断开");//                ConnectionStatus = "连接断开";            }            @Override            public void deliveryComplete(IMqttDeliveryToken arg0) {                 }            @Override            public void connectSuccess(IMqttToken arg0) {                     //连接成功                subscribe(mqttService);                Log.e("-----------", "MQTT连接成功 ");            }            @Override            public void connectFailed(IMqttToken arg0, Throwable arg1) {                     //连接失败                Log.e("-----------", "连接失败" + " " + arg1.getMessage());            }        });    }    /**     * 订阅主题 这里订阅三个主题分别是"a", "b", "c"     */    public void subscribe(EasyMqttService mqttService) {             Log.e("----------", "订阅主题");        //主题对应的推送策略 分别是0, 1, 2 建议服务端和客户端配置的主题一致        // 0 表示只会发送一次推送消息 收到不收到都不关心        // 1 保证能收到消息,但不一定只收到一条        // 2 保证收到切只能收到一条消息        int[] qoss = new int[]{     0};        mqttService.subscribe(new String[] {     "RelayUAVKey"}, qoss);    }    /**     * 发布String消息     */    public void publishString(final String msg, String topic, int qos, boolean retained, EasyMqttService mqttService) {             if(mqttService != null) {                 mqttService.publishString(msg, topic, qos, retained);        }    }    /**     * 发布Byte消息     */    public void publishByte(byte[] msg, String topic, int qos, boolean retained, EasyMqttService mqttService) {             if(mqttService != null) {                 mqttService.publishByte(msg, topic, qos, retained);        }    }    //创建方法    public void getMsg(OnConnectListener listener) {             setOnConnectListener(listener);    }    //回调接口    public interface OnConnectListener{             //连接成功        void onConnectSuccess(String msg);        //连接异常信息        void onConnectFailed(Exception e);    }    /**     * 判断服务是否连接     */    public boolean isConnected(EasyMqttService mqttService) {             return mqttService.isConnected();    }    private OnConnectListener getOnConnectListener() {             return onConnectListener;    }    private void setOnConnectListener(OnConnectListener onConnectListener) {             this.onConnectListener = onConnectListener;    }}

5.新建EasyMqttService.class

/** * Mqtt服务 * @author GrainRain */public class EasyMqttService implements Serializable {         private final String TAG = "EasyMqttService";    private boolean canDoConnect = true;    private MqttAndroidClient client;    private MqttConnectOptions conOpt;    private Context context;    private String serverUrl = "";    private String userName = "admin";    private String passWord = "password";    private String clientId = "";    private int timeOut = 10;    private int keepAliveInterval = 20;    private boolean retained = false;    private boolean cleanSession = true;    private boolean autoReconnect = true;    private IEasyMqttCallBack starMQTTCallBack;    /**     * builder设计模式     *     * @param builder     */    private EasyMqttService(Builder builder) {             this.context = builder.context;        this.serverUrl = builder.serverUrl;        this.userName = builder.userName;        this.passWord = builder.passWord;        this.clientId = builder.clientId;        this.timeOut = builder.timeOut;        this.keepAliveInterval = builder.keepAliveInterval;        this.retained = builder.retained;        this.cleanSession = builder.cleanSession;        this.autoReconnect = builder.autoReconnect;        init();    }    /**     * Builder 构造类     */    public static final class Builder {             private Context context;        private String serverUrl;        private String userName = "admin";        private String passWord = "password";        private String clientId;        private int timeOut = 10;        private int keepAliveInterval = 20;        private boolean retained = false;        private boolean cleanSession = false;        private boolean autoReconnect = false;        public Builder serverUrl(String serverUrl) {                 this.serverUrl = serverUrl;            return this;        }        public Builder userName(String userName) {                 this.userName = userName;            return this;        }        public Builder passWord(String passWord) {                 this.passWord = passWord;            return this;        }        public Builder clientId(String clientId) {                 this.clientId = clientId;            return this;        }        public Builder timeOut(int timeOut) {                 this.timeOut = timeOut;            return this;        }        public Builder keepAliveInterval(int keepAliveInterval) {                 this.keepAliveInterval = keepAliveInterval;            return this;        }        public Builder retained(boolean retained) {                 this.retained = retained;            return this;        }        public Builder autoReconnect(boolean autoReconnect) {                 this.autoReconnect = autoReconnect;            return this;        }        public Builder cleanSession(boolean cleanSession) {                 this.cleanSession = cleanSession;            return this;        }        public EasyMqttService bulid(Context context) {                 this.context = context;            return new EasyMqttService(this);        }    }    /**     * 发布消息     * @param msg     * @param topic     * @param qos     * @param retained     */    public void publishString(String msg, String topic, int qos, boolean retained) {             try {                 client.publish(topic, msg.getBytes(), qos, retained);        } catch (Exception e) {                 e.printStackTrace();        }    }    public void publishByte(byte[] msg, String topic, int qos, boolean retained) {             try {                 client.publish(topic, msg, qos, retained);        } catch (Exception e) {                 e.printStackTrace();        }    }    private void init() {             // 服务器地址(协议+地址+端口号)        client = new MqttAndroidClient(context, serverUrl, clientId);        // 设置MQTT监听并且接受消息        client.setCallback(mqttCallback);        conOpt = new MqttConnectOptions();        // 清除缓存        conOpt.setCleanSession(cleanSession);        // 设置超时时间,单位:秒        conOpt.setConnectionTimeout(timeOut);        // 心跳包发送间隔,单位:秒        conOpt.setKeepAliveInterval(keepAliveInterval);        // 用户名        conOpt.setUserName(userName);        // 密码        conOpt.setPassword(passWord.toCharArray());        conOpt.setAutomaticReconnect(autoReconnect);    }    /**     * 关闭客户端     */    public void close() {             try {                 client.close();        } catch (Exception e) {                 Log.e(TAG,e.toString());        }    }    /**     * 连接MQTT服务器     */    public void connect(IEasyMqttCallBack starMQTTCallBack) {             this.starMQTTCallBack = starMQTTCallBack;        if (canDoConnect && !client.isConnected()) {                 try {                     client.connect(conOpt,null, iMqttActionListener);            } catch (Exception e) {                     e.printStackTrace();            }        }    }    /**     * 订阅主题     *     * @param topics 主题     * @param qos    策略     */    public void subscribe(String[] topics, int[] qos) {             try {                 // 订阅topic话题            Log.i(TAG, "execute subscribe -- qos = " + qos.toString());            client.subscribe(topics, qos);        } catch (Exception e) {                 Log.e(TAG,e.toString());        }    }    /**     * 断开连接     */    public void disconnect(){             try {                 client.disconnect();        } catch (Exception e) {                 Log.e(TAG,e.toString());        }    }    /**     * 判断连接是否断开     */    public boolean isConnected(){             try {                 return client.isConnected();        } catch (Exception e) {                 Log.e(TAG,e.toString());        }        return false;    }    /**     *  MQTT是否连接成功     */    private IMqttActionListener iMqttActionListener = new IMqttActionListener() {             @Override        public void onSuccess(IMqttToken arg0) {                 Log.i(TAG, "mqtt connect success ");            if (starMQTTCallBack != null) {                     starMQTTCallBack.connectSuccess(arg0);            }        }        @Override        public void onFailure(IMqttToken arg0, Throwable arg1) {                 Log.i(TAG, "mqtt connect failed ");            if (starMQTTCallBack != null) {                     starMQTTCallBack.connectFailed(arg0, arg1);            }        }    };    // MQTT监听并且接受消息    private MqttCallback mqttCallback = new MqttCallback() {             @Override        public void messageArrived(String topic, MqttMessage message) throws Exception {                 String msgContent = new String(message.getPayload());            String detailLog = topic + ";qos:" + message.getQos() + ";retained:" + message.isRetained();            Log.i(TAG, "messageArrived:" + msgContent);            Log.i(TAG, detailLog);            if (starMQTTCallBack != null) {                     starMQTTCallBack.messageArrived(topic, msgContent, message.getQos());            }        }        @Override        public void deliveryComplete(IMqttDeliveryToken arg0) {                 if (starMQTTCallBack != null) {                     starMQTTCallBack.deliveryComplete(arg0);            }            Log.i(TAG, "deliveryComplete");        }        @Override        public void connectionLost(Throwable arg0) {                 if (starMQTTCallBack != null) {                     starMQTTCallBack.connectionLost(arg0);            }            Log.i(TAG, "connectionLost");            // 失去连接,重连        }    };    /**     * 判断网络是否连接     */    private boolean isConnectIsNomarl() {             ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);        @SuppressLint("MissingPermission") NetworkInfo info = connectivityManager.getActiveNetworkInfo();        if (info != null && info.isAvailable()) {                 String name = info.getTypeName();            Log.i(TAG, "MQTT current network name:" + name);            return true;        } else {                 Log.i(TAG, "MQTT no network");            return false;        }    }}

6.新建接口IEasyMqttCallBack

public interface IEasyMqttCallBack {         /**     * 收到消息     *     * @param topic   主题     * @param message 消息内容     * @param qos     消息策略     */    void messageArrived(String topic, String message, int qos);    /**     * 连接断开     *     * @param arg0 抛出的异常信息     */    void connectionLost(Throwable arg0);    /**     * 传送完成     *     * @param arg0     */    void deliveryComplete(IMqttDeliveryToken arg0);    /**     * 连接成功     *     * @param arg0     */    void connectSuccess(IMqttToken arg0);    /**     * 连接失败     *     * @param arg0     */    void connectFailed(IMqttToken arg0, Throwable arg1);}

7.使用

 private EasyMqttService easyMqttService; private void initMQTT() {             EasyMqttMethod easyMqttMethod = new EasyMqttMethod();        easyMqttService = easyMqttMethod.buildEasyMqttService();        //获取数据        easyMqttMethod.getMsg(new EasyMqttMethod.OnConnectListener() {                 @Override            public void onConnectSuccess(String msg) {                 }            @Override            public void onConnectFailed(Exception e) {                 }        });    }

8.发送

//发送MQTT信息            new EasyMqttMethod().publishString("msg", "RelayUAVGround", 0, false, easyMqttService);

更多相关文章

  1. Android中的消息机制-个人心得
  2. android > ImageView 加载本地/服务器图片
  3. Android客户端解析web服务器XML数据小问题
  4. android与tomcat服务器交互实例
  5. Android 消息处理机制1(从源码分析)
  6. Android Tcp服务器端
  7. Android学习笔记(7)————Android中的消息机制
  8. android上传文件到服务器
  9. Android与服务器通信

随机推荐

  1. android学习笔记(八)
  2. 【Android】21.4 图片动画缩放示例
  3. Android控件(View)之TextView, Button, I
  4. Android:Activity(六):Fragment详解
  5. Android笔记三十二.Android位置服务及核
  6. Android(安卓)检测网络连接状态
  7. android开发之GridLayout详解
  8. 打造自己的Android聊天软件(socket篇)
  9. Android通信方式(一)————WebView
  10. Android(安卓)Design Support Library—