Android Q 接入 MQTT

首先在APP 下引入mqtt的库

implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.1'

创建一个MQTT连接的实体类

package com.example.iot.bean;/** * @TODO MQTT 连接实体类 * @Create by: wjw * @Create time: 2020/2/8 11:26 */public class MQTTentity {    //以下请自己配置否则MainActivity中button_login的监听会有问题    private String host;    private String userName;    private String passWord;    private String[] timeTopic;    public String getHost() {        return host;    }    public void setHost(String host) {        this.host = host;    }    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public String getPassWord() {        return passWord;    }    public void setPassWord(String passWord) {        this.passWord = passWord;    }    public String[] getTimeTopic() {        return timeTopic;    }    public void setTimeTopic(String[] timeTopic) {        this.timeTopic = timeTopic;    }    public MQTTentity() {    }    public MQTTentity(String host, String userName, String passWord, String[] timeTopic) {        this.host = host;        this.userName = userName;        this.passWord = passWord;        this.timeTopic = timeTopic;    }    @Override    public String toString() {        return "MQTTentity{" +                "host='" + host + '\'' +                ", userName='" + userName + '\'' +                ", passWord='" + passWord + '\'' +                ", timeTopic='" + timeTopic + '\'' +                '}';    }}

然后在activity中写主逻辑

//我们自己新建的MQTT实体类    private MQTTentity mqttentity;    private MqttClient client;    private MqttConnectOptions options;    //以下两个声明目的是为了实现MQTT消息在testview刷新    private ScheduledExecutorService scheduler;    private Handler handler;

在onCreate方法中

handler = new Handler(new Handler.Callback() {            @Override            public boolean handleMessage(Message msg) {                if (msg.what == 1) {                    Toast.makeText(MonitorAct.this, (String) msg.obj, Toast.LENGTH_SHORT).show();                } else if (msg.what == 2) {                    MqttToast.setVisibility(View.GONE);                    try {                        client.subscribe(mqttentity.getTimeTopic()); //订阅主题“timeTopic”                        Toast.makeText(MonitorAct.this, "场景已成功接入服务器", Toast.LENGTH_SHORT).show();                    } catch (Exception e) {                        e.printStackTrace();                    }                } else if (msg.what == 3) {                    MqttToast.setVisibility(View.VISIBLE);                    Toast.makeText(MonitorAct.this, "接入服务器失败,务必确保网络正常,系统正在重连,请稍后...", Toast.LENGTH_LONG).show();                }                return false;            }        });

mqtt连接

// MQTT 订阅主题        String[] topics  = new String[1];        topics[0] = "/wjw";        mqttentity = new MQTTentity("tcp://127.0.0.1:1888", "admin", "admin", topics);     initMQTT(mqttentity);        startReconnect();
 /**     * @TODO 获取手机imei     * @Create by: wjw     * @Create time: 2020/2/8 11:27     */    public static String getIMEI(Context context, int slotId) {        try {            TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);            Method method = manager.getClass().getMethod("getImei", int.class);            String imei = (String) method.invoke(manager, slotId);            return imei;        } catch (Exception e) {            return "";        }    }
/**     * @TODO MQTT初始化     * @Create by: wjw     * @Create time: 2020/2/8 12:08     */    private void initMQTT(MQTTentity mqtTentity) {        // 获取手机IMEI作为clientId        String imei = getIMEI(MonitorAct.this, 0);        // HOST为主机名        try {            client = new MqttClient(mqtTentity.getHost(), imei, new MemoryPersistence());        } catch (MqttException e) {            e.printStackTrace();        }        // MQTT连接设置        options = new MqttConnectOptions();        // 设置是否清空session,如果是false则表示服务器保留客户端连接记录        options.setCleanSession(true);        // 设置连接的用户名        options.setUserName(mqtTentity.getUserName());        // 设置连接的密码        options.setPassword(mqtTentity.getPassWord().toCharArray());        // 设置超时时间,单位为秒        options.setConnectionTimeout(10);        // 设置会话间心跳时间,单位为秒,服务器每隔1.5*20向客户端发消息确认        options.setKeepAliveInterval(20);        // 设置回调        client.setCallback(new MqttCallback() {            @Override            public void connectionLost(Throwable cause) {                // 连接丢失后,一般在这里进行重连            }            @Override            public void messageArrived(String topic, MqttMessage message) throws Exception {                // subscribe后,得到的消息会执行到这里                Message msg = new Message();                msg.what = 1;                msg.obj = message.toString();                handler.sendMessage(msg);            }            @Override            public void deliveryComplete(IMqttDeliveryToken token) {                // publish后,会执行这里            }        });    }
 /**     * @TODO MQTT建立连接及重连     * @Create by: wjw     * @Create time: 2020/2/8 11:48     */    private void startReconnect() {        scheduler = Executors.newSingleThreadScheduledExecutor();        scheduler.scheduleAtFixedRate(new Runnable() {            @Override            public void run() {                if (!client.isConnected()) {                    connect();                }            }        }, 0, 10 * 1000, TimeUnit.MILLISECONDS);    }
/**     * @TODO MQTT连接状态鉴别     * @Create by: wjw     * @Create time: 2020/2/8 11:51     */    private void connect() {        new Thread(new Runnable() {            @Override            public void run() {                try {                    client.connect(options);                    Message msg = new Message();                    msg.what = 2;                    handler.sendMessage(msg);                } catch (Exception e) {                    e.printStackTrace();                    Message msg = new Message();                    msg.what = 3;                    handler.sendMessage(msg);                }            }        }).start();    }
@Override    protected void onDestroy() {        super.onDestroy();        try {            scheduler.shutdown();            client.disconnect();        } catch (MqttException e) {            e.printStackTrace();        }    }

更多相关文章

  1. android多媒体框架之流媒体----base on jellybean(八)
  2. js判断浏览器所在的客户端类型
  3. Android中的eventBus传值
  4. iOS及Android消息推送方案安装使用入门
  5. Android实现网易新闻客户端侧滑菜单(二)
  6. SignalR推送消息到android客户端
  7. flutter集成推送功能-小米推送集成
  8. gRPC请求中对header进行处理
  9. Android(安卓)XMPP实现IM 群聊功能

随机推荐

  1. 组件化思维对于一个UI设计来说有多重要?
  2. 如何使gateway_worker与客户端通信,有哪几
  3. thinkphp6 验证码 异步刷新 记录,
  4. php之类与继承
  5. jQuery中的DOM操作实现留言板功能、$get
  6. 0506oop作业
  7. 【PHP 面向对象】面向对象(OOP)编程知识
  8. python 集合知识
  9. NETDATA 监控面板邮件配置
  10. 为知笔记docker私有化部署