feat():车辆网关:fluxmq通过rabbitmq发送vin

dev.cargateway
yuan 2024-10-08 00:01:57 +08:00
parent 43c74b9978
commit 9185f33c0c
20 changed files with 580 additions and 26 deletions

View File

View File

@ -0,0 +1,50 @@
package com.muyu.car;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
public class MqttPublishSample {
public static void main(String[] args) {
String topic = "vehicle";
String content = "Message from MqttPublishSample";
int qos = 2;
String broker = "tcp://120.55.62.0:1883";
String clientId = "JavaSample";
try {
// 第三个参数为空,默认持久化策略
MqttClient sampleClient = new MqttClient(broker, clientId);
MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setCleanSession(true);
System.out.println("Connecting to broker: "+broker);
sampleClient.connect(connOpts);
sampleClient.subscribe(topic,0);
sampleClient.setCallback(new MqttCallback() {
// 连接丢失
@Override
public void connectionLost(Throwable throwable) {
}
// 连接成功
@Override
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
System.out.println(new String(mqttMessage.getPayload()));
}
// 接收信息
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
}
});
} catch(MqttException me) {
System.out.println("reason "+me.getReasonCode());
System.out.println("msg "+me.getMessage());
System.out.println("loc "+me.getLocalizedMessage());
System.out.println("cause "+me.getCause());
System.out.println("excep "+me);
me.printStackTrace();
}
}
}

View File

@ -1,5 +1,6 @@
package com.muyu.car.domain.api.req; package com.muyu.car.domain.api.req;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@ -31,7 +32,8 @@ public class VehicleConnectionReq {
/** /**
* vin * vin
*/ */
private String vin; @JSONField(name = "vehicleVin")
private String vehicleVin;
/** /**
* *
*/ */
@ -39,10 +41,15 @@ public class VehicleConnectionReq {
/** /**
* *
*/ */
private String userName; @JSONField(name = "username")
private String username;
/** /**
* *
*/ */
private String nonce; private String nonce;
/**
*
*/
private String password;
} }

View File

@ -0,0 +1,30 @@
package com.muyu.car.domain.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author
* @Packagecom.muyu.car.domain.model
* @Projectcloud-server-8
* @nameMqttServerModel
* @Date2024/10/7 6:40
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MqttServerModel {
/**
* MQTT
*/
private String broker;
/**
* MQTT
*/
private String topic;
}

View File

@ -0,0 +1,86 @@
package com.muyu.car.domain.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author
* @Packagecom.muyu.car.domain.model
* @Projectcloud-server-8
* @nameVehicle
* @Date2024/10/6 10:33
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class VehicleInformation {
/**
* ID
*/
private String carInformationId ;
/**
* VIN
*/
private String carInformationVIN ;
/**
*
*/
private String carInformationLicensePlate ;
/**
*
*/
private String carInformationBrand ;
/**
*
*/
private String carInformationColor ;
/**
*
*/
private String carInformationDriver ;
/**
*
*/
private String carInformationExamineEnddata ;
/**
*
*/
private String carInformationMotorManufacturer ;
/**
*
*/
private String carInformationMotorModel ;
/**
*
*/
private String carInformationBatteryManufacturer ;
/**
*
*/
private String carInformationBatteryModel ;
/**
* ID
*/
private String carInformationFence ;
/**
* ID
*/
private String carInformationType ;
/**
* (0 1 )
*/
private String carInformationFocus ;
/**
* id
*/
private String carStrategyId ;
/**
* (1.线 2.线 3. 4. 5.)
*/
private String carInformationState ;
}

View File

@ -0,0 +1,51 @@
package com.muyu.car.domain.model.properties;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author
* @Packagecom.muyu.car.domain.model.properties
* @Projectcloud-server-8
* @nameMqttProperties
* @Date2024/10/6 8:24
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MqttProperties {
/**
*
*/
private String broker;
/**
*
*/
private String topic;
/**
*
*/
private String username;
/**
*
*/
private String password;
/**
* ID
*/
private String clientId;
/**
*
*/
private int qos = 0;
}

View File

@ -0,0 +1,39 @@
package com.muyu.car.domain.model.properties;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @Author
* @Packagecom.muyu.car.domain.model.properties
* @Projectcloud-server-8
* @nameMqttServerModel
* @Date2024/10/6 8:25
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MqttServerModel {
private static final Logger log = LoggerFactory.getLogger(MqttServerModel.class);
/**
* MQTT
*/
private String broker;
/**
* MQTT
*/
private String topic;
public String getBroker () {
log.info("broker: {}", broker);
return broker.contains("tcp://") ? broker : "tcp://" + broker + ":1883";
}
}

View File

@ -1,21 +0,0 @@
package com.muyu.car.gateway.controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
*
* @Author
* @Packagecom.muyu.car.gateway.controller
* @Projectcloud-server-8
* @nameVehicleInformation
* @Date2024/10/4 9:40
*/
@RestController
@RequestMapping("/vehicle")
public class VehicleInformation {
// @PostMapping("/")
}

