Merge branch 'dev'

V0.5.x
xiwa 2022-06-09 10:13:34 +08:00
commit 78545e47bd
8 changed files with 138 additions and 33 deletions

View File

@ -88,7 +88,21 @@ public interface Constants {
ThirdPlatform(String desc) {
this.desc = desc;
}
}
/**
* openUid
*/
enum ThirdOpenUid{
duerosOpenUid("小度OpenUid"),
aligenieOpenUid("天猫精灵OpenUid"),
miiotOpenUid("小爱OpenUid");
public String desc;
ThirdOpenUid(String desc) {
this.desc = desc;
}
}
interface API_DEVICE {
@ -161,6 +175,11 @@ public interface Constants {
*
*/
String GET_DEVICE = "/device/{deviceId}";
/**
* openUid
*/
String SET_OPEN_UID = "/setOpenUid";
}
interface MQTT {

View File

@ -2,6 +2,7 @@ package cc.iotkit.manager.config;
import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.exception.NotRoleException;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@ -25,7 +26,7 @@ public class GlobalExceptionHandler {
return new RequestResult("401", "未授权的请求");
}
if (e instanceof NotPermissionException) {
if (e instanceof NotPermissionException || e instanceof NotRoleException) {
response.setStatus(403);
return new RequestResult("403", "没有权限");
}

View File

@ -36,6 +36,7 @@ public class SaTokenConfigure implements WebMvcConfigurer {
"/space/addDevice/**",
"/space/saveDevice",
"/space/removeDevice",
"/space/setOpenUid",
"/space/device/*",
"/device/*/consumer/*",
"/device/*/service/property/set",

View File

@ -2,7 +2,6 @@ package cc.iotkit.manager.controller;
import cc.iotkit.common.Constants;
import cc.iotkit.common.exception.BizException;
import cc.iotkit.common.utils.CodecUtil;
import cc.iotkit.common.utils.DeviceUtil;
import cc.iotkit.common.utils.UniqueIdUtil;
import cc.iotkit.comps.service.DeviceBehaviourService;
@ -31,7 +30,6 @@ import org.springframework.web.context.request.async.DeferredResult;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
@Slf4j
@RestController

View File

@ -102,12 +102,18 @@ public class SpaceDeviceController {
.build();
}
/**
*
*/
@GetMapping("/{userId}/devices")
public List<SpaceDeviceVo> getDevices(@PathVariable("userId") String userId) {
List<SpaceDevice> spaceDevices = spaceDeviceRepository.findAll(Example.of(SpaceDevice.builder().uid(userId).build()));
return spaceDevices.stream().map((this::parseSpaceDevice)).collect(Collectors.toList());
}
/**
*
*/
@GetMapping(Constants.API_SPACE.FIND_DEVICE)
List<FindDeviceVo> findDevice(String mac) {
if (StringUtils.isBlank(mac)) {
@ -155,6 +161,9 @@ public class SpaceDeviceController {
return findDeviceVo;
}
/**
*
*/
@PostMapping(Constants.API_SPACE.ADD_DEVICE)
public void addDevice(SpaceDevice device) {
String deviceId = device.getDeviceId();
@ -202,7 +211,7 @@ public class SpaceDeviceController {
subUid.add(uid);
}
//更新设备标签
//更新设备标签,标识设备是用的哪个第三方平台
List<String> platforms = optUser.get().getUsePlatforms();
Map<String, DeviceInfo.Tag> tags = deviceInfo.getTag();
for (String platform : platforms) {
@ -213,6 +222,9 @@ public class SpaceDeviceController {
deviceRepository.save(deviceInfo);
}
/**
*
*/
@DeleteMapping(Constants.API_SPACE.REMOVE_DEVICE)
public void removeDevice(String deviceId) {
String uid = AuthUtil.getUserId();
@ -225,7 +237,7 @@ public class SpaceDeviceController {
spaceDeviceRepository.deleteById(spaceDevice.getId());
DeviceInfo deviceInfo = deviceRepository.findByDeviceId(deviceId);
Optional<UserInfo> optUser = userInfoRepository.findById(uid);
if (!optUser.isPresent()) {
if (optUser.isEmpty()) {
throw new BizException("user does not exist");
}
@ -240,11 +252,14 @@ public class SpaceDeviceController {
deviceRepository.save(deviceInfo);
}
/**
*
*/
@PostMapping(Constants.API_SPACE.SAVE_DEVICE)
public void saveDevice(SpaceDevice spaceDevice) {
dataOwnerService.checkOwner(spaceDevice);
Optional<SpaceDevice> optData = spaceDeviceRepository.findById(spaceDevice.getId());
if (!optData.isPresent()) {
if (optData.isEmpty()) {
throw new BizException("space device does not exist");
}
SpaceDevice oldData = optData.get();
@ -253,6 +268,9 @@ public class SpaceDeviceController {
spaceDeviceRepository.save(oldData);
}
/**
*
*/
@GetMapping(Constants.API_SPACE.GET_DEVICE)
public SpaceDeviceVo getSpaceDevice(@PathVariable("deviceId") String deviceId) {
String uid = AuthUtil.getUserId();
@ -262,4 +280,28 @@ public class SpaceDeviceController {
spaceDeviceRepository.save(spaceDevice);
return parseSpaceDevice(spaceDevice);
}
/**
* openUid
* 使openUid
*/
@PostMapping(Constants.API_SPACE.SET_OPEN_UID)
public void setOpenUid(String deviceId, String platform, String openUid) {
SpaceDevice spaceDevice = spaceDeviceRepository.findByDeviceId(deviceId);
if (spaceDevice == null) {
throw new BizException("space device does not exist");
}
//只能修改自己的设备
dataOwnerService.checkOwner(spaceDevice);
//找到设备
DeviceInfo deviceInfo = deviceRepository.findByDeviceId(deviceId);
Map<String, DeviceInfo.Tag> tags = deviceInfo.getTag();
String openUidName = platform + "OpenUid";
//给设备添加对应平台openUid的设备标签
Constants.ThirdOpenUid thirdOpenUid = Constants.ThirdOpenUid.valueOf(openUidName);
tags.put(openUidName, new DeviceInfo.Tag(openUidName, thirdOpenUid.desc, openUid));
deviceRepository.save(deviceInfo);
}
}

View File

@ -1,10 +1,12 @@
package cc.iotkit.comps;
import cc.iotkit.common.Constants;
import io.vertx.core.MultiMap;
import io.vertx.core.Vertx;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.http.HttpMethod;
import io.vertx.ext.web.client.HttpRequest;
import io.vertx.ext.web.client.HttpResponse;
import io.vertx.ext.web.client.WebClient;
import io.vertx.ext.web.client.WebClientOptions;
import lombok.AllArgsConstructor;
@ -90,6 +92,19 @@ public class ApiTool {
return send(token, HttpMethod.POST, request, new HashMap<>());
}
/**
* openUid
*/
public ApiResponse setOpenUid(String token, String deviceId, String platform, String openUid) {
HttpRequest<Buffer> request = client
.post(port, host, getSpacePath(Constants.API_SPACE.SET_OPEN_UID));
Map<String, Object> map = new HashMap<>();
map.put("deviceId", deviceId);
map.put("platform", platform);
map.put("openUid", openUid);
return send(token, HttpMethod.POST, request, map, false);
}
/**
*
*/
@ -121,7 +136,17 @@ public class ApiTool {
return send(token, HttpMethod.POST, request, params);
}
private ApiResponse send(String token, HttpMethod method, HttpRequest<Buffer> request, Map<String, Object> params) {
private ApiResponse send(String token, HttpMethod method,
HttpRequest<Buffer> request,
Map<String, Object> params) {
return send(token, method, request, params, true);
}
private ApiResponse send(String token, HttpMethod method,
HttpRequest<Buffer> request,
Map<String, Object> params,
boolean isJson
) {
request = request
.timeout(timeout)
.putHeader("wrap-response", "json")
@ -133,29 +158,23 @@ public class ApiTool {
//转为同步模式便于提供给js调用
CountDownLatch wait = new CountDownLatch(1);
if (method == HttpMethod.POST) {
if (method == HttpMethod.POST && isJson) {
request.sendJson(params)
.onSuccess((response) -> {
log.info("send succeed,response:{}", response.bodyAsString());
apiResponse.set(response.bodyAsJson(ApiResponse.class));
wait.countDown();
})
.onFailure((err) -> {
log.error("send failed", err);
wait.countDown();
});
} else if (method == HttpMethod.GET) {
.onSuccess((response) -> onSendSuccess(apiResponse, wait, response))
.onFailure((err) -> onSendFail(wait, err));
} else if (method == HttpMethod.POST) {
//添加表单参数
MultiMap multiMap = MultiMap.caseInsensitiveMultiMap();
params.forEach((k, v) -> multiMap.add(k, v.toString()));
request.sendForm(multiMap)
.onSuccess((response) -> onSendSuccess(apiResponse, wait, response))
.onFailure((err) -> onSendFail(wait, err));
} else {
request.send()
.onSuccess((response) -> {
log.info("send succeed,response:{}", response.bodyAsString());
apiResponse.set(response.bodyAsJson(ApiResponse.class));
wait.countDown();
})
.onFailure((err) -> {
log.error("send failed", err);
wait.countDown();
});
.onSuccess((response) -> onSendSuccess(apiResponse, wait, response))
.onFailure((err) -> onSendFail(wait, err));
}
if (wait.await(timeout, TimeUnit.MILLISECONDS)) {
return apiResponse.get();
} else {
@ -170,6 +189,17 @@ public class ApiTool {
return apiResponse.get();
}
private void onSendFail(CountDownLatch wait, Throwable err) {
log.error("send failed", err);
wait.countDown();
}
private void onSendSuccess(AtomicReference<ApiResponse> apiResponse, CountDownLatch wait, HttpResponse<Buffer> response) {
log.info("send succeed,response:{}", response.bodyAsString());
apiResponse.set(response.bodyAsJson(ApiResponse.class));
wait.countDown();
}
public void log(String msg) {
log.info(msg);
}

View File

@ -1,6 +1,8 @@
package cc.iotkit.ruleengine.action;
import cc.iotkit.common.utils.JsonUtil;
import cc.iotkit.dao.DeviceCache;
import cc.iotkit.model.device.DeviceInfo;
import cc.iotkit.model.device.message.ThingModelMessage;
import jdk.nashorn.api.scripting.NashornScriptEngine;
import jdk.nashorn.api.scripting.ScriptObjectMirror;
@ -21,13 +23,24 @@ public class ScriptService {
private ScriptObjectMirror scriptObject;
private DeviceCache deviceCache;
public Map execScript(ThingModelMessage msg) {
try {
if (scriptObject == null) {
scriptObject = (ScriptObjectMirror) engine.eval("new (function(){" + script + "})()");
}
//取设备信息
DeviceInfo deviceInfo = deviceCache.get(msg.getDeviceId());
//执行转换脚本
ScriptObjectMirror result = (ScriptObjectMirror) engine.invokeMethod(scriptObject, "translate", msg);
ScriptObjectMirror result = (ScriptObjectMirror) engine
.invokeMethod(scriptObject, "translate", msg, deviceInfo);
if (result == null) {
return null;
}
Object objResult = JsonUtil.toObject(result);
if (!(objResult instanceof Map)) {
return null;

View File

@ -5,10 +5,7 @@ import cc.iotkit.dao.DeviceCache;
import cc.iotkit.dao.RuleInfoRepository;
import cc.iotkit.model.rule.RuleAction;
import cc.iotkit.model.rule.RuleInfo;
import cc.iotkit.ruleengine.action.Action;
import cc.iotkit.ruleengine.action.DeviceAction;
import cc.iotkit.ruleengine.action.DeviceActionService;
import cc.iotkit.ruleengine.action.HttpAction;
import cc.iotkit.ruleengine.action.*;
import cc.iotkit.ruleengine.config.RuleConfiguration;
import cc.iotkit.ruleengine.filter.DeviceFilter;
import cc.iotkit.ruleengine.filter.Filter;
@ -132,7 +129,11 @@ public class RuleManager {
action.setDeviceActionService(deviceActionService);
return action;
} else if (HttpAction.TYPE.equals(type)) {
return parse(config, HttpAction.class);
HttpAction httpAction = parse(config, HttpAction.class);
for (HttpService service : httpAction.getServices()) {
service.setDeviceCache(deviceCache);
}
return httpAction;
}
return null;
}