一、简介

MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。

此处不再引入官方文字描述,以个人开发认识浅谈一下

本文分为两部分:

1、MQTT基于window服务端的建立;

2、 MQTT Android客户端的实现。

二、 Android客户端搭建

以我在github上的[MQTT]  https://github.com/alanjuster/MQTT做详解,

在app下的build.gradle dependencies 下引入依赖资源

compile'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0'compile'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'

同时在AndroidMainfest.xml 中注册依赖Service及必要的权限

创建mqttservice对象实例:

mqttService =new MyMqttService.Builder()//设置自动重连.autoReconnect(true)//设置清除回话session  true(false) 不收(收)到服务器之前发出的推送消息.cleanSession(true)//唯一标示 保证每个设备都唯一就可以 建议 imei.clientId(imei).userName("admin").passWord("password")//mqtt服务器地址 格式例如://  tcp://iot.eclipse.org:1883.serverUrl("tcp://192.168.1.31:61613")//心跳包默认的发送间隔.keepAliveInterval(20).timeOut(10)//构建出EasyMqttService 建议用application的context.bulid(this.getApplicationContext());


发起连接 ,在连接成功后[订阅主题](订阅)
 

 /**     * 连接Mqtt服务器     */    private void connect() {        mqttService.connect(new IEasyMqttCallBack() {            @Override            public void messageArrived(String topic, String message, int qos) {                //推送消息到达                Log.e(TAG, "message= " + message);                rece.setText("收到消息:" + message +'\n' +"主题--> " + topic);            }            @Override            public void connectionLost(Throwable arg0) {                //连接断开                try {                    Log.e(TAG + "connectionLost", arg0.toString());                    Toast.makeText(MainActivity.this, "connectionLost", Toast.LENGTH_SHORT).show();                } catch (Exception e) {                } finally {                }            }            @Override            public void deliveryComplete(IMqttDeliveryToken arg0) {                Log.e(TAG + "@deliveryComplete", "发送完毕" + arg0.toString());                Toast.makeText(MainActivity.this, "deliveryComplete", Toast.LENGTH_SHORT).show();            }            @Override            public void connectSuccess(IMqttToken arg0) {                Toast.makeText(MainActivity.this, "connectSuccess", Toast.LENGTH_SHORT).show();                Log.e(TAG + "@@@@@connectSuccess", "success");                subscribe();            }            @Override            public void connectFailed(IMqttToken arg0, Throwable arg1) {                //连接失败                Log.e(TAG + "@@@@@connectFailed", "fail" + arg1.getMessage());                Toast.makeText(MainActivity.this, "connectFailed", Toast.LENGTH_SHORT).show();            }        });    }



主题订阅
 

/**     * 订阅主题     */    private void subscribe() {        String[] topics = new String[]{"test"};        //主题对应的推送策略 分别是0, 1, 2 建议服务端和客户端配置的主题一致        // 0 表示只会发送一次推送消息 收到不收到都不关心        // 1 保证能收到消息,但不一定只收到一条        // 2 保证收到切只能收到一条消息        int[] qoss = new int[]{0};        mqttService.subscribe(topics, qoss);    }


 

发布消息:

/**     * 发布消息     */    private void publish(String msg, String topic, int qos, boolean retained) {        mqttService.publish(msg, topic, qos, retained);    }



从MQTT服务端建立到客户端连接过程就是这样,其实在应用过程中都是客户端之间的通讯,服务端也就是一个类似数据转发的功能。

更多相关文章

  1. 【Android】Android的消息机制
  2. android的消息处理机制
  3. [导入]2010-03-06 传智播客—Android(六)通知、样式、主题、HTML
  4. Handler消息传递机制

随机推荐

  1. 【30篇突击 android】源码统计八
  2. Android(安卓)实现简单的登陆注册功能(Sha
  3. android推送学习——google的C2DM
  4. WARNING: APP_PLATFORM android-14 is la
  5. android文章 - 收藏集 - 掘金
  6. Android(安卓)lollipop 更新问题
  7. 如何将一个acitvity同时设置多个theme
  8. eclipse Alt+/ 代码失灵、不响应的解决办
  9. 用Android代码实现自动打开USB调试
  10. Android拒绝来电的实现--ITelephony类的