diff --git a/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/Aliyun/service/AliYunEcsService.java b/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/Aliyun/service/AliYunEcsService.java index 753c3e3..2f0fb62 100644 --- a/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/Aliyun/service/AliYunEcsService.java +++ b/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/Aliyun/service/AliYunEcsService.java @@ -51,6 +51,9 @@ public class AliYunEcsService { public List generateInstance(Integer amount) { redisService.deleteObject("instanceIds"); redisService.deleteObject("instanceList"); + redisService.deleteObject("ipList"); + redisService.deleteObject("count"); + redisService.deleteObject("vinIp"); // 检查生成实例的数量是否有效 if (amount == null || amount <= 0) { throw new ServiceException("生成数量不能小于1"); @@ -125,6 +128,7 @@ public class AliYunEcsService { // 创建运行时选项对象,用于配置请求的额外参数 RuntimeOptions runtimeOptions = new RuntimeOptions(); List aliInstances = new ArrayList<>(); + List stringArrayList = new ArrayList<>(); try { // 发送请求并获取响应对象 DescribeInstancesResponse describeInstancesResponse = client.describeInstancesWithOptions(request, runtimeOptions); @@ -140,12 +144,16 @@ public class AliYunEcsService { // ip地址 String ipAddress = bodyInstance.getPublicIpAddress().getIpAddress().get(0); log.info("实例ip为:{}", ipAddress); + stringArrayList.add(ipAddress); + // 实例状态 String status = bodyInstance.getStatus(); log.info("实例状态为:{}", status); AliInstance aliInstance = new AliInstance(instanceId, ipAddress, status); aliInstances.add(aliInstance); } + log.info("======================ipList:{}", stringArrayList); + redisService.setCacheList("ipList", stringArrayList); log.info("查询成功"); } catch (Exception e) { log.error("查询服务器实例错误:[{}]", e.getMessage(), e); diff --git a/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/controller/CarOneClickOperationController.java b/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/controller/CarOneClickOperationController.java index 8173dc7..54ffd3c 100644 --- a/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/controller/CarOneClickOperationController.java +++ b/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/controller/CarOneClickOperationController.java @@ -36,7 +36,7 @@ public class CarOneClickOperationController { @PostMapping("/receiveMsg/connect") public Result receiveMsg(@RequestBody VehicleConnectionReq vehicleConnectionReq){ log.info(">"+vehicleConnectionReq); - MqttServerModel mqttServerModel =carOneClickOperationService.getConnect(vehicleConnectionReq); - return Result.success(mqttServerModel); + return carOneClickOperationService.getConnect(vehicleConnectionReq); + } } diff --git a/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/domain/VinIp.java b/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/domain/VinIp.java index b6787f9..7d37381 100644 --- a/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/domain/VinIp.java +++ b/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/domain/VinIp.java @@ -19,9 +19,9 @@ public class VinIp { /** * 车辆的vin */ - String vehicleVin; + String vin; /** * 车辆的ip */ - String ipAddress; + String ip; } diff --git a/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/domain/model/MqttServerModel.java b/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/domain/model/MqttServerModel.java index 2f29353..17181d1 100644 --- a/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/domain/model/MqttServerModel.java +++ b/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/domain/model/MqttServerModel.java @@ -26,4 +26,6 @@ public class MqttServerModel { * MQTT订阅主题 */ private String topic; + + } diff --git a/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/mapper/CarOneClickOperationMapper.java b/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/mapper/CarOneClickOperationMapper.java index 3fc31fa..8ca2ce8 100644 --- a/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/mapper/CarOneClickOperationMapper.java +++ b/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/mapper/CarOneClickOperationMapper.java @@ -18,4 +18,7 @@ public interface CarOneClickOperationMapper { void addConnect(VehicleConnection vehicleConnection); List selectByVehicleVin(String vehicleVin); + + List selectVin(); + } diff --git a/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/service/CarOneClickOperationService.java b/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/service/CarOneClickOperationService.java index 71c639f..e2deaa9 100644 --- a/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/service/CarOneClickOperationService.java +++ b/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/service/CarOneClickOperationService.java @@ -2,6 +2,7 @@ package com.muyu.cargateway.service; import com.muyu.cargateway.domain.model.MqttServerModel; import com.muyu.cargateway.domain.req.VehicleConnectionReq; +import com.muyu.common.core.domain.Result; /** * @ Tool:IntelliJ IDEA @@ -18,5 +19,5 @@ public interface CarOneClickOperationService { * @param vehicleConnectionReq 车辆连接请求参数 * @return */ - MqttServerModel getConnect(VehicleConnectionReq vehicleConnectionReq); + Result getConnect(VehicleConnectionReq vehicleConnectionReq); } diff --git a/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/service/Impl/CarOneClickOperationServiceImpl.java b/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/service/Impl/CarOneClickOperationServiceImpl.java index 5792030..a24f1cf 100644 --- a/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/service/Impl/CarOneClickOperationServiceImpl.java +++ b/cloud-modules/cloud-modules-car-gateway/src/main/java/com/muyu/cargateway/service/Impl/CarOneClickOperationServiceImpl.java @@ -6,14 +6,15 @@ import com.muyu.cargateway.domain.model.MqttServerModel; import com.muyu.cargateway.domain.req.VehicleConnectionReq; import com.muyu.cargateway.mapper.CarOneClickOperationMapper; import com.muyu.cargateway.service.CarOneClickOperationService; +import com.muyu.common.core.domain.Result; import com.muyu.common.redis.service.RedisService; import lombok.extern.log4j.Log4j2; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.HashOperations; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; -import java.util.List; - /** * @ Tool:IntelliJ IDEA * @ Author:CHX @@ -28,11 +29,12 @@ public class CarOneClickOperationServiceImpl implements CarOneClickOperationServ @Autowired private CarOneClickOperationMapper carOneClickOperationMapper; - @Autowired private RabbitTemplate rabbitTemplate; @Autowired private RedisService redisService; + @Autowired + private StringRedisTemplate redisTemplate; /** * 获取连接信息 @@ -40,7 +42,7 @@ public class CarOneClickOperationServiceImpl implements CarOneClickOperationServ * @return */ @Override - public MqttServerModel getConnect(VehicleConnectionReq vehicleConnectionReq) { + public Result getConnect(VehicleConnectionReq vehicleConnectionReq) { log.info("车辆连接请求:{}",vehicleConnectionReq.toString()); // 使用交换机发送消息 @@ -55,24 +57,54 @@ public class CarOneClickOperationServiceImpl implements CarOneClickOperationServ vehicleConnection.setUsername(vehicleConnectionReq.getUsername()); //密码(vin+时间戳+随机数) vehicleConnection.setPassword(vehicleConnectionReq.getVehicleVin()+vehicleConnectionReq.getTimestamp()+vehicleConnectionReq.getNonce()); - //查询车辆vin集合 - List vehicleConnections =carOneClickOperationMapper.selectByVehicleVin(vehicleConnectionReq.getVehicleVin()); - if(vehicleConnections.isEmpty()){ - //添加 - carOneClickOperationMapper.addConnect(vehicleConnection); + //添加连接信息 + carOneClickOperationMapper.addConnect(vehicleConnection); + //先判断vin码 + HashOperations hashOps = redisTemplate.opsForHash(); + String vinIp = hashOps.get("vinIp", vehicleConnectionReq.getVehicleVin()); + if(vinIp!=null){ + log.info("车辆绑定ip失败,已经存在"); + throw new RuntimeException("车辆绑定ip失败,已经存在"); } - log.info("该车辆已存在,不能重复预上线"); - //TODO 返回连接信息 做轮询操作 + //判断redis有没有count键 + if(redisTemplate.hasKey("count")){ + //取出count + Integer count = Integer.valueOf(redisTemplate.opsForValue().get("count")); + if(count == 1){ + redisTemplate.opsForValue().set("count",String.valueOf(0)); + }else { + redisTemplate.opsForValue().set("count",String.valueOf(count+1)); + } + //根据游标count获取服务IP +// String ip = redisTemplate.opsForList().index("ipList", count); + Object ipList = redisService.redisTemplate.opsForList().index("ipList", count); - return new MqttServerModel("tcp://"+"106.15.136.7"+":1883","vehicle"); + log.info("=========================ipList:"+ipList); + //关联车辆和服务 + this.addIpAddress(new VinIp(vehicleConnectionReq.getVehicleVin(),ipList.toString())); + //响应信息 + log.info("车辆:{}",vehicleConnectionReq.getVehicleVin()+"绑定成功:{}",ipList); + return Result.success(new MqttServerModel("tcp://"+ipList+":1883","vehicle")); + }else { + redisTemplate.opsForValue().set("count",String.valueOf(0)); + //根据游标count获取服务器Ip + Object ipList = redisService.redisTemplate.opsForList().index("ipList", 0); + //关联车辆和服务 + this.addIpAddress(new VinIp(vehicleConnectionReq.getVehicleVin(),ipList.toString())); + //响应信息 + log.info("车辆:{}",vehicleConnectionReq.getVehicleVin(),"与:{}绑定成功",ipList); + return Result.success(new MqttServerModel("tcp://"+ipList+":1883","vehicle")); + } } /** * 添加车辆绑定IP地址存入redis中 */ - public void addIpAddress(VinIp vinIp){ - redisService.setCacheObject("vehicle_ip_address:"+vinIp.getVehicleVin(),vinIp.getIpAddress()); + public void addIpAddress(VinIp vinIp) { + if (vinIp == null || vinIp.getVin() == null || vinIp.getVin().isEmpty() || vinIp.getIp() == null || vinIp.getIp().isEmpty()) { + throw new IllegalArgumentException("vin 或 ip 不能为空或无效"); + } + redisTemplate.opsForHash().put("vinIp", vinIp.getVin(), vinIp.getIp()); } - } diff --git a/cloud-modules/cloud-modules-car-gateway/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-car-gateway/src/main/resources/bootstrap.yml index e33efb2..c11a18d 100644 --- a/cloud-modules/cloud-modules-car-gateway/src/main/resources/bootstrap.yml +++ b/cloud-modules/cloud-modules-car-gateway/src/main/resources/bootstrap.yml @@ -82,4 +82,4 @@ aliyun: instance-type: ecs.t6-c1m1.large security-group-id: sg-uf642d5u4ja5gsiitx8y switch-id: vsw-uf66lifrkhxqc94xi06v3 - amount: 1 + amount: 2 diff --git a/cloud-modules/cloud-modules-car-gateway/src/main/resources/mapper/CarOneClickOperationMapper.xml b/cloud-modules/cloud-modules-car-gateway/src/main/resources/mapper/CarOneClickOperationMapper.xml index 814cfa2..2f06cdf 100644 --- a/cloud-modules/cloud-modules-car-gateway/src/main/resources/mapper/CarOneClickOperationMapper.xml +++ b/cloud-modules/cloud-modules-car-gateway/src/main/resources/mapper/CarOneClickOperationMapper.xml @@ -14,6 +14,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" +