Android使用MQTT协议

来源:互联网 发布:php 获取当前命名空间 编辑:程序博客网 时间:2024/04/29 09:17

MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。
jar包下载地址:https://repo.eclipse.org/content/repositories/paho/org/eclipse/paho/mqtt-client/0.4.0/
在Android客户端中MainAcitvity的代码如下:

package com.xiye.mqttdemo;import android.app.Notification;import android.app.NotificationManager;import android.content.Context;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.KeyEvent;import android.widget.RemoteViews;import android.widget.TextView;import android.widget.Toast;import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;import org.eclipse.paho.client.mqttv3.MqttCallback;import org.eclipse.paho.client.mqttv3.MqttClient;import org.eclipse.paho.client.mqttv3.MqttConnectOptions;import org.eclipse.paho.client.mqttv3.MqttException;import org.eclipse.paho.client.mqttv3.MqttMessage;import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;@SuppressWarnings("all")public class MainActivity extends AppCompatActivity {    private TextView resultTv;    private String host = "tcp://host:1883";    private String userName = "userName";    private String passWord = "passWord";    private int i = 1;    private Handler handler;    private MqttClient client;    private String myTopic = "test/topic";    private MqttConnectOptions options;    private ScheduledExecutorService scheduler;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        resultTv = (TextView) findViewById(R.id.result);        init();        handler = new Handler() {            @Override            public void handleMessage(Message msg) {                super.handleMessage(msg);                if (msg.what == 1) {                    Toast.makeText(MainActivity.this, (String) msg.obj,                            Toast.LENGTH_SHORT).show();                    Log.e("TAG",(String)msg.obj);                } else if (msg.what == 2) {                    System.out.println("连接成功");                    Toast.makeText(MainActivity.this, "连接成功", Toast.LENGTH_SHORT).show();                    try {                        client.subscribe(myTopic, 1);                    } catch (Exception e) {                        e.printStackTrace();                    }                } else if (msg.what == 3) {                    Toast.makeText(MainActivity.this, "连接失败,系统正在重连", Toast.LENGTH_SHORT).show();                    System.out.println("连接失败,系统正在重连");                }            }        };        startReconnect();    }    private void startReconnect() {        scheduler = Executors.newSingleThreadScheduledExecutor();        scheduler.scheduleAtFixedRate(new Runnable() {            @Override            public void run() {                if (!client.isConnected()) {                    connect();                }            }        }, 0 * 1000, 10 * 1000, TimeUnit.MILLISECONDS);    }    private void init() {        try {            //host为主机名,test为clientid即连接MQTT的客户端ID,一般以客户端唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存            client = new MqttClient(host, "ClientID",                    new MemoryPersistence());            //MQTT的连接设置            options = new MqttConnectOptions();            //设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接            options.setCleanSession(true);            //设置连接的用户名            options.setUserName(userName);            //设置连接的密码            options.setPassword(passWord.toCharArray());            // 设置超时时间 单位为秒            options.setConnectionTimeout(10);            // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制            options.setKeepAliveInterval(50);            //设置回调            client.setCallback(new MqttCallback() {                @Override                public void connectionLost(Throwable cause) {                    //连接丢失后,一般在这里面进行重连                    System.out.println("connectionLost----------");                }                @Override                public void deliveryComplete(IMqttDeliveryToken token) {                    //publish后会执行到这里                    System.out.println("deliveryComplete---------"                            + token.isComplete());                }                @Override                public void messageArrived(String topicName, MqttMessage message)                        throws Exception {                    //subscribe后得到的消息会执行到这里面                    System.out.println("messageArrived----------");                    Message msg = new Message();                    msg.what = 1;                    msg.obj = topicName + "---" + message.toString();                    handler.sendMessage(msg);                }            });        } catch (Exception e) {            Log.e("TAG",e.getMessage().toString());            e.printStackTrace();        }    }    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    public boolean onKeyDown(int keyCode, KeyEvent event) {        if (client != null && keyCode == KeyEvent.KEYCODE_BACK) {            try {                client.disconnect();            } catch (Exception e) {                e.printStackTrace();            }        }        return super.onKeyDown(keyCode, event);    }    @Override    protected void onDestroy() {        super.onDestroy();        try {            scheduler.shutdown();            client.disconnect();        } catch (MqttException e) {            e.printStackTrace();        }    }}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 浅蓝色代码 浅蓝色车 浅蓝色棉衣搭配 浅蓝色针织开衫 蓝色t恤配什么裤子 浅蓝色的海 浅蓝色西装搭配 浅蓝色短裙 浅蓝色发夹 浅蓝色代表什么 浅蓝色的值 浅褐色头发 白带浅褐色无异味 排卵期白带浅褐色 怀孕初期浅褐色 白带浅褐色不痛不痒 浅野唯 浅野启介 浅野菌子 浅野温子 浅野真澄 浅野启介图片 浅野长政 西江月照野弥弥浅浪阅读答案 三生白浅怀孕番外女儿 白浅图片 薄夜白夏浅溪 夏浅溪薄夜白 浅金色是什么颜色 浅金色头发图片 才薄智浅 才微智浅 浅间智同人 浅智间 浅间 智免费观看 浅间.智 慕云靳和洛浅全文免费阅读 原来婚浅情深林帘全文阅读 斯靳恒黎浅洛全文免费阅读 原来婚浅情深林帘免费阅读 夏浅顾承全文阅读目录