View File

@ -0,0 +1,35 @@
package com.muyu.car.gateway.controller;
import com.muyu.car.domain.api.req.VehicleConnectionReq;
import com.muyu.car.domain.model.MqttServerModel;
import com.muyu.car.domain.model.VehicleInformation;
import com.muyu.car.gateway.service.VehicleInformationService;
import com.muyu.common.core.domain.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
*
* @Author
* @Packagecom.muyu.car.gateway.controller
* @Projectcloud-server-8
* @nameVehicleInformationController
* @Date2024/10/6 2:39
*/
@RestController
@RequestMapping("/verify")
public class VehicleInformationController {
@Autowired
private VehicleInformationService vehicleInformationService;
@PostMapping("/vehicleConnection")
public Result<MqttServerModel> getVehicleData(
@Validated @RequestBody VehicleConnectionReq vehicleConnectionReq
) {
return Result.success(vehicleInformationService.getVehicleData(vehicleConnectionReq));
}
}

View File

@ -0,0 +1,25 @@
package com.muyu.car.gateway.controller;
import com.muyu.car.domain.model.VehicleInformation;
import com.muyu.car.gateway.service.VehicleInstanceService;
import com.muyu.common.core.domain.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
*
* @Author
* @Packagecom.muyu.car.gateway.controller
* @Projectcloud-server-8
* @nameVehicleInformation
* @Date2024/10/4 9:40
*/
@RestController
@RequestMapping("/vehicle")
public class VehicleInstanceController {
@Autowired private VehicleInstanceService vehicleInstanceService;
}

View File

@ -0,0 +1,53 @@
package com.muyu.car.gateway.mq;
import lombok.extern.log4j.Log4j2;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
/**
* @Author
* @Packagecom.muyu.car.gateway.mq
* @Projectcloud-server-8
* @nameCreateExchange
* @Date2024/10/7 8:53
*/
@Log4j2
@Component
public class CreateExchange implements ApplicationRunner {
@Autowired
private ConnectionFactory connectionFactory;
@Override
public void run(ApplicationArguments args) {
log.info("=====>开始创建交换机");
try {
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
// 创建Fanout类型的交换机
FanoutExchange exchange = new FanoutExchange("ONLINE_EXCHANGE", true, false);
rabbitAdmin.declareExchange(exchange);
// 创建队列
Queue queue = new Queue("GO_ONLINE", true, false, false);
rabbitAdmin.declareQueue(queue);
// Fanout交换机绑定
rabbitAdmin.declareBinding(BindingBuilder.bind(queue).to(exchange));
log.info("=====>交换机创建成功");
log.info("=====>队列创建成功并绑定到交换机");
}catch (Exception e) {
log.info(e.getMessage());
}
}
}

View File

@ -0,0 +1,17 @@
package com.muyu.car.gateway.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.muyu.car.domain.api.req.VehicleConnectionReq;
import com.muyu.car.domain.model.MqttServerModel;
import com.muyu.car.domain.model.VehicleInformation;
/**
* @Author
* @Packagecom.muyu.car.gateway.service
* @Projectcloud-server-8
* @nameVehicleInformationService
* @Date2024/10/6 2:40
*/
public interface VehicleInformationService{
MqttServerModel getVehicleData(VehicleConnectionReq vehicleConnectionReq);
}

View File

@ -0,0 +1,13 @@
package com.muyu.car.gateway.service;
import com.muyu.car.domain.model.VehicleInformation;
/**
* @Author
* @Packagecom.muyu.car.gateway.service
* @Projectcloud-server-8
* @nameVehicleInstanceService
* @Date2024/10/6 10:05
*/
public interface VehicleInstanceService {
}

View File

@ -0,0 +1,44 @@
package com.muyu.car.gateway.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.muyu.car.domain.api.req.VehicleConnectionReq;
import com.muyu.car.domain.model.MqttServerModel;
import com.muyu.car.domain.model.VehicleInformation;
import com.muyu.car.gateway.service.VehicleInformationService;
import com.muyu.car.mapper.VehicleInformationMapper;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @Author
* @Packagecom.muyu.car.gateway.service.impl
* @Projectcloud-server-8
* @nameVehicleInformationServiceImpl
* @Date2024/10/6 2:41
*/
@Log4j2
@Service
public class VehicleInformationServiceImpl implements VehicleInformationService{
@Autowired private VehicleInformationMapper vehicleInformationMapper;
@Override
public MqttServerModel getVehicleData(VehicleConnectionReq vehicleConnectionReq) {
log.info("车辆连接请求:[{}]",vehicleConnectionReq);
vehicleConnectionReq.setPassword(vehicleConnectionReq.getVehicleVin()+vehicleConnectionReq.getTimestamp()+vehicleConnectionReq.getNonce());
List<String> selectVehicle =vehicleInformationMapper.selectVehicleVin(vehicleConnectionReq.getVehicleVin());
if(selectVehicle.isEmpty()) {
vehicleInformationMapper.addVehicleConnection(vehicleConnectionReq);
log.info("车辆预上线成功");
}else {
log.info("车辆无法重复预上线");
}
return new MqttServerModel("tcp://121.199.172.3:1883","vehicle");
}
}

