感谢博客https://www.cnblogs.com/chenrunlin/p/5109028.html

需要环境:

java1.8

把文件通过finalshell扔到/usr/local目录下

使用命令

# sudo tar -zxvf apache-apollo-1.7.1-unix-distro.tar.gz

然后

我配置了一下apollo_home  更改 /etc/profile

按exc键后输入:wq保存

然后

# sudo -s

# source /etc/profile

刷新配置

再进入/var/lib

# cd /var/lib/

新建Mybroker

# /usr/local/apache-apollo-1.7.1/bin/apollo create mybroker

再更改mybroker中/etc/apollo.xml

#vim /var/lib/mybroker/etc/apollo.xml

红框中改为0.0.0.0

最后运行

#  nohup /var/lib/mybroker/bin/apollo-broker run

nohup是为了关闭ssh之后也能在后台运行

注意点:

1、可能有时候需要sh命令 比如说 sh apollo create mybroker

2、阿里云必须开放apollo.xml中的端口,如61680.61681等。

3、是否成功通过ip+61680即可知道。

4、初始账号密码是admin,password,存放在etc目录的users.properties下

5、注意nohup命令运行,不然可能断开连接后自动关停服务

成功截图:

附送一下测试Demo,需要的jar包是

org.eclipse.paho.client.mqttv3-1.2.0.jar

服务器端server:

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.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttPersistenceException;
import org.eclipse.paho.client.mqttv3.MqttTopic;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
/**
*
* Title:Server
* Description: 服务器向多个客户端推送主题,即不同客户端可向服务器订阅相同主题*/
public class Server {
public static final String HOST="tcp://IP地址:61613";
public static final String TOPIC1="toclient/1";
public static final String TOPIC2="toclient/2";
public static final String clientid="server"; public MqttClient client;
public MqttTopic topic1;
public MqttTopic topic2;
public String userName = "admin";
public String passWord = "password"; public MqttMessage message; public 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 PushCallback());
client.connect(options);
topic1 = client.getTopic(TOPIC1);
topic2 = client.getTopic(TOPIC2);
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public void publish(MqttTopic topic,MqttMessage message) throws MqttPersistenceException, MqttException {
MqttDeliveryToken token = topic.publish(message);
token.waitForCompletion();
System.out.println("消息推送成功 !"+ token.isComplete());
}
public Server() throws MqttException {
client = new MqttClient(HOST, clientid,new MemoryPersistence());
connect();
} public static void main(String[] args) throws MqttException {
Server server = new Server(); server.message= new MqttMessage();
server.message.setQos(2);
/*
QoS 0,最多一次送达。也就是发出去就fire掉。
QoS 1,至少一次送达。发出去之后必须等待ack,没有ack,就要找时机重发
QoS 2,准确一次送达。消息id将拥有一个简单的生命周期。
* */
server.message.setRetained(true);
server.message.setPayload("发送消息到Topic1".getBytes());
server.publish(server.topic1, server.message);
System.out.println(server.message.isRetained() + "----ratained状态");
}
}

监听端Client:

import java.util.concurrent.ScheduledExecutorService;

