一、说明

  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. 使用TotoriseSVN的分支/标签功能

    使用TotoriseSVN的分支/标签功能 http://blog.sina.com.cn/s/blog_5383588c0100o1oo.html 原来在新建一个项目文件夹后,再把Trunk.Bra ...

  2. 栈和队列简单的STL模板

    栈的使用,可以想象成是只有一个出口,最后进来的那个最先出去: #include <stack> 队列:是有两个出口,但是进来了之后只能从前门出去,也就是最先进来的那个最后出去: #incl ...

  3. Hive中Bucket的应用

    网友南京-李先森给了他收集的一些资料,如下: Buckets 对指定列计算 hash,根据 hash 值切分数据,目的是为了并行,每一个 Bucket 对应一个文件.如将 user 列分散至 32 个 ...

  4. [C#、winform] FormDesigner.cs报错The variable 'xxxxxx' is either undeclared or was never assigned

    背景: 我写了一个App.config配置文件,在里面定义了模块: <add key="key1" value="std1|std2|std3|std4" ...

  5. python JSON API duckduckgo search engine 使用duckduckgo API 尝试搜索引擎

    The duckduckgo.com's search engine is very neat to use. Acutally it has many things to do with other ...

  6. python实现基于CGI的Web应用

    python实现基于CGI的Web应用 本文用一个“网上书店”的web应用示例,简要介绍如何用Python实现基于CGI标准的Web应用,介绍python的cgi模块.cigtb模块对编写CGI脚本提 ...

  7. POJ 3342 - Party at Hali-Bula 树型DP+最优解唯一性判断

    好久没写树型dp了...以前都是先找到叶子节点.用队列维护来做的...这次学着vector动态数组+DFS回朔的方法..感觉思路更加的清晰... 关于题目的第一问...能邀请到的最多人数..so ea ...

  8. [置顶] 使用Android OpenGL ES 2.0绘图之六:响应触摸事件

    传送门 ☞ 系统架构设计 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 传送门 ☞ GoF23种设计模式 ☞ 转载请注明 ☞ http://blog.csd ...

  9. Ext JS4百强应用: 用grid.plugin.CellEditing做高级查询 --第10强

    Ext JS4,用grid.plugin.CellEditing做高级查询: 写了90%,界面出来了,小兴奋就贴出来,还有细节要调整,基本能用. 代码: Ext.define('chenghao.ad ...

  10. 浅析CDN存在的必要性

    CDN行业从出现至今,已经有近20年的历史.但是直到近些年互联网进入超高速发展阶段,CDN才得以得到更广泛的应用和发展.最开始,CDN的主要任务只是简单的内容分发,对于静态内容的加速没有问题.但是随着 ...