一、说明

  MQTT是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。

  Apache Apollo是一个代理服务器,其是在ActiveMQ基础上发展而来的,可以支持STOMP, AMQP, MQTT, Openwire, SSL, and WebSockets 等多种协议。

  总结来说MQTT只是一种消息推送的协议目前(2016/1/13)为V3.1版本,而Apache Apollo是更具这种协议而开发的一款服务性的服务程序,被用来进行消息推送。同样的服务还有Mosquitto,介绍地址:http://blog.csdn.net/xukai871105/article/details/39252653

二、原理

Apache Apollo说白了其实很简单,就是在服务器端创建一个唯一订阅号,发送者可以向这个订阅号中发东西,然后接受者(即订阅了这个订阅号的人)都会收到这个订阅号发出来的消息。以此来完成消息的推送。服务器其实是一个消息中转站。

三、下载安装Apollo(windows)

1.下载地址:http://activemq.apache.org/apollo/

2.安装

  apollo中间件其实是免安装的,我们只需要下载apache-apollo-1.7.1-windows-distro.zip,然后解压到某个文件夹就可以了。在这里我解压到D:\apache-apollo-1.7.1。解压开的路径如下:

 3.创建属于自己的apollo域

  下载下来的是官方的apollo,我们需要自己生成自己的apollo,这样做的好处就是我们可以根据自己的需求修改一些配置文件,创建过程如下: 

  1 创建一个D:\myApollo文件夹。

  2 进入命令输入模式,进入到刚创建的文件下下:cd D:\myApollo。

  3 因为接到的目录关系所以可能有些改变,目录为(解压路径\bin\apollo create myapollo) 例子:D:\apache-apollo-1.7.1\bin\apollo create myapollo

  4 创建成功后,在D:\myApollo会有一个myapollo子文件夹,里面内容如下:

   

  其中 bin为启动目录 etc为配置目录。

4.启动myapollo

  1 cd D:\myApollo\myapollo\bin  (命名模式下进入到自己生成的apollo下的bin目录)

  2 apollo-broker run  (输入启动命令)

  输入后效果如下:

  

  这里我们可以看到端口配置信息

 5.访问控制台 

  在浏览器输入http://127.0.0.1:61680/,就是上面黑窗口最后一行,打开如下页面

  

  然后输入默认用户名/密码:(admin/password),用户名密码可以在etc/users.properties中找到,点击登陆,然后进入控制页面,可以看到myapollo,当然目前里面是没有连接,没有消息的,因为我们还没有建立连接,发送消息。

  

  至此,我们的apollo中间件就可以正常使用了。

6.修改配置

  在我们的配置目录下(D:\myApollo\myapollo\etc)

  

  apollo.xml 为网络配置信息,其他的不用管最主要的

    <connector id="tcp" bind="tcp://0.0.0.0:61613" connection_limit="2000"/>   connection_limit连接限制条数2000,就是说超过2000就GG了。可不可以修改等连接到了2000条的时候更改试试。

  groups.properties 用于增加用户

    原本为: admins=admin

    增加test用户: admins=admin|test(中间用|分开)

  users.properties  用于设置用户的账号密码

    用户名=密码

    原本为: admin=password

    增加test用户:  admin=password

            test=test         (下面新增一列,此处与groups.properties文件对应)

 7.连接程序:

  依赖包:mqtt-client-0.4.0.jar

  包下载地址:https://repo.eclipse.org/content/repositories/paho/org/eclipse/paho/mqtt-client/0.4.0/

  代码示例下载:http://pan.baidu.com/s/1kUmsVrT   (gbk编码)

在线代码解析:

