|
|
@ -36,6 +36,7 @@ import lombok.extern.slf4j.Slf4j; |
|
|
import org.springframework.util.CollectionUtils; |
|
|
import org.springframework.util.CollectionUtils; |
|
|
import org.springframework.util.ConcurrentReferenceHashMap; |
|
|
import org.springframework.util.ConcurrentReferenceHashMap; |
|
|
import org.thingsboard.server.common.data.StringUtils; |
|
|
import org.thingsboard.server.common.data.StringUtils; |
|
|
|
|
|
import org.thingsboard.server.common.data.exception.ThingsboardException; |
|
|
import org.thingsboard.server.common.data.id.DeviceId; |
|
|
import org.thingsboard.server.common.data.id.DeviceId; |
|
|
import org.thingsboard.server.common.transport.TransportService; |
|
|
import org.thingsboard.server.common.transport.TransportService; |
|
|
import org.thingsboard.server.common.transport.TransportServiceCallback; |
|
|
import org.thingsboard.server.common.transport.TransportServiceCallback; |
|
|
@ -75,8 +76,9 @@ import static org.thingsboard.server.common.transport.service.DefaultTransportSe |
|
|
import static org.thingsboard.server.common.transport.service.DefaultTransportService.SESSION_EVENT_MSG_OPEN; |
|
|
import static org.thingsboard.server.common.transport.service.DefaultTransportService.SESSION_EVENT_MSG_OPEN; |
|
|
import static org.thingsboard.server.common.transport.service.DefaultTransportService.SUBSCRIBE_TO_ATTRIBUTE_UPDATES_ASYNC_MSG; |
|
|
import static org.thingsboard.server.common.transport.service.DefaultTransportService.SUBSCRIBE_TO_ATTRIBUTE_UPDATES_ASYNC_MSG; |
|
|
import static org.thingsboard.server.common.transport.service.DefaultTransportService.SUBSCRIBE_TO_RPC_ASYNC_MSG; |
|
|
import static org.thingsboard.server.common.transport.service.DefaultTransportService.SUBSCRIBE_TO_RPC_ASYNC_MSG; |
|
|
import static org.thingsboard.server.transport.mqtt.util.sparkplug.SparkplugMessageType.STATE; |
|
|
|
|
|
import static org.thingsboard.server.transport.mqtt.util.sparkplug.SparkplugConnectionState.OFFLINE; |
|
|
import static org.thingsboard.server.transport.mqtt.util.sparkplug.SparkplugConnectionState.OFFLINE; |
|
|
|
|
|
import static org.thingsboard.server.transport.mqtt.util.sparkplug.SparkplugMessageType.STATE; |
|
|
|
|
|
import static org.thingsboard.server.transport.mqtt.util.sparkplug.SparkplugMessageType.messageName; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* Created by ashvayka on 19.01.17. |
|
|
* Created by ashvayka on 19.01.17. |
|
|
@ -246,45 +248,45 @@ public abstract class AbstractGatewaySessionHandler { |
|
|
if (future != null) { |
|
|
if (future != null) { |
|
|
return future; |
|
|
return future; |
|
|
} |
|
|
} |
|
|
try { |
|
|
try { |
|
|
transportService.process(GetOrCreateDeviceFromGatewayRequestMsg.newBuilder() |
|
|
transportService.process(GetOrCreateDeviceFromGatewayRequestMsg.newBuilder() |
|
|
.setDeviceName(deviceName) |
|
|
.setDeviceName(deviceName) |
|
|
.setDeviceType(deviceType) |
|
|
.setDeviceType(deviceType) |
|
|
.setGatewayIdMSB(gateway.getDeviceId().getId().getMostSignificantBits()) |
|
|
.setGatewayIdMSB(gateway.getDeviceId().getId().getMostSignificantBits()) |
|
|
.setGatewayIdLSB(gateway.getDeviceId().getId().getLeastSignificantBits()) |
|
|
.setGatewayIdLSB(gateway.getDeviceId().getId().getLeastSignificantBits()) |
|
|
.setSparkplug(this.deviceSessionCtx.isSparkplug()) |
|
|
.setSparkplug(this.deviceSessionCtx.isSparkplug()) |
|
|
.build(), |
|
|
.build(), |
|
|
new TransportServiceCallback<>() { |
|
|
new TransportServiceCallback<>() { |
|
|
@Override |
|
|
@Override |
|
|
public void onSuccess(GetOrCreateDeviceFromGatewayResponse msg) { |
|
|
public void onSuccess(GetOrCreateDeviceFromGatewayResponse msg) { |
|
|
AbstractGatewayDeviceSessionContext deviceSessionCtx = newDeviceSessionCtx(msg); |
|
|
AbstractGatewayDeviceSessionContext deviceSessionCtx = newDeviceSessionCtx(msg); |
|
|
if (devices.putIfAbsent(deviceName, deviceSessionCtx) == null) { |
|
|
if (devices.putIfAbsent(deviceName, deviceSessionCtx) == null) { |
|
|
log.trace("[{}] First got or created device [{}], type [{}] for the gateway session", sessionId, deviceName, deviceType); |
|
|
log.trace("[{}] First got or created device [{}], type [{}] for the gateway session", sessionId, deviceName, deviceType); |
|
|
SessionInfoProto deviceSessionInfo = deviceSessionCtx.getSessionInfo(); |
|
|
SessionInfoProto deviceSessionInfo = deviceSessionCtx.getSessionInfo(); |
|
|
transportService.registerAsyncSession(deviceSessionInfo, deviceSessionCtx); |
|
|
transportService.registerAsyncSession(deviceSessionInfo, deviceSessionCtx); |
|
|
transportService.process(TransportProtos.TransportToDeviceActorMsg.newBuilder() |
|
|
transportService.process(TransportProtos.TransportToDeviceActorMsg.newBuilder() |
|
|
.setSessionInfo(deviceSessionInfo) |
|
|
.setSessionInfo(deviceSessionInfo) |
|
|
.setSessionEvent(SESSION_EVENT_MSG_OPEN) |
|
|
.setSessionEvent(SESSION_EVENT_MSG_OPEN) |
|
|
.setSubscribeToAttributes(SUBSCRIBE_TO_ATTRIBUTE_UPDATES_ASYNC_MSG) |
|
|
.setSubscribeToAttributes(SUBSCRIBE_TO_ATTRIBUTE_UPDATES_ASYNC_MSG) |
|
|
.setSubscribeToRPC(SUBSCRIBE_TO_RPC_ASYNC_MSG) |
|
|
.setSubscribeToRPC(SUBSCRIBE_TO_RPC_ASYNC_MSG) |
|
|
.build(), null); |
|
|
.build(), null); |
|
|
} |
|
|
|
|
|
futureToSet.set(devices.get(deviceName)); |
|
|
|
|
|
deviceFutures.remove(deviceName); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
futureToSet.set(devices.get(deviceName)); |
|
|
|
|
|
deviceFutures.remove(deviceName); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public void onError(Throwable e) { |
|
|
public void onError(Throwable e) { |
|
|
log.warn("[{}] Failed to process device connect command: {}", sessionId, deviceName, e); |
|
|
log.warn("[{}] Failed to process device connect command: {}", sessionId, deviceName, e); |
|
|
futureToSet.setException(e); |
|
|
futureToSet.setException(e); |
|
|
deviceFutures.remove(deviceName); |
|
|
deviceFutures.remove(deviceName); |
|
|
} |
|
|
} |
|
|
}); |
|
|
}); |
|
|
return futureToSet; |
|
|
return futureToSet; |
|
|
} catch (Throwable e) { |
|
|
} catch (Throwable e) { |
|
|
deviceFutures.remove(deviceName); |
|
|
deviceFutures.remove(deviceName); |
|
|
throw e; |
|
|
throw e; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
protected abstract AbstractGatewayDeviceSessionContext newDeviceSessionCtx(GetOrCreateDeviceFromGatewayResponse msg); |
|
|
protected abstract AbstractGatewayDeviceSessionContext newDeviceSessionCtx(GetOrCreateDeviceFromGatewayResponse msg); |
|
|
@ -727,7 +729,7 @@ public abstract class AbstractGatewaySessionHandler { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private void deregisterSession(String deviceName, MqttDeviceAwareSessionContext deviceSessionCtx) { |
|
|
private void deregisterSession(String deviceName, MqttDeviceAwareSessionContext deviceSessionCtx) { |
|
|
if (this.deviceSessionCtx.isSparkplug()){ |
|
|
if (this.deviceSessionCtx.isSparkplug()) { |
|
|
// add Msg Telemetry: key STATE type: String value: OFFLINE ts: sparkplugBProto.getTimestamp()
|
|
|
// add Msg Telemetry: key STATE type: String value: OFFLINE ts: sparkplugBProto.getTimestamp()
|
|
|
sendSparkplugStateOnTelemetry(deviceSessionCtx.getSessionInfo(), |
|
|
sendSparkplugStateOnTelemetry(deviceSessionCtx.getSessionInfo(), |
|
|
deviceSessionCtx.getDeviceInfo().getDeviceName(), OFFLINE, new Date().getTime()); |
|
|
deviceSessionCtx.getDeviceInfo().getDeviceName(), OFFLINE, new Date().getTime()); |
|
|
@ -739,10 +741,15 @@ public abstract class AbstractGatewaySessionHandler { |
|
|
|
|
|
|
|
|
public void sendSparkplugStateOnTelemetry(TransportProtos.SessionInfoProto sessionInfo, String deviceName, SparkplugConnectionState typeSate, long ts) { |
|
|
public void sendSparkplugStateOnTelemetry(TransportProtos.SessionInfoProto sessionInfo, String deviceName, SparkplugConnectionState typeSate, long ts) { |
|
|
TransportProtos.KeyValueProto.Builder keyValueProtoBuilder = TransportProtos.KeyValueProto.newBuilder(); |
|
|
TransportProtos.KeyValueProto.Builder keyValueProtoBuilder = TransportProtos.KeyValueProto.newBuilder(); |
|
|
keyValueProtoBuilder.setKey(STATE.name()); |
|
|
try { |
|
|
keyValueProtoBuilder.setType(TransportProtos.KeyValueType.STRING_V); |
|
|
keyValueProtoBuilder.setKey(messageName(STATE)); |
|
|
keyValueProtoBuilder.setStringV(typeSate.name()); |
|
|
keyValueProtoBuilder.setType(TransportProtos.KeyValueType.STRING_V); |
|
|
TransportProtos.PostTelemetryMsg postTelemetryMsg = postTelemetryMsgCreated(keyValueProtoBuilder.build(), ts); |
|
|
keyValueProtoBuilder.setStringV(typeSate.name()); |
|
|
|
|
|
} catch (ThingsboardException e) { |
|
|
|
|
|
e.printStackTrace(); |
|
|
|
|
|
} |
|
|
|
|
|
TransportProtos.PostTelemetryMsg postTelemetryMsg = postTelemetryMsgCreated(keyValueProtoBuilder.build(), ts); |
|
|
|
|
|
|
|
|
transportService.process(sessionInfo, postTelemetryMsg, getPubAckCallback(channel, deviceName, -1, postTelemetryMsg)); |
|
|
transportService.process(sessionInfo, postTelemetryMsg, getPubAckCallback(channel, deviceName, -1, postTelemetryMsg)); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|