tmp commit to merge with master
This commit is contained in:
parent
f7f6045800
commit
bc591ce09f
@ -86,6 +86,19 @@
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.protobuf</groupId>
|
||||
<artifactId>protobuf-java</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.xolstice.maven.plugins</groupId>
|
||||
<artifactId>protobuf-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
|
||||
@ -0,0 +1,16 @@
|
||||
package org.thingsboard.server.common.transport;
|
||||
|
||||
import org.thingsboard.server.gen.transport.TransportProtos;
|
||||
|
||||
/**
|
||||
* Created by ashvayka on 04.10.18.
|
||||
*/
|
||||
public interface TransportService {
|
||||
|
||||
void process(TransportProtos.SessionEventMsg msg);
|
||||
|
||||
void process(TransportProtos.PostTelemetryMsg msg);
|
||||
|
||||
void process(TransportProtos.PostAttributeMsg msg);
|
||||
|
||||
}
|
||||
79
common/transport/src/main/proto/transport.proto
Normal file
79
common/transport/src/main/proto/transport.proto
Normal file
@ -0,0 +1,79 @@
|
||||
/**
|
||||
* Copyright © 2016-2018 The Thingsboard Authors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
syntax = "proto3";
|
||||
package transport;
|
||||
|
||||
option java_package = "org.thingsboard.server.gen.transport";
|
||||
option java_outer_classname = "TransportProtos";
|
||||
|
||||
/**
|
||||
* Data Structures;
|
||||
*/
|
||||
message SessionInfoProto {
|
||||
string nodeId = 1;
|
||||
int64 sessionIdMSB = 2;
|
||||
int64 sessionIdLSB = 3;
|
||||
}
|
||||
|
||||
enum SessionEvent {
|
||||
OPEN = 0;
|
||||
CLOSED = 1;
|
||||
}
|
||||
|
||||
message KeyValueProto {
|
||||
string key = 1;
|
||||
bool bool_v = 2;
|
||||
int64 long_v = 3;
|
||||
double double_v = 4;
|
||||
string string_v = 5;
|
||||
}
|
||||
|
||||
message TsKvListProto {
|
||||
int64 ts = 1;
|
||||
repeated KeyValueProto kv = 2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Messages that use Data Structures;
|
||||
*/
|
||||
message SessionEventMsg {
|
||||
SessionInfoProto sessionInfo = 1;
|
||||
int64 deviceIdMSB = 2;
|
||||
int64 deviceIdLSB = 3;
|
||||
}
|
||||
|
||||
message PostTelemetryMsg {
|
||||
SessionInfoProto sessionInfo = 1;
|
||||
repeated TsKvListProto tsKvList = 2;
|
||||
}
|
||||
|
||||
message PostAttributeMsg {
|
||||
SessionInfoProto sessionInfo = 1;
|
||||
repeated TsKvListProto tsKvList = 2;
|
||||
}
|
||||
|
||||
message GetAttributeRequestMsg {
|
||||
SessionInfoProto sessionInfo = 1;
|
||||
repeated string clientAttributeNames = 2;
|
||||
repeated string sharedAttributeNames = 3;
|
||||
}
|
||||
|
||||
message GetAttributeResponseMsg {
|
||||
SessionInfoProto sessionInfo = 1;
|
||||
repeated TsKvListProto clientAttributeList = 2;
|
||||
repeated TsKvListProto sharedAttributeList = 3;
|
||||
repeated string deletedAttributeKeys = 4;
|
||||
}
|
||||
@ -60,7 +60,6 @@ public class MqttSslHandlerProvider {
|
||||
@Autowired
|
||||
private DeviceCredentialsService deviceCredentialsService;
|
||||
|
||||
|
||||
public SslHandler getSslHandler() {
|
||||
try {
|
||||
URL ksUrl = Resources.getResource(keyStoreFile);
|
||||
|
||||
@ -0,0 +1,38 @@
|
||||
package org.thingsboard.server.transport.mqtt;
|
||||
|
||||
import io.netty.handler.ssl.SslHandler;
|
||||
import lombok.Data;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.thingsboard.server.common.transport.TransportService;
|
||||
import org.thingsboard.server.common.transport.quota.host.HostRequestsQuotaService;
|
||||
import org.thingsboard.server.transport.mqtt.adaptors.MqttTransportAdaptor;
|
||||
|
||||
/**
|
||||
* Created by ashvayka on 04.10.18.
|
||||
*/
|
||||
@Component
|
||||
@Data
|
||||
public class MqttTransportContext {
|
||||
|
||||
@Autowired
|
||||
@Lazy
|
||||
private TransportService transportService;
|
||||
|
||||
@Autowired(required = false)
|
||||
private MqttSslHandlerProvider sslHandlerProvider;
|
||||
|
||||
@Autowired(required = false)
|
||||
private HostRequestsQuotaService quotaService;
|
||||
|
||||
@Autowired
|
||||
private MqttTransportAdaptor adaptor;
|
||||
|
||||
@Value("${mqtt.netty.max_payload_size}")
|
||||
private Integer maxPayloadSize;
|
||||
|
||||
private SslHandler sslHandler;
|
||||
|
||||
}
|
||||
@ -22,6 +22,7 @@ import io.netty.handler.codec.mqtt.MqttDecoder;
|
||||
import io.netty.handler.codec.mqtt.MqttEncoder;
|
||||
import io.netty.handler.ssl.SslHandler;
|
||||
import org.thingsboard.server.common.transport.SessionMsgProcessor;
|
||||
import org.thingsboard.server.common.transport.TransportService;
|
||||
import org.thingsboard.server.common.transport.auth.DeviceAuthService;
|
||||
import org.thingsboard.server.common.transport.quota.QuotaService;
|
||||
import org.thingsboard.server.dao.device.DeviceService;
|
||||
@ -33,41 +34,25 @@ import org.thingsboard.server.transport.mqtt.adaptors.MqttTransportAdaptor;
|
||||
*/
|
||||
public class MqttTransportServerInitializer extends ChannelInitializer<SocketChannel> {
|
||||
|
||||
private final SessionMsgProcessor processor;
|
||||
private final DeviceService deviceService;
|
||||
private final DeviceAuthService authService;
|
||||
private final RelationService relationService;
|
||||
private final MqttTransportAdaptor adaptor;
|
||||
private final MqttSslHandlerProvider sslHandlerProvider;
|
||||
private final QuotaService quotaService;
|
||||
private final int maxPayloadSize;
|
||||
private final MqttTransportContext context;
|
||||
|
||||
public MqttTransportServerInitializer(SessionMsgProcessor processor, DeviceService deviceService, DeviceAuthService authService, RelationService relationService,
|
||||
MqttTransportAdaptor adaptor, MqttSslHandlerProvider sslHandlerProvider,
|
||||
QuotaService quotaService, int maxPayloadSize) {
|
||||
this.processor = processor;
|
||||
this.deviceService = deviceService;
|
||||
this.authService = authService;
|
||||
this.relationService = relationService;
|
||||
this.adaptor = adaptor;
|
||||
this.sslHandlerProvider = sslHandlerProvider;
|
||||
this.quotaService = quotaService;
|
||||
this.maxPayloadSize = maxPayloadSize;
|
||||
public MqttTransportServerInitializer(MqttTransportContext context) {
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initChannel(SocketChannel ch) {
|
||||
ChannelPipeline pipeline = ch.pipeline();
|
||||
SslHandler sslHandler = null;
|
||||
if (sslHandlerProvider != null) {
|
||||
sslHandler = sslHandlerProvider.getSslHandler();
|
||||
if (context.getSslHandlerProvider() != null) {
|
||||
sslHandler = context.getSslHandlerProvider().getSslHandler();
|
||||
pipeline.addLast(sslHandler);
|
||||
context.setSslHandler(sslHandler);
|
||||
}
|
||||
pipeline.addLast("decoder", new MqttDecoder(maxPayloadSize));
|
||||
pipeline.addLast("decoder", new MqttDecoder(context.getMaxPayloadSize()));
|
||||
pipeline.addLast("encoder", MqttEncoder.INSTANCE);
|
||||
|
||||
MqttTransportHandler handler = new MqttTransportHandler(processor, deviceService, authService, relationService,
|
||||
adaptor, sslHandler, quotaService);
|
||||
MqttTransportHandler handler = new MqttTransportHandler(context);
|
||||
|
||||
pipeline.addLast(handler);
|
||||
ch.closeFuture().addListener(handler);
|
||||
|
||||
@ -23,11 +23,14 @@ import io.netty.channel.socket.nio.NioServerSocketChannel;
|
||||
import io.netty.util.ResourceLeakDetector;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.thingsboard.server.common.transport.SessionMsgProcessor;
|
||||
import org.thingsboard.server.common.transport.TransportService;
|
||||
import org.thingsboard.server.common.transport.auth.DeviceAuthService;
|
||||
import org.thingsboard.server.common.transport.quota.host.HostRequestsQuotaService;
|
||||
import org.thingsboard.server.dao.device.DeviceService;
|
||||
@ -48,27 +51,6 @@ public class MqttTransportService {
|
||||
private static final String V1 = "v1";
|
||||
private static final String DEVICE = "device";
|
||||
|
||||
@Autowired(required = false)
|
||||
private ApplicationContext appContext;
|
||||
|
||||
@Autowired(required = false)
|
||||
private SessionMsgProcessor processor;
|
||||
|
||||
@Autowired(required = false)
|
||||
private DeviceService deviceService;
|
||||
|
||||
@Autowired(required = false)
|
||||
private DeviceAuthService authService;
|
||||
|
||||
@Autowired(required = false)
|
||||
private RelationService relationService;
|
||||
|
||||
@Autowired(required = false)
|
||||
private MqttSslHandlerProvider sslHandlerProvider;
|
||||
|
||||
@Autowired(required = false)
|
||||
private HostRequestsQuotaService quotaService;
|
||||
|
||||
@Value("${mqtt.bind_address}")
|
||||
private String host;
|
||||
@Value("${mqtt.bind_port}")
|
||||
@ -82,10 +64,9 @@ public class MqttTransportService {
|
||||
private Integer bossGroupThreadCount;
|
||||
@Value("${mqtt.netty.worker_group_thread_count}")
|
||||
private Integer workerGroupThreadCount;
|
||||
@Value("${mqtt.netty.max_payload_size}")
|
||||
private Integer maxPayloadSize;
|
||||
|
||||
private MqttTransportAdaptor adaptor;
|
||||
@Autowired
|
||||
private MqttTransportContext context;
|
||||
|
||||
private Channel serverChannel;
|
||||
private EventLoopGroup bossGroup;
|
||||
@ -97,17 +78,12 @@ public class MqttTransportService {
|
||||
ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.valueOf(leakDetectorLevel.toUpperCase()));
|
||||
|
||||
log.info("Starting MQTT transport...");
|
||||
log.info("Lookup MQTT transport adaptor {}", adaptorName);
|
||||
this.adaptor = (MqttTransportAdaptor) appContext.getBean(adaptorName);
|
||||
|
||||
log.info("Starting MQTT transport server");
|
||||
bossGroup = new NioEventLoopGroup(bossGroupThreadCount);
|
||||
workerGroup = new NioEventLoopGroup(workerGroupThreadCount);
|
||||
ServerBootstrap b = new ServerBootstrap();
|
||||
b.group(bossGroup, workerGroup)
|
||||
.channel(NioServerSocketChannel.class)
|
||||
.childHandler(new MqttTransportServerInitializer(processor, deviceService, authService, relationService,
|
||||
adaptor, sslHandlerProvider, quotaService, maxPayloadSize));
|
||||
.childHandler(new MqttTransportServerInitializer(context));
|
||||
|
||||
serverChannel = b.bind(host, port).sync().channel();
|
||||
log.info("Mqtt transport started!");
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user