准备工作
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博客