import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttTopic; public class Client {
public static final String HOST="tcp://IP地址:61613";
public static final String TOPIC="toclient/1";
private static final String clientid="clientid1"; private MqttClient client;
private MqttConnectOptions options;
private String userName = "admin";
private String passWord = "password"; private ScheduledExecutorService scheduler; private void start() {
try {
client = new MqttClient(HOST, clientid);
options = new MqttConnectOptions();
options.setCleanSession(true);
options.setUserName(userName);
options.setPassword(passWord.toCharArray());
// 设置超时时间 单位为秒
options.setConnectionTimeout(10);
// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
options.setKeepAliveInterval(20); client.setCallback(new PushCallback()); MqttTopic topic = client.getTopic(TOPIC);
options.setWill(topic, "close".getBytes(), 2, true);
client.connect(options);
int []Qos = {1};
String [] topic1 = {TOPIC};
client.subscribe(topic1,Qos);
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} public static void main(String[] args) {
// TODO Auto-generated method stub
Client client = new Client();
client.start();
} }

回调函数 PushCallback:

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage; /**
* 发布消息的回调类
*
* 必须实现MqttCallback的接口并实现对应的相关接口方法CallBack 类将实现 MqttCallBack。
* 每个客户机标识都需要一个回调实例。在此示例中,构造函数传递客户机标识以另存为实例数据。
* 在回调中,将它用来标识已经启动了该回调的哪个实例。
* 必须在回调类中实现三个方法:
*
* public void messageArrived(MqttTopic topic, MqttMessage message)接收已经预订的发布。
*
* public void connectionLost(Throwable cause)在断开连接时调用。
*
* public void deliveryComplete(MqttDeliveryToken token))
* 接收到已经发布的 QoS 1 或 QoS 2 消息的传递令牌时调用。
* 由 MqttClient.connect 激活此回调。
*
*/
public class PushCallback implements MqttCallback { public void connectionLost(Throwable cause) {
System.out.println("连接断开,可以重连!");
} public void deliveryComplete(IMqttDeliveryToken token) {
// TODO Auto-generated method stub
System.out.println("deliveryComplete -- "+token.isComplete()); } public void messageArrived(String topic, MqttMessage msg) throws Exception {
// TODO Auto-generated method stub
System.out.println("接收消息主题 : "+topic);
System.out.println("接收消息Qos: "+msg.getQos());
System.out.println("接收消息 : "+ new String(msg.getPayload())); }
}

效果:

先运行client端。

再运行server端发送给订阅者:

再次查看监听端:

基于ubuntu16的mqtt服务器(apache-apollo1.7.1)的更多相关文章

  1. 基于mosquitto的MQTT服务器---SSL/TLS 单向认证+双向认证

    基于mosquitto的MQTT服务器---SSL/TLS 单向认证+双向认证 摘自:https://blog.csdn.net/ty1121466568/article/details/811184 ...

  2. 快速搭建MQTT服务器(MQTTnet和Apache Apollo)

    前言 MQTT协议是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分,http://mqtt.org/. MQTT is a machine-to-machine (M2M)/" ...

  3. (一)基于阿里云的MQTT远程控制(Android 连接MQTT服务器,ESP8266连接MQTT服务器实现远程通信控制----简单的连接通信)

    如果不了解MQTT的可以看这篇文章  http://www.cnblogs.com/yangfengwu/p/7764667.html http://www.cnblogs.com/yangfengw ...

  4. MQTT——服务器搭建(一)

    MQTT介绍 MQTT,是IBM推出的一种针对移动终端设备的基于TCP/IP的发布/预订协议,可以连接大量的远程传感器和控制设备: 轻量级的消息订阅和发布(publish/subscribe)协议 建 ...

  5. mqtt服务器apollo的搭建和测试工具paho的使用

    (1)前言 MQTT协议是IBM开发的一个即时通讯协议; 基于发布/订阅的消息协议,近些年来被广泛应用于能源.电力.....等硬件性能低下的远程设备,此外国内很多企业使用MQTT作为android手机 ...

  6. 常见MQTT服务器搭建[转载]

    简介 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,它比较适合于在低带宽.不可靠的网络的进行远程传感器和控制设备通 ...

  7. 使用EMQ搭建MQTT服务器

    前言寒假的时候开始搭建mqtt服务器,一开始使用的是RabbitMQ,基于Erlang语言.但是RabbitMQ的本职工作是AMQP,MQTT只是他的一个插件功能,似乎有些大材小用,很多MQTT的功能 ...

  8. MQTT服务器的搭建(Windows平台)

    人工智能.智能家居越来越火,在服务器和多个终端进行通信的过程中使用传统的请求/回答(Request/Response)模式已经过时,伴随而来的是发布/订阅(Publish/Subscribe)模式-- ...

  9. 常见MQTT服务器搭建与试用

    常见MQTT服务器搭建与试用   简介 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,它比较适合于在低带宽.不可靠 ...

随机推荐

  1. TRS OM error

    http://192.168.1.1/ http://tplogin.cn/admin888 wddqaz123456789 package="com.trs.om.bean" m ...

  2. 【风马一族_php】NO4_php基础知识

    原文来自:http://www.cnblogs.com/sows/p/6017018.html(博客园的)风马一族 侵犯版本,后果自负 回顾 运算符:算术运算符.逻辑运算符.比较运算符.位运算符.赋值 ...

  3. Liferay OSGi注解(Annotation) - 使用手册(译文)

    mark过来好好用 上Neil的博客地址Liferay OSGi注解(Annotation) - 使用手册(译文) @Component是注入服务 @Reference是获取服务(在Liferay框架 ...

  4. RNN与 LSTM 网络

    循环神经网络(RNN) 人们的每次思考并不都是从零开始的.比如说你在阅读这篇文章时,你基于对前面的文字的理解来理解你目前阅读到的文字,而不是每读到一个文字时,都抛弃掉前面的思考,从头开始.你的记忆是有 ...

  5. spoj Distinct Substrings 后缀数组

    给定一个字符串,求不相同的子串的个数. 假如给字符串“ABA";排列的子串可能: A B A AB  BA ABA 共3*(3+1)/2=6种; 后缀数组表示时: A ABA BA 对于A和 ...

  6. MongoDB 基础API使用

    1. 基本概念: 1.1. MongoDB 保留数据库名: admin: 从权限的角度来看,这是"root"数据库.要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限 ...

  7. Java练习 SDUT-1149_计算题

    计算题 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个简单的计算,你需要计算f(m,n),其定义如下: 当m=1时 ...

  8. qt中窗口绘制——图片的绘制

    在qt 中,QPixmap 用于表示一张图片,支持png,jpg格式的加载. QPixmap pm("c:/test.png"); 或者 QPixmap pm; pm.load(& ...

  9. Laravel中利用队列发送邮件的方法示例

    https://www.jb51.net/article/121647.htm 本文主要给大家介绍了关于Laravel中队列发送邮件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的 ...

  10. Linux 用户he用户组管理

    8)系统中有一类用户称为伪用户(psuedo users). 这些用户在/etc/passwd  文件中也占有一条记录,但是不能登陆,因为他们的登陆shell 为空,他们的存在主要是方便系统管理,满足 ...