package com.muyu.vehicle; import com.muyu.common.ThreadPool; import com.muyu.domain.Vehicle; import com.muyu.vehicle.model.VehicleData; import com.muyu.vehicle.model.properties.MqttProperties; import com.muyu.vehicle.thread.VehicleThread; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.log4j.Log4j2; import org.eclipse.paho.client.mqttv3.MqttClient; import org.eclipse.paho.client.mqttv3.MqttConnectOptions; import org.eclipse.paho.client.mqttv3.MqttException; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; import java.util.Objects; import java.util.concurrent.ScheduledFuture; import static java.lang.Thread.sleep; /** * @author DongZeLiang * @version 1.0 * @description 车辆实例 * @date 2023/11/16 */ @Data @Log4j2 @Builder @AllArgsConstructor public class VehicleInstance { /** * 车辆 */ private Vehicle vehicle; /** * 实例数据 */ private VehicleData vehicleData; /** * 车辆工作线程 */ private VehicleThread vehicleThread; /** * 线程提交回调 */ private ScheduledFuture scheduledFuture; /** * 链接上报 */ private MqttClient client = null; /** * Mqtt配置 */ private MqttProperties mqttProperties; public VehicleInstance(MqttProperties mqttProperties) { this.mqttProperties = mqttProperties; } /*** * 获取当前车辆VIN * @return VIN */ public String getVin(){ return this.vehicle.getVin(); } public void sendMsg(String msg){ // 创建消息并设置 QoS MqttMessage message = new MqttMessage(msg.getBytes()); message.setQos(this.mqttProperties.getQos()); // 发布消息 try { client.publish(this.mqttProperties.getTopic(), message); } catch (MqttException e) { throw new RuntimeException(e); } } public void initCline(){ try { client = new MqttClient(mqttProperties.getBroker(), mqttProperties.getClientId(), new MemoryPersistence()); // 连接参数 MqttConnectOptions options = new MqttConnectOptions(); // 设置用户名和密码 if (Objects.nonNull(mqttProperties.getUsername()) && Objects.nonNull(mqttProperties.getPassword())) { options.setUserName(mqttProperties.getUsername()); options.setPassword(mqttProperties.getPassword().toCharArray()); } options.setConnectionTimeout(60); options.setKeepAliveInterval(60); // 连接 client.connect(options); log.info("mqtt初始化成功"); } catch (MqttException e) { log.error("mqtt链接服务器异常:{}", e.getMessage(), e); throw new RuntimeException(e); } } /** * 初始化线程 */ public void initVehicleThread(){ VehicleThread vehicleThread = new VehicleThread(); vehicleThread.setVehicleInstance(this); this.setVehicleThread(vehicleThread); this.vehicleThread.pause(); ScheduledFuture scheduledFuture = ThreadPool.submit(vehicleThread); this.setScheduledFuture(scheduledFuture); log.info("初始化车辆上报模拟线程开始:[{}]", this.getVin()); } /** * 开始上报线程 */ public void startSend(){ this.vehicleThread.resume(); } /** * 暂停上报线程 */ public void pauseSend(){ this.vehicleThread.pause(); } /** * 结束发送 */ public void stopSend(){ this.vehicleThread.stop(); } /** * 取消执行 */ public void cancelExecution(){ scheduledFuture.cancel(true); this.vehicleThread = null; this.scheduledFuture = null; } }