public class MyMqtt{
/**连接访问者id,不能重复*/
private String clientId;
/**默认连接路径,服务器所在ip*/
private String host="tcp://192.168.1.130:61613";
/**MQTT访问默认用户名*/
private String userName = "admin";
/**MQTT访问默密码*/
private String passWord = "password";
/**发送的订阅号集合*/
private String[] publishTopics={"test"};
/**订阅者的订阅号集合*/
private String[] subTopics={"test"};
/**消息发送时的消息模式集合*/
private int[] publishQos={2};
/**消息订阅式的消息模式集合*/
private int[] subQos={2};
/**单次MQTT连接*/
private MqttClient client;
/**连接时的一些额外设置*/
private MqttConnectOptions options;
/**发送消息是的个体topic*/
private MqttTopic topic;
/**消息传递hander*/
private Handler mHandler; public MyMqtt(Context context,final Handler handler) {
clientId=Tool.getIdentifyNumber(context);
if(client==null || !client.isConnected()){
try {
//设置连接指定的额ip,连接人
client = new MqttClient(host, clientId, new MemoryPersistence());
//开始设置连接时的参数
options = new MqttConnectOptions();
//设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接
options.setCleanSession(true);
//设置连接用户名
options.setUserName(userName);
//设置连接密码
options.setPassword(passWord.toCharArray());
//设置超时连接
options.setConnectionTimeout(10);
//设置心跳间隔
options.setKeepAliveInterval(20);
//设置当连接断开时发送的死亡预告,当这句被接受到时 证明本连接断开
// options.setWill(publishTopic, (clientId+"destroy").getBytes(), 0, true);
//连接回调函数
client.setCallback(new MqttCallback() {
@Override
public void messageArrived(String topicName, MqttMessage message) throws Exception {
// TODO Auto-generated method stub
Message msg = new Message();
msg.what=1;
msg.obj=message.toString();
handler.sendMessage(msg);
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
// TODO Auto-generated method stub } @Override
public void connectionLost(Throwable cause) {
// TODO Auto-generated method stub }
});
client.connect(options);
client.subscribe(subTopics, subQos);
} catch (MqttException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} /**
* 发送消息
* @param msg
*/
public void sendMessage(String msg){
if(client!=null && client.isConnected()){
System.out.println("MQTT发送消息了呀 "+msg);
try {
MqttMessage message=new MqttMessage();
//设置消息传输的类型 0,1,2可选
message.setQos(2);
//设置是否在服务器中保存消息体
message.setRetained(false);
//设置消息的内容
message.setPayload(msg.getBytes());
//循环发送,因为一次只能一个
for (String publishTopic: publishTopics) {
topic=client.getTopic(publishTopic);
MqttDeliveryToken token = topic.publish(message);
token.waitForCompletion();
}
} catch (MqttPersistenceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MqttException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NullPointerException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}

8. API查看地址
  http://www.eclipse.org/paho/files/javadoc/org/eclipse/paho/client/mqttv3/package-summary.html

MQTT协议之 Apache Apollo服务的更多相关文章

  1. MQTT协议及推送服务

    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建 ...

  2. MQTT协议及推送服务(二)

    MQTT简介 MQTT全称叫做Message Queuing Telemetry Transport,意为消息队列遥测传输,是IBM开发的一个即时通讯协议.由于其维护一个长连接以轻量级低消耗著称,所以 ...

  3. 海鑫智圣:物联网漫谈之MQTT协议

    什么是MQTT协议 MQTT(消息队列遥测传输协议)是IBM在1999年专门针对物联网等应用场景来制订的轻量级双向消息传输协议,它主要是为了解决物联网上使用到的设备的互相通信的问题,以及这些设备与后端 ...

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

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

  5. 采用MQTT协议实现android消息推送(2)MQTT服务端与客户端软件对比、android客户端示列表

    1.服务端软件对比 https://github.com/mqtt/mqtt.github.io/wiki/servers 名称(点名进官网) 特性 简介 收费 支持的客户端语言 IBM MQ 完整的 ...

  6. MQTT实战1 - 使用Apache Apollo代理服务器实现mqtt通信

    MQTT实战1 - 使用Apache Apollo代理服务器实现mqtt通信 MQTT实战2 - 使用MQTTnet实现mqtt通信 源码下载 -> 提取码  QQ:505645074 MQTT ...

  7. MQTT协议学习及实践(Linux服务端,Android客户端的例子)

    前言 MQTT(Message Queuing Telemetry Transport),是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提 ...

  8. 物联网MQTT协议分析和开源Mosquitto部署验证

    在<物联网核心协议—消息推送技术演进>一文中已向读者介绍了多种消息推送技术的情况,包括HTTP单向通信.Ajax轮询.Websocket.MQTT.CoAP等,其中MQTT协议为IBM制定 ...

  9. MQTT协议学习总结

    一.MQTT介绍 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通 ...

随机推荐

  1. Attribute Routing

    Attribute Routing 系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 题外话:由于这个技术点是新学的,并不属于原系列,但借助了原系列 ...

  2. 基于byte[]的HTTP协议头分析代码

    smark 专注于高并发网络和大型网站架规划设计,提供.NET平台下高吞吐的网络通讯应用技术咨询和支持 基于byte[]的HTTP协议头分析代码 最近需要为组件实现一个HTTP的扩展包,所以简单地实现 ...

  3. [Usaco2008 Dec]Patting Heads 轻拍牛头[筛法]

    Description   今天是贝茜的生日,为了庆祝自己的生日,贝茜邀你来玩一个游戏.     贝茜让N(1≤N≤100000)头奶牛坐成一个圈.除了1号与N号奶牛外,i号奶牛与i-l号和i+l号奶 ...

  4. C/C++基础知识总结——多态性

    1. 多态性的概述 1.1 多态是指同样的消息被不同类型的对象接收时导致不同的行为.所谓消息是指对垒的成员函数的调用,不同行为是指不同的实现. 1.2 多态的实现 (1) 实现角度讲多态可分为两类:编 ...

  5. 记关于 Lambda 表达式的基础写法

    namespace MyLambda { public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, ...

  6. mac os apache 配置方法详细介绍

    我使用的Mac OS X版本是10.8.2,Mac自带了Apache环境. 启动Apache 设置虚拟主机 启动Apache 打开“终端(terminal)”,输入 sudo apachectl -v ...

  7. Weka开发[2]-分类器类

    这次介绍如何利用weka里的类对数据集进行分类,要对数据集进行分类,第一步要指定数据集中哪一列做为类别,如果这一步忘记了(事实上经常会忘记)会出现“Class index is negative (n ...

  8. 鸟哥的LINUX私房菜基础篇第三版 阅读笔记 三 Linux磁盘与文件系统管理

    一.认识EXT2文件系统:     a.硬盘的组成:转动小马达+存储的磁盘+读写的机械臂     b.磁盘的一些概念              扇区为最小的物理储存单位,每个扇区为512B       ...

  9. 单一职责原则SRP

    定义: There should nerver be more then one reason for a class to change. 优点: 1.类的复杂性降低,实现什么职责都有清晰明确的定义 ...

  10. Spring.Net-创建对象

    1:通过构造函数创建对象    在配置文件中,指明对象类型<object id="" type="类型全名,程序集名" />    在代码中指定对象 ...