Android中MQTT协议的使用

文章目录

前言

什么是Mqtt?

Android 下如何使用Mqtt?

项目地址

总结

参考文章


前言

项目中有用到mqtt,碰巧没人负责这一块,所以毛遂自荐就看了一波,下面是一些简单的使用记录,写得不好,仅供参考。若没有mqtt服务器的朋友,建议先建一个mqtt服务,不然看不到效果。

什么是Mqtt?

MQTT 的全称为 Message Queue Telemetry Transport,是轻量级基于代理的发布/订阅的消息传输协议,它可以通过很少的代码和带宽和远程设备连接。例如通过卫星和代理连接,通过拨号和医疗保健提供者连接,以及在一些自动化或小型设备上,而且由于小巧,省电,协议开销小和能高效的向一和多个接收者传递信息,故同样适用于称动应用设备上。MQTT就包含了以下一些特点:

  1. 实现简单
  2. 提供数据传输的 QoS
  3. 轻量、占用带宽低
  4. 可传输任意类型的数据
  5. 可保持的会话(session)

Android 下如何使用Mqtt?

在Android中使用Mqtt可以分为6个步骤:

  • 导入mqtt包;
  • 配置MqttConnectOptions;
  • 调用connect并将配置好的参数写入;
  • 通过指定的消息进行消息订阅;
  • 向订阅的topic中发布消息;
  • 通过mqttCallBack的回调对接收到的消息进行处理;
// 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'


导入类:

public class MQTTManager {
    private static final String TAG = "MQTTManager";
        public static final String SERVER_HOST = "tcp://52.80.116.245:1883";
        private String clientid = "2df8aabfb8b6088953664f413a446bbc";
        private static MQTTManager mqttManager=null;
        private MqttClient client;
        private MqttConnectOptions options;
        private Context mContext;

        private MessageHandlerCallBack callBack;
        private MQTTManager(Context context){
            mContext = context;
            clientid+=MqttClient.generateClientId();
        }

        /**
         * 获取一个MQTTManager单例
         * @param context
         * @return 返回一个MQTTManager的实例对象
         */
        public static MQTTManager getInstance(Context context) {
            Log.d(TAG,"mqttManager="+mqttManager);
            if (mqttManager==null) {
                mqttManager=new MQTTManager(context);
                synchronized (Object.class) {
                    Log.d(TAG,"synchronized mqttManager="+mqttManager);
                    if (mqttManager!=null) {
                        return mqttManager;
                    }
                }
            }else {
                Log.d(TAG,"else mqttManager="+mqttManager);
                return mqttManager;
            }
            return null;
        }
        /**
         * 连接服务器
         */
        public void connect(){
            Log.d(TAG,"开始连接MQtt");
            try {
                // host为主机名,clientid即连接MQTT的客户端ID,一般以唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存    
                client = new MqttClient(SERVER_HOST, "2df8aabfb8b6088953664f413a446bbc", new MemoryPersistence());
                // MQTT的连接设置    
                options = new MqttConnectOptions();
                // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接    
              options.setCleanSession(true);
                // 设置连接的用户名    
                options.setUserName("7302");
                // 设置连接的密码    
                options.setPassword("64ec6f32366ccb80f0dacc804546d62e623e4b72".toCharArray());
                // 设置超时时间 单位为秒    
                options.setConnectionTimeout(30);
                // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制    
                options.setKeepAliveInterval(30);
                // 设置回调    
//              MqttTopic topic = client.getTopic(TOPIC);    
                //setWill方法,如果项目中需要知道客户端是否掉线可以调用该方法。设置最终端口的通知消息      
//              options.setWill(topic, "close".getBytes(), 2, true);
                SSLSocketFactory sslSocketFactory = null;
               /* try {
                    sslSocketFactory = sslContextFromStream(mContext.getAssets().open("server.pem")).getSocketFactory();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                options.setSocketFactory(sslSocketFactory);*/
                client.setCallback(new PushCallback());
                client.connect(options);
                Log.d(TAG,"ClientId="+client.getClientId());
            } catch (MqttException e) {
                e.printStackTrace();
                Log.e(TAG, "connect: " + e );
            }
        }

        /**
         * 订阅消息
         * @param topic 订阅消息的主题
         */
        public void subscribeMsg(String topic,int qos){
            if (client!=null) {
                int[] Qos  = {qos};
                String[] topic1 = {topic};
                try {
                    client.subscribe(topic1, Qos);
                    Log.d(TAG,"开始订阅topic="+topic);
                } catch (MqttException e) {
                    e.printStackTrace();
                }
            }
        }

        /**
         * 发布消息
         * @param topic 发布消息主题
         * @param msg 消息体
         * @param isRetained 是否为保留消息
         */
        public void publish(String topic,String msg,boolean isRetained,int qos) {

            try {
                if (client!=null) {
                    MqttMessage message = new MqttMessage();
                    message.setQos(qos);
                    message.setRetained(isRetained);
                    message.setPayload(msg.getBytes());
                    client.publish(topic, message);
                    Log.d(TAG,"topic="+topic+"--msg="+msg+"--isRetained"+isRetained);
                }
            } catch (MqttPersistenceException e) {
                e.printStackTrace();
            } catch (MqttException e) {
                e.printStackTrace();
            }
        }
        int count=0;
        /**
         * 发布和订阅消息的回调
         *
         */
        public class PushCallback implements MqttCallback {

