短连接接入平台

默认情况下,使用tcp和mqtt方式接入时,当连接断开时,则认为设备已离线。 但是在某些场景(如:低功率设备)下,无法使用长连接进行通信,可以通过指定特定配置使平台保持设备在线状态。

说明

以下功能及API在jetlinks 1.4.0 后提供。

保持在线

在自定义协议包解码出消息时,可通过在消息中添加头keepOnline来进行设置。如:

  1. message.addHeader(Headers.keepOnline,true); //设置让会话强制在线
  2. message.addHeader(Headers.keepOnlineTimeoutSeconds,600);//设置超时时间(可选,默认10分钟),如果超过这个时间没有收到任何消息则认为离线。

提示

MQTT接入时添加到任意消息即可。TCP接入时添加到DeviceOnlineMessage即可。

如果服务重启,将不会保存在线状态!

缓存下发消息

在进行消息下发时,因为会话是强制保持在线的,所以消息会直接通过session下发,但是此时设备可能已经断开了连接, 将会抛出异常DeviceOperationException(ErrorCode.CLIENT_OFFLINE)。这时候可以通过将消息缓存起来,等待下次设备 连接上来后再下发指令。

一、在自定义协议包中使用消息拦截器拦截异常

  1. support.addMessageSenderInterceptor(new DeviceMessageSenderInterceptor() {
  2. @Override
  3. public <R extends DeviceMessage> Flux<R> afterSent(DeviceOperator device, DeviceMessage message, Flux<R> reply) {
  4. return reply.onErrorResume(DeviceOperationException.class, err -> {
  5. if (err.getCode() == ErrorCode.CLIENT_OFFLINE) {
  6. return device
  7. .setConfig("will-msg", message) //设置到配置中
  8. .thenReturn(((RepayableDeviceMessage<?>) message)
  9. .newReply()
  10. .code(ErrorCode.REQUEST_HANDLING.name())
  11. .message("设备处理中...")
  12. .success()
  13. )
  14. .map(r -> (R) r);
  15. }
  16. return Mono.error(err);
  17. });
  18. }
  19. });

二、获取缓存的消息

在收到设备指令后进行解码时,可以先获取是否有缓存到消息,然后发送到设备.

伪代码如下:

  1. @Override
  2. public Mono<? extends Message> decode(MessageDecodeContext context) {
  3. return context.getDevice()
  4. .getAndRemoveConfig("will-msg")
  5. .map(val -> val.as(DeviceMessage.class))
  6. .flatMap((msg) -> {
  7. return ((FromDeviceMessageContext) context)
  8. .getSession()
  9. .send(doEncode(msg)); //编码并发送给设备
  10. })
  11. .thenReturn(doDecode(context)); //解码收到的消息
  12. }

TIP

以上代码仅作为演示功能逻辑,请根据实际情况进行相应的处理.