View File

@ -0,0 +1,18 @@
package com.muyu.car.gateway.service.impl;
import com.muyu.car.domain.model.VehicleInformation;
import com.muyu.car.gateway.service.VehicleInstanceService;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Service;
/**
* @Author
* @Packagecom.muyu.car.gateway.service.impl
* @Projectcloud-server-8
* @nameVehicleInstanceServceImpl
* @Date2024/10/6 10:06
*/
@Log4j2
@Service
public class VehicleInstanceServiceImpl implements VehicleInstanceService {
}

View File

@ -45,7 +45,7 @@ public class GenerateInstance implements ApplicationRunner {
// 设置地域ID // 设置地域ID
.setRegionId("cn-hangzhou") .setRegionId("cn-hangzhou")
// 设置镜像ID // 设置镜像ID
.setImageId("m-bp10rcc4nsihqfoz0w7s") .setImageId("m-bp1hkxfctk751s62jqhq")
// 设置实例类型 // 设置实例类型
.setInstanceType("ecs.t6-c1m1.large") .setInstanceType("ecs.t6-c1m1.large")
// 设置安全组ID // 设置安全组ID
@ -65,7 +65,7 @@ public class GenerateInstance implements ApplicationRunner {
// 设置实例密码 // 设置实例密码
.setPassword("EightGroup123.") .setPassword("EightGroup123.")
// 设置创建实例的数量 // 设置创建实例的数量
.setAmount(2); .setAmount(1);
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions(); com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try { try {

View File

@ -28,7 +28,6 @@ public class QueryInstance {
.setInstanceIds(JSON.toJSONString(instanceIds)) .setInstanceIds(JSON.toJSONString(instanceIds))
.setRegionId("cn-hangzhou"); .setRegionId("cn-hangzhou");
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions(); com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try { try {

View File

@ -0,0 +1,21 @@
package com.muyu.car.mapper;
import com.muyu.car.domain.api.req.VehicleConnectionReq;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @Author
* @Packagecom.muyu.car.mapper
* @Projectcloud-server-8
* @nameVehicleInformationMapper
* @Date2024/10/6 2:19
*/
@Mapper
public interface VehicleInformationMapper {
void addVehicleConnection(VehicleConnectionReq vehicleConnectionReq);
List<String> selectVehicleVin(@Param("vehicleVin") String vehicleVin);
}

View File

@ -0,0 +1,71 @@
package com.muyu.car.util;
import lombok.extern.log4j.Log4j2;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.SecureRandom;
@Log4j2
public class MD5Util {
private static final Integer SALT_LENGTH = 12;
/**
* byte16
* @param b
* @return
*/
public static String byteToHexString(byte[] b) {
StringBuilder hexString = new StringBuilder();
for (byte value : b) {
String hex = Integer.toHexString(value & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
hexString.append(hex.toUpperCase());
}
return hexString.toString();
}
/**
*
* @param str
* @return
*/
public static String encrypted (String str) {
try {
// 声明加密后的口令数组变量
byte[] pwd = null;
// 随机数生成器
SecureRandom random = new SecureRandom();
// 声明盐数组变量
byte[] salt = new byte[SALT_LENGTH];
// 将随机数放入盐变量中
random.nextBytes(salt);
// 声明消息摘要对象
MessageDigest md = null;
// 创建消息摘要
md = MessageDigest.getInstance("MD5");
// 将盐数据传入消息摘要对象
md.update(salt);
// 将口令的数据传给消息摘要对象
md.update(str.getBytes(StandardCharsets.UTF_8));
// 获得消息摘要的字节数组
byte[] digest = md.digest();
// 因为要在口令的字节数组中存放盐,所以加上盐的字节长度
pwd = new byte[digest.length + SALT_LENGTH];
// 将盐的字节拷贝到生成的加密口令字节数组的前12个字节以便在验证口令时取出盐
System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH);
// 将消息摘要拷贝到加密口令字节数组从第13个字节开始的字节
System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length);
// 将字节数组格式加密后的口令转化为16进制字符串格式的口令
return byteToHexString(pwd);
}catch (Exception exception){
log.info("md5加密失败[{}]", str, exception);
return str;
}
}
}

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.@//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.muyu.car.mapper.VehicleInformationMapper">
<insert id="addVehicleConnection">
INSERT INTO `vehicle_connection` (`vin`, `timestamp`, `username`, `nonce`,`password`) VALUES (#{vehicleVin}, #{timestamp}, #{username}, #{nonce},#{password});
</insert>
<select id="selectVehicleVin" resultType="java.lang.String">
select
`vin`, `timestamp`, `username`, `nonce`,`password`
from
`vehicle_connection`
where `vin` = #{vehicleVin}
</select>
</mapper>