            public void connectionLost(Throwable cause) {
                Log.e(TAG, "connectionLost: " + cause );
                if (count<5) {
                    count++;//5次重连
                    Log.d(TAG,"断开连接,重新连接"+count+"次"+cause);
                    try {
                        client.close();
                        connect();
                    } catch (MqttException e) {
                        e.printStackTrace();
                    }
                }
            }
            /**
             * 发布消息的回调     
             */
            @Override
            public void deliveryComplete(IMqttDeliveryToken token) {
                //publish后会执行到这里  
                Log.d(TAG,"发布消息成功的回调"+token.isComplete());
            }

            /**
             * 接收消息的回调方法
             */
            @Override
            public void messageArrived(final String topicName, final MqttMessage message)
                    throws Exception {
                //subscribe后得到的消息会执行到这里面    
                Log.d(TAG,"接收消息=="+new String(message.getPayload()));
                if (callBack!=null) {
                    callBack.messageSuccess(topicName,new String(message.getPayload()));
                }
            }

        }
        /**
         *  设置接收消息的回调方法
         * @param callBack
         */
        public void setMessageHandlerCallBack(MessageHandlerCallBack callBack){
            this.callBack = callBack;
        }
        public MessageHandlerCallBack getMessageHandlerCallBack(){
            if (callBack!=null) {
                return callBack;
            }
            return null;
        }
        /**
         * 断开链接
         */
        public void disconnect(){
            if (client!=null&&client.isConnected()) {
                try {
                    client.disconnect();
                    mqttManager=null;
                } catch (MqttException e) {
                    e.printStackTrace();
                }
            }
        }
        /**
         * 释放资源
         */
        public void release(){
            if (mqttManager!=null) {
                mqttManager=null;
            }
        }
        /**
         *  判断服务是否连接
         * @return
         */
        public boolean isConnected(){
            if (client!=null) {
                return client.isConnected();
            }
            return false;
        }

    public SSLContext sslContextFromStream(InputStream inputStream) throws Exception {

        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
        Certificate certificate = certificateFactory.generateCertificate(inputStream);

        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        keyStore.load(null, null);
        keyStore.setCertificateEntry("ca", certificate);

        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(keyStore);

        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, trustManagerFactory.getTrustManagers(), null);

        return sslContext;
    }
}

接口:

public interface MessageHandlerCallBack {
    void messageSuccess(String topicName,String msg);
}

调用:

MQTTManager instance = MQTTManager.getInstance(mContext);
                instance.setMessageHandlerCallBack(new MessageHandlerCallBack() {
                    @Override
                    public void messageSuccess(String topicName, String s) {
                        Log.e(TAG, "messageSuccess: " + s);
                    }
                });
                instance.connect();

连接成功后,就可以实现和服务端消息的发送和接收。

项目地址

AserbaosAndroid
aserbao的个人Android总结项目,希望这个项目能成为最全面的Android开发学习项目,这是个美好的愿景,项目中还有很多未涉及到的地方,有很多没有讲到的点,希望看到这个项目的朋友,如果你在开发中遇到什么问题,在这个项目中没有找到对应的解决办法,希望你能够提出来,给我留言或者在项目github地址提issues,我有时间就会更新项目没有涉及到的部分!项目会一直维护下去。当然,我希望是Aserbao’sAndroid 能为所有Android开发者提供到帮助!也期望更多Android开发者能参与进来,只要你熟悉Android某一块,都可以将你的代码pull上分支供大家学习!

总结

mqtt Android客户端的代码很有限,没有过多的操作!简单的配置,连接,然后接受回调处理接受消息就可以了,协议内容今后有时间再细看吧!

参考文章

————————————————

转载于:https://blog.csdn.net/qq_32175491/article/details/84791152

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android应用程序使用MQTT协议可以实现与远程服务器进行实时通信。MQTT是一种轻量级的发布/订阅消息传输协议,适用于移动设备和物联网应用程序。 以下是使用MQTT协议的一般步骤: 1. 添加MQTT库:首先,您需要将MQTT库添加到您的Android项目。常用的MQTT库包括Eclipse Paho和MQTT.fx等。 2. 连接到服务器:使用MQTT库提供的API,创建一个MQTT客户端,并连接到远程MQTT服务器。您需要提供服务器的地址、端口号和连接参数(如用户名、密码等)。 3. 订阅主题:通过订阅主题,您可以接收来自服务器的特定消息。主题可以是任意字符串,可以用于区分不同类型的消息。 4. 发布消息:使用MQTT客户端发布消息到特定主题。您可以将数据发送到服务器,并通过订阅该主题的所有客户端接收。 5. 处理接收到的消息:使用订阅回调函数处理从服务器接收到的消息。您可以在回调函数解析和处理消息,并更新UI或执行其他操作。 以下是一个简单的示例,演示如何在Android应用程序使用MQTT协议: 1. 添加依赖: 在您的项目的build.gradle文件添加以下依赖: ```groovy implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5' ``` 2. 连接到服务器: ```java String serverUri = "tcp://mqtt.example.com:1883"; String clientId = "android-client"; MqttClient client = new MqttClient(serverUri, clientId); MqttConnectOptions options = new MqttConnectOptions(); options.setUserName("username"); options.setPassword("password".toCharArray()); client.connect(options); ``` 3. 订阅主题: ```java String topic = "mytopic"; client.subscribe(topic, new IMqttMessageListener() { @Override public void messageArrived(String topic, MqttMessage message) throws Exception { // 处理接收到的消息 String payload = new String(message.getPayload()); Log.d(TAG, "Received message: " + payload); } }); ``` 4. 发布消息: ```java String topic = "mytopic"; String payload = "Hello, MQTT!"; client.publish(topic, payload.getBytes(), 0, false); ``` 通过以上步骤,您可以在Android应用程序使用MQTT协议进行实时通信。请注意,您需要根据实际情况配置和处理连接、订阅和发布操作,并确保在适当的时候释放和关闭MQTT客户端连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值