基于Apollo代理服务器的MQTT推送平台搭建

首先从官网上下载最新版,现在的版本是1.7。

第一步是创建自己的broker,

基于Apollo代理服务器的MQTT推送平台搭建_第1张图片

命令是进入到bin目录下,apollo.cmd create mybroker,mybroker是个名字,可以自己取,

接下来就进入到创建的mybroker/bin目录下启动我们的代理服务器


命令是:apollo-broken.cmd run


接下来就可以到http://127.0.0.1:61680/console/index.html#看看是否搭建成功

基于Apollo代理服务器的MQTT推送平台搭建_第2张图片

最后是两个代码,一个是服务器,一个是Android端的,用的是同一个jar包

服务器代码

package com.mqtt.server;
import java.awt.Container;  
import java.awt.event.ActionEvent;  
import java.awt.event.ActionListener;  
 
import javax.swing.JButton;  
import javax.swing.JFrame;  
import javax.swing.JPanel;  
 
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.MqttDeliveryToken;  
import org.eclipse.paho.client.mqttv3.MqttMessage;  
import org.eclipse.paho.client.mqttv3.MqttTopic;  
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;  
 
public class Server extends JFrame {  
    private static final long serialVersionUID = 1L;  
    private JPanel panel;  
    private JButton button;  
 
    private MqttClient client;  
    private String host = "tcp://127.0.0.1:61613";  
//  private String host = "tcp://localhost:1883";  
    private String userName = "admin";  
    private String passWord = "password";  
    private MqttTopic topic;  
    private MqttMessage message;  
 
    private String myTopic = "test/topic1";  
 
    public Server() {  
 
        try {  
            client = new MqttClient(host, "Server",  
                    new MemoryPersistence());  
            connect();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
 
        Container container = this.getContentPane();  
        panel = new JPanel();  
        button = new JButton("发布话题");  
        button.addActionListener(new ActionListener() {  
 
            @Override  
            public void actionPerformed(ActionEvent ae) {  
                try {  
                    MqttDeliveryToken token = topic.publish(message);  
                    token.waitForCompletion();  
                    System.out.println(token.isComplete()+"========");  
                } catch (Exception e) {  
                    e.printStackTrace();  
                }  
            }  
        });  
        panel.add(button);  
        container.add(panel, "North");  
 
    }  
 
    private void connect() {  
 
        MqttConnectOptions options = new MqttConnectOptions();  
        options.setCleanSession(false);  
        options.setUserName(userName);  
        options.setPassword(passWord.toCharArray());  
        // 设置超时时间  
        options.setConnectionTimeout(10);  
        // 设置会话心跳时间  
        options.setKeepAliveInterval(20);  
        try {  
            client.setCallback(new MqttCallback() {  
 
                @Override  
                public void connectionLost(Throwable cause) {  
                    System.out.println("connectionLost-----------");  
                }  
 
                @Override  
                public void deliveryComplete(IMqttDeliveryToken token) {  
                    System.out.println("deliveryComplete---------"+token.isComplete());  
                }  
 
                @Override  
                public void messageArrived(String topic, MqttMessage arg1)  
                        throws Exception {  
                    System.out.println("messageArrived----------");  
 
                }  
            });  
 
            topic = client.getTopic(myTopic);  
 
            message = new MqttMessage();  
            message.setQos(1);  
            message.setRetained(true);  
            System.out.println(message.isRetained()+"------ratained状态");  
            message.setPayload("This is a test Message more".getBytes());
            client.connect(options);
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
 
    }  
 
    public static void main(String[] args) {  
        Server s = new Server();  
        s.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
        s.setSize(600, 370);  
        s.setLocationRelativeTo(null);  
        s.setVisible(true);  
    }  

Android端代码:

package com.example.mqttclient;

import java.util.concurrent.Executors;  
import java.util.concurrent.ScheduledExecutorService;  
import java.util.concurrent.TimeUnit;  
 
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 android.app.Activity;  
import android.os.Bundle;  
import android.os.Handler;  
import android.os.Message;  
import android.view.KeyEvent;  
import android.widget.TextView;  
import android.widget.Toast;  
 
public class MainActivity extends Activity {  
 
    private TextView resultTv;  
 
    private String host = "tcp://192.168.1.103:61613";  
    private String userName = "admin";  
    private String passWord = "password";  
//    private String host = "tcp://127.0.0.1:1883";
//    private String userName = "test";  
//    private String passWord = "test";
    private Handler handler;  
 
    private MqttClient client;  
 
    private String myTopic = "test/topic1";  
 
    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();  
                    System.out.println("-----------------------------");  
                } else if(msg.what == 2) {  
                    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();  
                }  
            }  
        };  
 
        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, "test",  
                    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(20);  
                        //设置回调  
            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);  
                }  
            });  
//          connect();  
        } catch (Exception e) {  
            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();  
        }  
    }  

admin和password是默认的账号与密码,Android端的host是服务器的局域网地址,这样就可以连接成功了,比如,发送了一条消息

基于Apollo代理服务器的MQTT推送平台搭建_第3张图片

Body里可以放Json数据,Producers是Server端,Consumers是接收到的客户端这里也就是Android端。到这里平台就搭建完成了。


你可能感兴趣的:(基于Apollo代理服务器的MQTT推送平台搭建)