Mqtt从服务端到Android客户端搭建(Android客户端搭建)
16lz
2021-01-23
一、简介
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服务端建立到客户端连接过程就是这样,其实在应用过程中都是客户端之间的通讯,服务端也就是一个类似数据转发的功能。