基于MQTT实现推送

来源:互联网 发布:淘宝网买东西找人付款 编辑:程序博客网 时间:2024/05/16 05:31

基于MQTT实现推送

项目中用到了MQTT实现推送,于是写篇博客记录一下,关于MQTT是做什么的,我就不做介绍了,直接看正文。

准备工作

下载activityMQ

下载activityMqhttp://activemq.apache.org/activemq-5150-release.html
这里写图片描述

部署服务

解压压缩包,执行activitymq.bat,看到如下界面就说明部署成功。
这里写图片描述

服务器已经部署了,要查看或者管理,我们可以登录到服务器,
怎么登陆昵,各位看官老爷有没有注意到刚刚启动的控制台
这里写图片描述

控制台在http://localhost:8161,用户名admin,密码admin

编写实例测试

消息接收

    String URI = "tcp://10.0.5.12:1883";    String USERNAME = "admin";    String PASSWORD = "admin";    String CLIENT_ID = "wangjiang";    String TOPIC = "mqtt_topic";    private void connect() {        try {            mqttClient = new MqttClient(URI,CLIENT_ID,new MemoryPersistence());            MqttConnectOptions options = new MqttConnectOptions();            // 设置连接的用户名            options.setUserName(USERNAME);            // 设置连接的密码            options.setPassword(PASSWORD.toCharArray());            //设置回调            mqttClient.setCallback(callback);            //连接(该方法是同步的,且在当前线程执行)            mqttClient.connect(options);            mqttClient.subscribe(TOPIC);        } catch (MqttException e) {            e.printStackTrace();        }    }    private MqttCallback callback = new MqttCallback() {        @Override        public void connectionLost(Throwable throwable) {            Log.d(TAG,"connectionLost "+throwable.toString());        }        @Override        public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {            Log.d(TAG,"messageArrived s = "+s);            byte[] payload = mqttMessage.getPayload();            String message = new String(payload);            notification(message);        }        @Override        public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {            Log.d(TAG,"deliveryComplete ");        }    };    private int ID = 110;    private void notification(String message) {        Log.d(TAG,"message  = "+message);        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);        builder.setContentTitle("MQTT推送");        builder.setContentText(message);        builder.setSmallIcon(R.mipmap.ic_launcher);        manager.notify(ID++,builder.build());    }

稍微讲解一下吧,mqtt是通过订阅主题的方式来工作的,我们连接到服务器之后,需要订阅一个主题,之后我们就能接收到这个主题下的推送了,我们到控制台创建一个topichttp://localhost:8161/admin/subscribers.jsp,chiletId是客户端id,这个在生产环境中最好跟用户名保持一致,做到唯一性,topic是主题,主题我们就随便填个吧
这里写图片描述

创建成功后我们运行客户端代码,然后通过主题发布一条消息看看客户端能不能接收到,http://localhost:8161/admin/send.jsp?JMSDestination=com.mqtt.topic&JMSDestinationType=topic
这里写图片描述

点击发送,这时候我们的客户端就会接收到推送了
这里写图片描述

消息发布

上面我们实现了通过控制台发布消息,接下来我们用代码实现,直接看代码

/**     * 发布消息     */    private void publishMessage() {        if (mqttClient == null || !mqttClient.isConnected()) {            return;        }        MqttMessage message = new MqttMessage();        message.setPayload("这是一条测试推送消息".getBytes());        try {            mqttClient.publish(TOPIC,message);        } catch (MqttException e) {            e.printStackTrace();        }    }

通过方法发送消息,一样能接收到消息,至此,我们的发布和接收都已经实现,

原创粉丝点击