增加websocket获取设备当前状态

This commit is contained in:
zhou-hao 2020-05-18 17:05:57 +08:00
parent 73647e888e
commit 22cfa9c48b
1 changed files with 57 additions and 0 deletions

View File

@ -0,0 +1,57 @@
package org.jetlinks.community.device.message;
import lombok.AllArgsConstructor;
import org.jetlinks.community.device.entity.DeviceInstanceEntity;
import org.jetlinks.community.device.service.LocalDeviceInstanceService;
import org.jetlinks.community.gateway.external.SubscribeRequest;
import org.jetlinks.community.gateway.external.SubscriptionProvider;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Flux;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@Component
@AllArgsConstructor
public class DeviceCurrentStateSubscriptionProvider implements SubscriptionProvider {
private final LocalDeviceInstanceService instanceService;
@Override
public String id() {
return "device-state-subscriber";
}
@Override
public String name() {
return "设备当前状态消息";
}
@Override
public String[] getTopicPattern() {
return new String[]{
"/device-current-state"
};
}
@Override
@SuppressWarnings("all")
public Flux<Map<String, Object>> subscribe(SubscribeRequest request) {
List<String> deviceId = request.get("deviceId")
.map(List.class::cast)
.orElseThrow(() -> new IllegalArgumentException("deviceId不能为空"));
return Flux
.fromIterable(deviceId)
.buffer(200)
.concatMap(buf -> {
return instanceService.createQuery()
.select(DeviceInstanceEntity::getId, DeviceInstanceEntity::getState)
.in(DeviceInstanceEntity::getId, buf)
.fetch();
})
.map(instance -> Collections.singletonMap(instance.getId(), instance.getState().name()));
}
}