diff --git a/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/resp/device/DeviceInitResp.java b/iot-common/iot-data/src/main/java/com/qiuguo/iot/data/resp/device/DeviceInitResp.java similarity index 70% rename from iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/resp/device/DeviceInitResp.java rename to iot-common/iot-data/src/main/java/com/qiuguo/iot/data/resp/device/DeviceInitResp.java index 04977f7..c152a1c 100644 --- a/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/resp/device/DeviceInitResp.java +++ b/iot-common/iot-data/src/main/java/com/qiuguo/iot/data/resp/device/DeviceInitResp.java @@ -1,4 +1,4 @@ -package com.qiuguo.iot.user.api.resp.device; +package com.qiuguo.iot.data.resp.device; import lombok.Data; diff --git a/iot-gateway/src/main/resources/bootstrap.yml b/iot-gateway/src/main/resources/bootstrap.yml index e0b0a0e..ec17f21 100644 --- a/iot-gateway/src/main/resources/bootstrap.yml +++ b/iot-gateway/src/main/resources/bootstrap.yml @@ -1,5 +1,5 @@ server: - port: 8081 + port: 8080 spring: application: name: qiuguo-iot-gateway diff --git a/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/controller/device/DeviceController.java b/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/controller/device/DeviceController.java index 2fa6196..a80ae51 100644 --- a/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/controller/device/DeviceController.java +++ b/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/controller/device/DeviceController.java @@ -1,7 +1,6 @@ package com.qiuguo.iot.user.api.controller.device; import cn.hutool.crypto.digest.MD5; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.qiuguo.iot.base.constans.RedisConstans; @@ -22,13 +21,12 @@ import com.qiuguo.iot.data.service.device.DeviceInfoService; import com.qiuguo.iot.data.service.device.DeviceUserBindService; import com.qiuguo.iot.data.service.device.DeviceUserTalkRecordService; import com.qiuguo.iot.third.service.TuyaDeviceConnector; -import com.qiuguo.iot.user.api.resp.device.DeviceInitResp; +import com.qiuguo.iot.data.resp.device.DeviceInitResp; import com.qiuguo.iot.user.api.rest.device.SetDeviceBindInfoRest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.data.redis.core.ReactiveValueOperations; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import reactor.core.publisher.Mono; import lombok.extern.slf4j.Slf4j; diff --git a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/controller/DeviceController.java b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/controller/DeviceController.java new file mode 100644 index 0000000..0615f60 --- /dev/null +++ b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/controller/DeviceController.java @@ -0,0 +1,142 @@ +package com.qiuguo.iot.box.websocket.api.controller; + +import cn.hutool.crypto.digest.MD5; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.qiuguo.iot.base.constans.RedisConstans; +import com.qiuguo.iot.base.enums.DeviceTypeEnum; +import com.qiuguo.iot.base.enums.OrderByEnum; +import com.qiuguo.iot.base.enums.YesNo; +import com.qiuguo.iot.base.utils.StringUtils; +import com.qiuguo.iot.data.entity.device.DeviceInfoEntity; +import com.qiuguo.iot.data.entity.device.DeviceUserBindEntity; +import com.qiuguo.iot.data.entity.device.DeviceUserTalkRecordEntity; +import com.qiuguo.iot.data.request.device.DeviceInfoRequest; +import com.qiuguo.iot.data.request.device.DeviceUserBindRequest; +import com.qiuguo.iot.data.request.device.DeviceUserTalkRecordRequest; +import com.qiuguo.iot.data.resp.device.DeviceInitResp; +import com.qiuguo.iot.data.resp.device.DeviceTalkRecordResp; +import com.qiuguo.iot.data.resp.device.DeviceUserBindResp; +import com.qiuguo.iot.data.service.device.DeviceBatchService; +import com.qiuguo.iot.data.service.device.DeviceInfoService; +import com.qiuguo.iot.data.service.device.DeviceUserBindService; +import com.qiuguo.iot.data.service.device.DeviceUserTalkRecordService; +import com.qiuguo.iot.third.service.TuyaDeviceConnector; +import lombok.extern.slf4j.Slf4j; +import org.hswebframework.web.api.crud.entity.PagerResult; +import org.hswebframework.web.exception.BusinessException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.ReactiveStringRedisTemplate; +import org.springframework.data.redis.core.ReactiveValueOperations; +import org.springframework.web.bind.annotation.*; +import reactor.core.publisher.Mono; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@RestController +@Slf4j +@RequestMapping("/device") +public class DeviceController { + @Value("${device.key}") + private String key; + @Value("${device.checkTimeout}") + private Boolean checkTimeout; + @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private DeviceBatchService deviceBatchService; + + @Resource + private TuyaDeviceConnector tuyaDeviceConnector; + + @Resource + private ReactiveStringRedisTemplate reactiveStringRedisTemplate; + + @Resource + private DeviceUserTalkRecordService deviceUserTalkRecordService; + + @Resource + private DeviceUserBindService deviceUserBindService; + + + @Value("${device.timeout}") + private Long timeOut;//2分钟 + @GetMapping("/init") + public Mono deviceInit(@RequestParam String wifiMac, @RequestParam String btMac, + @RequestParam Integer type, @RequestParam Long time, + @RequestParam String signature){ + //deviceInfoService. + Long now = System.currentTimeMillis(); + if(checkTimeout && now - time > timeOut){ + //超时 + log.info("请求过期"); + BusinessException ex = new BusinessException("请求已失效"); + return Mono.error(ex); + } + //设备类型是否匹配暂时不做限制 + DeviceTypeEnum entryTypeEnum = DeviceTypeEnum.getEnumWithCode(type); + if(entryTypeEnum == null){ + log.info("不支持的设备类型"); + BusinessException ex = new BusinessException("不支持的设备类型"); + return Mono.error(ex); + } + //验签 + String wifiMd5 = MD5.create().digestHex(wifiMac).toUpperCase(); + String btMd5 = MD5.create().digestHex(btMac).toUpperCase(); + String typeMd5 = MD5.create().digestHex(type.toString()).toUpperCase(); + String md5 = MD5.create().digestHex(wifiMd5 + btMd5 + typeMd5 + time + key).toUpperCase(); + if (!md5.equals(signature)) { + // + //验签失败 + log.info("验签失败"); + BusinessException ex = new BusinessException("验签失败"); + return Mono.error(ex); + } + + DeviceInfoRequest request = new DeviceInfoRequest(); + request.setWifiMac(wifiMac); + request.setBtMac(btMac); + Mono mono = deviceInfoService.selectDeviceInfoByRequest(request); + + return mono.defaultIfEmpty(new DeviceInfoEntity()).flatMap(entity -> { + Mono mono1 = null; + if(entity.getId() == null){ + entity.setWifiMac(wifiMac); + entity.setBtMac(btMac); + entity.setBatchId(1l); + entity.setName(entryTypeEnum.getName()); + entity.setDeviceType(type); + entity.setKey( StringUtils.getRandomStr(10));//生成key + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyMMddHHmmss"); + entity.setSn("QG" + entryTypeEnum.getSn() +df.format(LocalDateTime.now()) + StringUtils.getRandomStr(3)); + mono1 = deviceInfoService.insertDeviceInfo(entity); + }else{ + entity.setKey( StringUtils.getRandomStr(10));//重新生成Key + mono1 = deviceInfoService.updateDeviceInfoById(entity); + + + } + return mono1.map(m ->{ + return entity; + }); + }).map(o -> { + DeviceInfoEntity deviceInfoEntity = (DeviceInfoEntity)o; + ReactiveValueOperations operations = reactiveStringRedisTemplate.opsForValue(); + operations.set(RedisConstans.DEVICE_INFO + deviceInfoEntity.getSn() + , JSONObject.toJSONString(deviceInfoEntity) + , RedisConstans.ONE_HOUR).subscribe(); + DeviceInitResp resp = new DeviceInitResp(); + resp.setKey(deviceInfoEntity.getKey()); + resp.setSn(deviceInfoEntity.getSn()); + return resp; + }); + + + } +}