MQTT Moquette Broker 在 Android 项目中的使用

准备工作

moquette源码下载:GitHub - moquette-io/moquette

按照说明文件将moquette嵌入到Android项目中。

Moquette Broker 源码阅读

可以参考这篇文章:moquette源码学习_moquette-io 源代码-CSDN博客

最重要的代码是Server类中的startServer方法。

流程:实现SSL协议->身份验证->持久化处理->授权->netty实现mqtt

public void startServer(IConfig config, List<? extends InterceptHandler> handlers, ISslContextCreator sslCtxCreator,
                        IAuthenticator authenticator, IAuthorizatorPolicy authorizatorPolicy) {
    final long start = System.currentTimeMillis();
    if (handlers == null) {
        handlers = Collections.emptyList();
    }
    LOG.trace("Starting Moquette Server. MQTT message interceptors={}", getInterceptorIds(handlers));

    scheduler = Executors.newScheduledThreadPool(1);

    final String handlerProp = System.getProperty(BrokerConstants.INTERCEPT_HANDLER_PROPERTY_NAME);
    if (handlerProp != null) {
        config.setProperty(BrokerConstants.INTERCEPT_HANDLER_PROPERTY_NAME, handlerProp);
    }
    final String persistencePath = config.getProperty(BrokerConstants.PERSISTENT_STORE_PROPERTY_NAME);
    LOG.debug("Configuring Using persistent store file, path: {}", persistencePath);
    initInterceptors(config, handlers);    //拦截器
    LOG.debug("Initialized MQTT protocol processor");
    // 实现SSL协议
    if (sslCtxCreator == null) {
        LOG.info("Using default SSL context creator");
        sslCtxCreator = new DefaultMoquetteSslContextCreator(config);
    }
    //身份验证
    authenticator = initializeAuthenticator(authenticator, config);
    authorizatorPolicy = initializeAuthorizatorPolicy(authorizatorPolicy, config);

    final ISubscriptionsRepository subscriptionsRepository;
    final IQueueRepository queueRepository;
    final IRetainedRepository retainedRepository;
    //持久化处理
    if (persistencePath != null && !persistencePath.isEmpty()) {
        LOG.trace("Configuring H2 subscriptions store to {}", persistencePath);
        //初始化h2数据库
        h2Builder = new H2Builder(config, scheduler).initStore();
        //建立订阅主题的存储库
        subscriptionsRepository = h2Builder.subscriptionsRepository();
        //创建队列
        queueRepository = h2Builder.queueRepository();
        //创建历史信息的数据库
        retainedRepository = h2Builder.retainedRepository();
    } else {
        //不持久化处理,内存存储,断电丢失
        LOG.trace("Configuring in-memory subscriptions store");
        subscriptionsRepository = new MemorySubscriptionsRepository();
        queueRepository = new MemoryQueueRepository();
        retainedRepository = new MemoryRetainedRepository();
    }
    //初始化订阅主题
    ISubscriptionsDirectory subscriptions = new CTrieSubscriptionDirectory();
    subscriptions.init(subscriptionsRepository);
    //授权
    final Authorizator authorizator = new Authorizator(authorizatorPolicy);
    sessions = new SessionRegistry(subscriptions, queueRepository, authorizator);
    dispatcher = new PostOffice(subscriptions, retainedRepository, sessions, interceptor, authorizator);
    final BrokerConfiguration brokerConfig = new BrokerConfiguration(config);
    //mqtt连接工厂
    MQTTConnectionFactory connectionFactory = new MQTTConnectionFactory(brokerConfig, authenticator, sessions,
                                                                        dispatcher);
    /*
    netty实现mqtt
    */
    //根据连接信息创建
    final NewNettyMQTTHandler mqttHandler = new NewNettyMQTTHandler(connectionFactory);
    //启动netty
    acceptor = new NewNettyAcceptor();
    acceptor.initialize(mqttHandler, config, sslCtxCreator);

    final long startTime = System.currentTimeMillis() - start;
    LOG.info("Moquette integration has been started successfully in {} ms", startTime);
    initialized = true;
}

调用方法

调用Moquette Broker的方法很简单,即创建一个server类,并传入参数。我传入了config和authenticator两个参数。

config:通过setProperty方法,可以设置broker的基本参数。

authenticator:用于进行身份验证。设置为AcceptAllAuthenticator子类,允许任何身份的用户访问。

package com.example.moquettetest;

import android.app.Activity;
import android.os.Bundle;

import java.io.IOException;
import java.util.Properties;

import io.moquette.broker.Server;
import io.moquette.broker.config.IConfig;
import io.moquette.broker.config.MemoryConfig;
import io.moquette.broker.security.AcceptAllAuthenticator;

import android.widget.Toast;

public class MainActivity extends Activity {
    private Server server;
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        server = new Server();
        Properties m_properties = new Properties();
        MemoryConfig m_config = new MemoryConfig(m_properties);
        //m_config.setProperty("PORT_PROPERTY_NAME","1883");
        m_config.setProperty("PASSWORD_FILE_PROPERTY_NAME","");

        AcceptAllAuthenticator authenticator = new AcceptAllAuthenticator();
        server.startServer(m_config,null,null,authenticator,null);
        Toast.makeText(MainActivity.this,"Start Server",Toast.LENGTH_SHORT).show();
    }
}

注意:这份代码只是能调用Moquette Broker,但不够严谨,缺少连接校验等步骤。 

Paho Client的使用可以参考我的另一篇文章:MQTT Paho Client 在 Android 项目中的使用-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值