基于ubuntu16的mqtt服务器(apache-apollo1.7.1)
感谢博客: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)的更多相关文章
- 基于mosquitto的MQTT服务器---SSL/TLS 单向认证+双向认证
基于mosquitto的MQTT服务器---SSL/TLS 单向认证+双向认证 摘自:https://blog.csdn.net/ty1121466568/article/details/811184 ...
- 快速搭建MQTT服务器(MQTTnet和Apache Apollo)
前言 MQTT协议是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分,http://mqtt.org/. MQTT is a machine-to-machine (M2M)/" ...
- (一)基于阿里云的MQTT远程控制(Android 连接MQTT服务器,ESP8266连接MQTT服务器实现远程通信控制----简单的连接通信)
如果不了解MQTT的可以看这篇文章 http://www.cnblogs.com/yangfengwu/p/7764667.html http://www.cnblogs.com/yangfengw ...
- MQTT——服务器搭建(一)
MQTT介绍 MQTT,是IBM推出的一种针对移动终端设备的基于TCP/IP的发布/预订协议,可以连接大量的远程传感器和控制设备: 轻量级的消息订阅和发布(publish/subscribe)协议 建 ...
- mqtt服务器apollo的搭建和测试工具paho的使用
(1)前言 MQTT协议是IBM开发的一个即时通讯协议; 基于发布/订阅的消息协议,近些年来被广泛应用于能源.电力.....等硬件性能低下的远程设备,此外国内很多企业使用MQTT作为android手机 ...
- 常见MQTT服务器搭建[转载]
简介 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,它比较适合于在低带宽.不可靠的网络的进行远程传感器和控制设备通 ...
- 使用EMQ搭建MQTT服务器
前言寒假的时候开始搭建mqtt服务器,一开始使用的是RabbitMQ,基于Erlang语言.但是RabbitMQ的本职工作是AMQP,MQTT只是他的一个插件功能,似乎有些大材小用,很多MQTT的功能 ...
- MQTT服务器的搭建(Windows平台)
人工智能.智能家居越来越火,在服务器和多个终端进行通信的过程中使用传统的请求/回答(Request/Response)模式已经过时,伴随而来的是发布/订阅(Publish/Subscribe)模式-- ...
- 常见MQTT服务器搭建与试用
常见MQTT服务器搭建与试用 简介 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,它比较适合于在低带宽.不可靠 ...
随机推荐
- 给大家分享一张CSS选择器优选级图谱 !
- kubernetes1.4新特性:支持Docker新特性
(一)背景资料 在Kubernetes1.2中这个第三方组件就是go-dockerclient,这是一个GO语言写的docker客户端,支持Dockerremote API,这个项目在https:// ...
- Python学习之路15☞socket编程
一 客户端/服务器架构 即C/S架构,包括 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二 os ...
- 洛谷P3286 [SCOI2014]方伯伯的商场之旅
题目:洛谷P3286 [SCOI2014]方伯伯的商场之旅 思路 数位DP dalao说这是数位dp水题,果然是我太菜了... 自己是不可能想出来的.这道题在讲课时作为例题,大概听懂了思路,简单复述一 ...
- CNN对位移、尺度和旋转不变性的讨论
CNN得益于全局共享权值和pool操作,具有平移不变性. 对于尺度不变性,是没有或者说具有一定的不变性(尺度变化不大),实验中小目标的检测是难点,需要采用FPN或者其他的方式单独处理. 对于旋转不变性 ...
- UVA_10055:Hashmat the brave warrior
Language:C++ 4.8.2 #include<stdio.h> int main(void) { long long int a, b; while(scanf("%l ...
- phpexcel使用说明1
<?php /** * PHPEXCEL生成excel文件 * @author:firmy * @desc 支持任意行列数据生成excel文件,暂未添加单元格样式和对齐 */ require_o ...
- UVALive - 4787 ICPC WF 2010 Tracking Bio-bots【dp】
UVa 4787 WF题果然不一样,本来想暴力搜索,数据太大了,数组都开不了.看题解也不太懂,记录一下书上的题解,以后再看: 此题是给出N*M的格子,有些地方是墙,不可走.求所有不能只通过向上或者向右 ...
- SGU 101 Domino【欧拉路径】
题目链接: http://acm.sgu.ru/problem.php?contest=0&problem=101 题意: N个多米诺骨牌,每个骨牌左右两侧分别有一个0~6的整数(骨牌可以旋转 ...
- How To Move Or Rebuild A Lob Partition
How To Move Or Rebuild A Lob Partition [ID 761388.1] 改动时间 29-JUN-2010 类型 HOWTO 状 ...