MQTT的学习研究(2)moquette-mqtt 的使用之mqtt broker的启动

来源:互联网 发布:js 保留两位小数 编辑:程序博客网 时间:2024/05/17 13:09
MQTT的学习研究(二)moquette-mqtt 的使用之mqtt broker的启动

        在MQTT 官网 (http://mqtt.org/software)中有众多MQTT的实现方式。具体参看官网,Moquette是基于Apache Mina 的模型的一个Java MQTT broker。使用过Mina的同学发现其实broker的启动过程就是一个Mina应用的启动。

 

 

 在MQTT moquette 中采用MINA作为底层消息的传递方式 
 
本类的目的启动MQTT moquette Broker 的方式,
本文的源代码来自  moquette-broker-0.1-jar-with-dependencies.jar 中的server类
如果想直接启动 moquette-broker-0.1-jar-with-dependencies.jar的jar文件方式
 可以执行一些命令实现 
        java -jar moquette-broker-0.1-jar-with-dependencies.jar
 
 
google code 下载MQTT moquette Broker 地址:
    http://code.google.com/p/moquette-mqtt/
    
GIT 下载MQTT moquette client 地址:
    https://github.com/fusesource/mqtt-client

 

 

在应用程序中使用MQTT的应用:

MQTT moquette 的broker服务启动代码如下:

package com.etrip.mqtt;import java.io.File;import java.io.IOException;import java.net.InetAddress;import java.net.InetSocketAddress;import org.apache.mina.core.service.IoAcceptor;import org.apache.mina.core.service.IoServiceStatistics;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.core.session.IoSession;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.filter.codec.demux.DemuxingProtocolDecoder;import org.apache.mina.filter.codec.demux.DemuxingProtocolEncoder;import org.apache.mina.transport.socket.nio.NioSocketAcceptor;import org.dna.mqtt.moquette.messaging.spi.impl.SimpleMessaging;import org.dna.mqtt.moquette.proto.ConnAckEncoder;import org.dna.mqtt.moquette.proto.ConnectDecoder;import org.dna.mqtt.moquette.proto.DisconnectDecoder;import org.dna.mqtt.moquette.proto.DisconnectEncoder;import org.dna.mqtt.moquette.proto.MQTTLoggingFilter;import org.dna.mqtt.moquette.proto.PingReqDecoder;import org.dna.mqtt.moquette.proto.PingRespEncoder;import org.dna.mqtt.moquette.proto.PubAckDecoder;import org.dna.mqtt.moquette.proto.PubAckEncoder;import org.dna.mqtt.moquette.proto.PubCompDecoder;import org.dna.mqtt.moquette.proto.PubCompEncoder;import org.dna.mqtt.moquette.proto.PubCompMessage;import org.dna.mqtt.moquette.proto.PubRecDecoder;import org.dna.mqtt.moquette.proto.PubRecEncoder;import org.dna.mqtt.moquette.proto.PubRelDecoder;import org.dna.mqtt.moquette.proto.PubRelEncoder;import org.dna.mqtt.moquette.proto.PublishDecoder;import org.dna.mqtt.moquette.proto.PublishEncoder;import org.dna.mqtt.moquette.proto.SubAckEncoder;import org.dna.mqtt.moquette.proto.SubscribeDecoder;import org.dna.mqtt.moquette.proto.UnsubAckEncoder;import org.dna.mqtt.moquette.proto.UnsubscribeDecoder;import org.dna.mqtt.moquette.proto.messages.ConnAckMessage;import org.dna.mqtt.moquette.proto.messages.DisconnectMessage;import org.dna.mqtt.moquette.proto.messages.PingRespMessage;import org.dna.mqtt.moquette.proto.messages.PubAckMessage;import org.dna.mqtt.moquette.proto.messages.PubRecMessage;import org.dna.mqtt.moquette.proto.messages.PubRelMessage;import org.dna.mqtt.moquette.proto.messages.PublishMessage;import org.dna.mqtt.moquette.proto.messages.SubAckMessage;import org.dna.mqtt.moquette.proto.messages.UnsubAckMessage;import org.dna.mqtt.moquette.server.MQTTHandler;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** *  * 在MQTT moquette 中采用MINA作为底层消息的传递方式  *  * 本类的目的启动MQTT moquette Broker 的方式, *本文的源代码来自  moquette-broker-0.1-jar-with-dependencies.jar 中的server类 * 如果想直接启动 moquette-broker-0.1-jar-with-dependencies.jar的jar文件方式 * 可以执行一些命令实现  *        java -jar moquette-broker-0.1-jar-with-dependencies.jar *  *  * google code 下载MQTT moquette Broker 地址: *    http://code.google.com/p/moquette-mqtt/ *     * GIT 下载MQTT moquette client 地址: *  https://github.com/fusesource/mqtt-client  *     * @author longgangbai *  *  */public class MQTTBrokerProxyServer {  private static final Logger LOG = LoggerFactory.getLogger(MQTTBrokerProxyServer.class);  public static final String STORAGE_FILE_PATH = System.getProperty("user.home") + File.separator + "moquette_store.hawtdb";  private IoAcceptor m_acceptor;  SimpleMessaging messaging;  public static void main(String[] args)    throws IOException  {    new MQTTBrokerProxyServer().startServer();  }  protected void startServer() throws IOException  {//编码协议类编码器    DemuxingProtocolDecoder decoder = new DemuxingProtocolDecoder();    decoder.addMessageDecoder(new ConnectDecoder());//连接编码    decoder.addMessageDecoder(new PublishDecoder());//发布编码    decoder.addMessageDecoder(new PubAckDecoder());//发布回执编码    decoder.addMessageDecoder(new PubRelDecoder());    decoder.addMessageDecoder(new PubRecDecoder());//接收编码    decoder.addMessageDecoder(new PubCompDecoder());    decoder.addMessageDecoder(new SubscribeDecoder());//订阅编码    decoder.addMessageDecoder(new UnsubscribeDecoder());//取消订阅编码    decoder.addMessageDecoder(new DisconnectDecoder());//断开连接编码    decoder.addMessageDecoder(new PingReqDecoder());//心跳ping请求编码            //解码协议类解码器    DemuxingProtocolEncoder encoder = new DemuxingProtocolEncoder();    encoder.addMessageEncoder(ConnAckMessage.class, new ConnAckEncoder());//连接解码    encoder.addMessageEncoder(SubAckMessage.class, new SubAckEncoder());//订阅通知解码    encoder.addMessageEncoder(UnsubAckMessage.class, new UnsubAckEncoder());//取消订阅解码    encoder.addMessageEncoder(PubAckMessage.class, new PubAckEncoder());//发布回执解码    encoder.addMessageEncoder(PubRecMessage.class, new PubRecEncoder());//接收解码    encoder.addMessageEncoder(PubCompMessage.class, new PubCompEncoder());    encoder.addMessageEncoder(PubRelMessage.class, new PubRelEncoder());    encoder.addMessageEncoder(PublishMessage.class, new PublishEncoder());//发布解码    encoder.addMessageEncoder(PingRespMessage.class, new PingRespEncoder());//心跳ping相应解码    encoder.addMessageEncoder(DisconnectMessage.class,new DisconnectEncoder());//断开连接解码        this.m_acceptor = new NioSocketAcceptor();        //设置日志的过滤链    this.m_acceptor.getFilterChain().addLast("logger", new MQTTLoggingFilter("SERVER LOG"));    //设置编码的过滤链    this.m_acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(encoder, decoder));        //创建业务处理器类    MQTTHandler handler = new MQTTHandler();    //创建一个处理消息体的消息    this.messaging = SimpleMessaging.getInstance();    this.messaging.init();        //设置消息体    handler.setMessaging(this.messaging);    //设置业务处理器类    this.m_acceptor.setHandler(handler);        ((NioSocketAcceptor)this.m_acceptor).setReuseAddress(true);    ((NioSocketAcceptor)this.m_acceptor).getSessionConfig().setReuseAddress(true);    this.m_acceptor.getSessionConfig().setReadBufferSize(2048);    this.m_acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);    this.m_acceptor.getStatistics().setThroughputCalculationInterval(10);    this.m_acceptor.getStatistics().updateThroughput(System.currentTimeMillis());    //设置端口号    this.m_acceptor.bind(new InetSocketAddress(1883));    //获取绑定的本地的ip地址     LOG.info("Server binded"+InetAddress.getLocalHost().getHostAddress());    try {Thread.sleep(100000000000000L);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}//销毁broker对象的各种信息    Runtime.getRuntime().addShutdownHook(new Thread()    {      public void run() {      MQTTBrokerProxyServer.this.stopServer();      }    });  }  protected void stopServer() {    LOG.info("Server stopping...");            this.messaging.stop();        //Mina  IO 统计类    IoServiceStatistics statistics = this.m_acceptor.getStatistics();    statistics.updateThroughput(System.currentTimeMillis());    System.out.println(String.format("Total read bytes: %d, read throughtput: %f (b/s)", new Object[] { Long.valueOf(statistics.getReadBytes()), Double.valueOf(statistics.getReadBytesThroughput()) }));    System.out.println(String.format("Total read msgs: %d, read msg throughtput: %f (msg/s)", new Object[] { Long.valueOf(statistics.getReadMessages()), Double.valueOf(statistics.getReadMessagesThroughput()) }));        //关闭相关的会话    for (IoSession session : this.m_acceptor.getManagedSessions().values()) {      if ((session.isConnected()) && (!session.isClosing())) {        session.close(false);      }    }        //销毁本地IoAcceptor对象    this.m_acceptor.unbind();    this.m_acceptor.dispose();    LOG.info("Server stopped");  }}

 

      由 以上代码可以看出,在发布订阅,心跳检测,连接断开,连接时候都需要创建相关的协议编码器对象类中添加相关的编码器对象。

        MQTTHandler类为主要broker处理发布和订阅消息的业务处理器类。

        IoServiceStatistics类信息统计类。主要统计在mina应用中读写信息的统计。

 

上面代码主要讲解MQTT moquette的启动下面主要讲述服务段发布消息和客户端订阅接收信息的实现。

 

MQTT的学习研究(三)moquette-mqtt 的使用之mqtt服务发布主题信息

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 痔疮手术后肚子胀气怎么办 乙肝引起的发烧头痛怎么办 肠癌手术后吃了会胃疼怎么办 来月经肛门坠痛怎么办 总想排便还有血怎么办 闻了别人的口臭怎么办 有内痔肛门经常不舒服怎么办 做完肠镜肛门疼怎么办 3周宝宝得皮彦怎么办 痔疮有蚕豆大了怎么办 顺生肛门坠胀怎么办 生孩子痔疮脱出不能回纳怎么办 痔疮犯了屁眼疼怎么办 孕晚期得痔疮了怎么办 孕39周痔疮严重怎么办 顺产后长痔疮了怎么办 怀孕了犯痔疮了怎么办 怀孕了痔疮犯了怎么办 痔疮手术后肛裂怎么办 痔疮引起的肛裂怎么办 痔疮手术后伤口不愈合怎么办 痔疮手术后伤口痒怎么办 肛瘘手术十五天后伤口疼怎么办 leep刀后hpv还是阳性怎么办 结肠息肉钳除后怎么办 痔疮手术后排便困难怎么办 住院未结账跑了怎么办 来月经痔疮犯了怎么办 安保压不下宫缩怎么办 肛周脓肿术后假性愈合怎么办 肛门的皱褶肿了怎么办 1月婴儿排便困难怎么办 吃完辣的痔疮肿了怎么办 肛裂怎么办兰州来医博.相信 胎儿脐带绕颈一周怎么办 郑大一附院怎么办合作医疗 痔疮包不消怎么办很疼 痔疮内扎手术后直肠窄小怎么办 2个月大的宝宝鼻塞怎么办 宝宝鼻屎比较深怎么办 来例假痔疮犯了怎么办