gaoguangchao
4 months ago
8 changed files with 852 additions and 0 deletions
@ -0,0 +1,236 @@ |
|||||
|
package com.zc.business.domain; |
||||
|
|
||||
|
import com.fasterxml.jackson.annotation.JsonFormat; |
||||
|
import com.ruoyi.common.annotation.Excel; |
||||
|
import com.ruoyi.common.utils.DateUtils; |
||||
|
import com.zc.business.enums.UniversalEnum; |
||||
|
import org.springframework.format.annotation.DateTimeFormat; |
||||
|
|
||||
|
import java.io.Serializable; |
||||
|
import java.time.LocalDateTime; |
||||
|
import java.util.Arrays; |
||||
|
import java.util.Date; |
||||
|
|
||||
|
public class OnlineLog implements Serializable { |
||||
|
private static final long serialVersionUID = 1L; |
||||
|
private long id; |
||||
|
private Long deviceId; |
||||
|
private String deviceIp; |
||||
|
private String deviceName; |
||||
|
private String stakeMark; |
||||
|
private String deviceStatus; |
||||
|
private String networkQuality;//网络质量
|
||||
|
private int sendCount;//发送数
|
||||
|
private int receiveCount;//返回数
|
||||
|
private int lossCount;//丢包数
|
||||
|
private String lossRate;//丢包率
|
||||
|
private double rttAvg;//平均往返时延
|
||||
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
||||
|
private LocalDateTime monitorTime; |
||||
|
|
||||
|
public long getId() { |
||||
|
return id; |
||||
|
} |
||||
|
|
||||
|
public void setId(long id) { |
||||
|
this.id = id; |
||||
|
} |
||||
|
|
||||
|
public Long getDeviceId() { |
||||
|
return deviceId; |
||||
|
} |
||||
|
|
||||
|
public void setDeviceId(Long deviceId) { |
||||
|
this.deviceId = deviceId; |
||||
|
} |
||||
|
|
||||
|
public String getDeviceIp() { |
||||
|
return deviceIp; |
||||
|
} |
||||
|
|
||||
|
public void setDeviceIp(String deviceIp) { |
||||
|
this.deviceIp = deviceIp; |
||||
|
} |
||||
|
|
||||
|
public String getDeviceName() { |
||||
|
return deviceName; |
||||
|
} |
||||
|
|
||||
|
public void setDeviceName(String deviceName) { |
||||
|
this.deviceName = deviceName; |
||||
|
} |
||||
|
|
||||
|
public String getStakeMark() { |
||||
|
return stakeMark; |
||||
|
} |
||||
|
|
||||
|
public void setStakeMark(String stakeMark) { |
||||
|
this.stakeMark = stakeMark; |
||||
|
} |
||||
|
|
||||
|
public String getDeviceStatus() { |
||||
|
return deviceStatus; |
||||
|
} |
||||
|
|
||||
|
public void setDeviceStatus(String deviceStatus) { |
||||
|
this.deviceStatus = deviceStatus; |
||||
|
} |
||||
|
|
||||
|
public String getNetworkQuality() { |
||||
|
return networkQuality; |
||||
|
} |
||||
|
|
||||
|
public void setNetworkQuality(String networkQuality) { |
||||
|
this.networkQuality = networkQuality; |
||||
|
} |
||||
|
|
||||
|
public int getSendCount() { |
||||
|
return sendCount; |
||||
|
} |
||||
|
|
||||
|
public void setSendCount(int sendCount) { |
||||
|
this.sendCount = sendCount; |
||||
|
} |
||||
|
|
||||
|
public int getReceiveCount() { |
||||
|
return receiveCount; |
||||
|
} |
||||
|
|
||||
|
public void setReceiveCount(int receiveCount) { |
||||
|
this.receiveCount = receiveCount; |
||||
|
} |
||||
|
|
||||
|
public int getLossCount() { |
||||
|
return lossCount; |
||||
|
} |
||||
|
|
||||
|
public void setLossCount(int lossCount) { |
||||
|
this.lossCount = lossCount; |
||||
|
} |
||||
|
|
||||
|
public String getLossRate() { |
||||
|
return lossRate; |
||||
|
} |
||||
|
|
||||
|
public void setLossRate(String lossRate) { |
||||
|
this.lossRate = lossRate; |
||||
|
} |
||||
|
|
||||
|
public double getRttAvg() { |
||||
|
return rttAvg; |
||||
|
} |
||||
|
|
||||
|
public void setRttAvg(double rttAvg) { |
||||
|
this.rttAvg = rttAvg; |
||||
|
} |
||||
|
|
||||
|
public LocalDateTime getMonitorTime() { |
||||
|
return monitorTime; |
||||
|
} |
||||
|
|
||||
|
public void setMonitorTime(LocalDateTime monitorTime) { |
||||
|
this.monitorTime = monitorTime; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public String toString() { |
||||
|
return "OnlineLog{" + |
||||
|
"id=" + id + |
||||
|
", deviceId=" + deviceId + |
||||
|
", deviceIp='" + deviceIp + '\'' + |
||||
|
", deviceName='" + deviceName + '\'' + |
||||
|
", stakeMark='" + stakeMark + '\'' + |
||||
|
", deviceStatus='" + deviceStatus + '\'' + |
||||
|
", networkQuality='" + networkQuality + '\'' + |
||||
|
", sendCount=" + sendCount + |
||||
|
", receiveCount=" + receiveCount + |
||||
|
", lossCount=" + lossCount + |
||||
|
", lossRate='" + lossRate + '\'' + |
||||
|
", rttAvg=" + rttAvg + |
||||
|
", monitorTime=" + monitorTime + |
||||
|
'}'; |
||||
|
} |
||||
|
|
||||
|
public static class LogBuilder{ |
||||
|
OnlineLog onlineLog = new OnlineLog(); |
||||
|
public LogBuilder setDeviceStatus(String deviceStatus) { |
||||
|
onlineLog.setDeviceStatus(deviceStatus); |
||||
|
return this; |
||||
|
} |
||||
|
public LogBuilder setSendCount(int sendCount) { |
||||
|
onlineLog.setSendCount(sendCount); |
||||
|
return this; |
||||
|
} |
||||
|
public LogBuilder setReceiveCount(int receiveCount) { |
||||
|
onlineLog.setReceiveCount(receiveCount); |
||||
|
return this; |
||||
|
} |
||||
|
public LogBuilder setRttAvg(double rttAvg) { |
||||
|
onlineLog.setRttAvg(rttAvg); |
||||
|
return this; |
||||
|
} |
||||
|
public OnlineLog build(DcDevice device) { |
||||
|
onlineLog.setDeviceId(device.getId()); |
||||
|
onlineLog.setDeviceIp(device.getDeviceIp()); |
||||
|
onlineLog.setDeviceName(device.getDeviceName()); |
||||
|
onlineLog.setStakeMark(device.getStakeMark()); |
||||
|
String lossRate = String.format("%.2f%%", (double) onlineLog.getLossCount() / onlineLog.getSendCount() * 100); |
||||
|
onlineLog.setLossRate(lossRate); |
||||
|
double rttAvg = onlineLog.getRttAvg(); |
||||
|
if(rttAvg > 0 && rttAvg <= 30){ |
||||
|
onlineLog.setNetworkQuality(NetworkQuality.GOOD.getValue()); |
||||
|
}else if(rttAvg >30 && rttAvg <= 100){ |
||||
|
onlineLog.setNetworkQuality(NetworkQuality.NORMAL.getValue()); |
||||
|
}else { |
||||
|
onlineLog.setNetworkQuality(NetworkQuality.BAD.getValue()); |
||||
|
} |
||||
|
onlineLog.setLossCount(onlineLog.getSendCount() - onlineLog.getReceiveCount()); |
||||
|
onlineLog.setMonitorTime(LocalDateTime.now()); |
||||
|
return onlineLog; |
||||
|
} |
||||
|
public OnlineLog buildBad(DcDevice device){ |
||||
|
onlineLog.setDeviceId(device.getId()); |
||||
|
onlineLog.setDeviceIp(device.getDeviceIp()); |
||||
|
onlineLog.setDeviceName(device.getDeviceName()); |
||||
|
onlineLog.setStakeMark(device.getStakeMark()); |
||||
|
onlineLog.setNetworkQuality(NetworkQuality.BAD.getValue()); |
||||
|
onlineLog.setMonitorTime(LocalDateTime.now()); |
||||
|
onlineLog.setSendCount(4); |
||||
|
onlineLog.setReceiveCount(0); |
||||
|
onlineLog.setLossCount(4); |
||||
|
onlineLog.setLossRate("100.00%"); |
||||
|
onlineLog.setRttAvg(0); |
||||
|
onlineLog.setDeviceStatus(UniversalEnum.ZERO.getValue()); |
||||
|
return onlineLog; |
||||
|
} |
||||
|
public OnlineLog buildGood(DcDevice device){ |
||||
|
onlineLog.setDeviceId(device.getId()); |
||||
|
onlineLog.setDeviceIp(device.getDeviceIp()); |
||||
|
onlineLog.setDeviceName(device.getDeviceName()); |
||||
|
onlineLog.setStakeMark(device.getStakeMark()); |
||||
|
onlineLog.setNetworkQuality(NetworkQuality.GOOD.getValue()); |
||||
|
onlineLog.setMonitorTime(LocalDateTime.now()); |
||||
|
onlineLog.setSendCount(4); |
||||
|
onlineLog.setReceiveCount(4); |
||||
|
onlineLog.setLossCount(0); |
||||
|
onlineLog.setLossRate("0.00%"); |
||||
|
onlineLog.setRttAvg(30); |
||||
|
onlineLog.setDeviceStatus(UniversalEnum.ONE.getValue()); |
||||
|
return onlineLog; |
||||
|
} |
||||
|
} |
||||
|
enum NetworkQuality{ |
||||
|
GOOD("优"), |
||||
|
NORMAL("良"), |
||||
|
BAD("差"); |
||||
|
private final String value; |
||||
|
String getValue() { |
||||
|
return value; |
||||
|
} |
||||
|
NetworkQuality(String value) { |
||||
|
this.value = value; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,182 @@ |
|||||
|
package com.zc.business.domain; |
||||
|
|
||||
|
import com.fasterxml.jackson.annotation.JsonFormat; |
||||
|
import org.springframework.format.annotation.DateTimeFormat; |
||||
|
|
||||
|
import java.util.Date; |
||||
|
|
||||
|
public class OnlineSum implements java.io.Serializable { |
||||
|
private static final long serialVersionUID = 1L; |
||||
|
private long id; |
||||
|
private long deviceId; |
||||
|
private String deviceName; |
||||
|
private String deviceIp; |
||||
|
private String stakeMark; |
||||
|
private String deviceStatus; |
||||
|
private int sendCount;//发送数
|
||||
|
private int receiveCount;//返回数
|
||||
|
private int lossCount;//丢包数
|
||||
|
private String lossRate;//丢包率
|
||||
|
private double rttAvg;//平均往返时延
|
||||
|
private String networkQuality;//网络质量
|
||||
|
@DateTimeFormat(pattern = "yyyy-MM-dd") |
||||
|
@JsonFormat(pattern = "yyyy-MM-dd") |
||||
|
private Date statisticalDate;//统计日期
|
||||
|
|
||||
|
public long getId() { |
||||
|
return id; |
||||
|
} |
||||
|
|
||||
|
public void setId(long id) { |
||||
|
this.id = id; |
||||
|
} |
||||
|
|
||||
|
public Long getDeviceId() { |
||||
|
return deviceId; |
||||
|
} |
||||
|
|
||||
|
public void setDeviceId(Long deviceId) { |
||||
|
this.deviceId = deviceId; |
||||
|
} |
||||
|
|
||||
|
public String getDeviceName() { |
||||
|
return deviceName; |
||||
|
} |
||||
|
|
||||
|
public void setDeviceName(String deviceName) { |
||||
|
this.deviceName = deviceName; |
||||
|
} |
||||
|
|
||||
|
public String getDeviceIp() { |
||||
|
return deviceIp; |
||||
|
} |
||||
|
|
||||
|
public void setDeviceIp(String deviceIp) { |
||||
|
this.deviceIp = deviceIp; |
||||
|
} |
||||
|
|
||||
|
public String getStakeMark() { |
||||
|
return stakeMark; |
||||
|
} |
||||
|
|
||||
|
public void setStakeMark(String stakeMark) { |
||||
|
this.stakeMark = stakeMark; |
||||
|
} |
||||
|
|
||||
|
public String getDeviceStatus() { |
||||
|
return deviceStatus; |
||||
|
} |
||||
|
|
||||
|
public void setDeviceStatus(String deviceStatus) { |
||||
|
this.deviceStatus = deviceStatus; |
||||
|
} |
||||
|
|
||||
|
public int getSendCount() { |
||||
|
return sendCount; |
||||
|
} |
||||
|
|
||||
|
public void setSendCount(int sendCount) { |
||||
|
this.sendCount = sendCount; |
||||
|
} |
||||
|
|
||||
|
public int getReceiveCount() { |
||||
|
return receiveCount; |
||||
|
} |
||||
|
|
||||
|
public void setReceiveCount(int receiveCount) { |
||||
|
this.receiveCount = receiveCount; |
||||
|
} |
||||
|
|
||||
|
public int getLossCount() { |
||||
|
return lossCount; |
||||
|
} |
||||
|
|
||||
|
public void setLossCount(int lossCount) { |
||||
|
this.lossCount = lossCount; |
||||
|
} |
||||
|
|
||||
|
public String getLossRate() { |
||||
|
return lossRate; |
||||
|
} |
||||
|
|
||||
|
public void setLossRate(String lossRate) { |
||||
|
this.lossRate = lossRate; |
||||
|
} |
||||
|
|
||||
|
public double getRttAvg() { |
||||
|
return rttAvg; |
||||
|
} |
||||
|
|
||||
|
public void setRttAvg(double rttAvg) { |
||||
|
this.rttAvg = rttAvg; |
||||
|
} |
||||
|
|
||||
|
public String getNetworkQuality() { |
||||
|
return networkQuality; |
||||
|
} |
||||
|
|
||||
|
public void setNetworkQuality(String networkQuality) { |
||||
|
this.networkQuality = networkQuality; |
||||
|
} |
||||
|
|
||||
|
public Date getStatisticalDate() { |
||||
|
return statisticalDate; |
||||
|
} |
||||
|
|
||||
|
public void setStatisticalDate(Date statisticalDate) { |
||||
|
this.statisticalDate = statisticalDate; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public String toString() { |
||||
|
return "OnlineSum{" + |
||||
|
"id=" + id + |
||||
|
", deviceId='" + deviceId + '\'' + |
||||
|
", deviceName='" + deviceName + '\'' + |
||||
|
", deviceIp='" + deviceIp + '\'' + |
||||
|
", stakeMark='" + stakeMark + '\'' + |
||||
|
", deviceStatus='" + deviceStatus + '\'' + |
||||
|
", sendCount=" + sendCount + |
||||
|
", receiveCount=" + receiveCount + |
||||
|
", lossCount=" + lossCount + |
||||
|
", lossRate='" + lossRate + '\'' + |
||||
|
", rttAvg=" + rttAvg + |
||||
|
", networkQuality='" + networkQuality + '\'' + |
||||
|
", statisticalDate=" + statisticalDate + |
||||
|
'}'; |
||||
|
} |
||||
|
|
||||
|
public OnlineSum copyFromLog(OnlineLog onlineLog) { |
||||
|
this.deviceId = onlineLog.getDeviceId(); |
||||
|
this.deviceName = onlineLog.getDeviceName(); |
||||
|
this.deviceIp = onlineLog.getDeviceIp(); |
||||
|
this.stakeMark = onlineLog.getStakeMark(); |
||||
|
this.deviceStatus = onlineLog.getDeviceStatus(); |
||||
|
this.sendCount = onlineLog.getSendCount(); |
||||
|
this.receiveCount = onlineLog.getReceiveCount(); |
||||
|
this.lossCount = onlineLog.getLossCount(); |
||||
|
this.lossRate = onlineLog.getLossRate(); |
||||
|
this.rttAvg = onlineLog.getRttAvg(); |
||||
|
this.networkQuality = onlineLog.getNetworkQuality(); |
||||
|
this.statisticalDate = new Date(); |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
public OnlineSum incrementSummary(OnlineLog onlineLog) { |
||||
|
double rtt = this.rttAvg*this.sendCount+onlineLog.getRttAvg()*onlineLog.getSendCount(); |
||||
|
this.deviceStatus = onlineLog.getDeviceStatus(); |
||||
|
this.sendCount += onlineLog.getSendCount(); |
||||
|
this.receiveCount += onlineLog.getReceiveCount(); |
||||
|
this.lossCount += onlineLog.getLossCount(); |
||||
|
this.lossRate = String.format("%.2f%%", (this.sendCount==0?0:(double)this.lossCount/this.sendCount)*100); |
||||
|
this.rttAvg = this.sendCount==0?0:rtt/this.sendCount; |
||||
|
if(this.rttAvg > 0 && this.rttAvg <= 30){ |
||||
|
this.networkQuality = OnlineLog.NetworkQuality.GOOD.getValue(); |
||||
|
}else if(this.rttAvg >30 && this.rttAvg <= 100){ |
||||
|
this.networkQuality = OnlineLog.NetworkQuality.NORMAL.getValue(); |
||||
|
}else { |
||||
|
this.networkQuality = OnlineLog.NetworkQuality.BAD.getValue(); |
||||
|
} |
||||
|
return this; |
||||
|
} |
||||
|
} |
@ -0,0 +1,9 @@ |
|||||
|
package com.zc.business.mapper; |
||||
|
|
||||
|
import com.zc.business.domain.OnlineLog; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
public interface OnlineLogMapper { |
||||
|
int addBatch(List<OnlineLog> onlineLogs); |
||||
|
} |
@ -0,0 +1,12 @@ |
|||||
|
package com.zc.business.service; |
||||
|
|
||||
|
import com.zc.business.domain.OnlineLog; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* 设备在线日志 |
||||
|
*/ |
||||
|
public interface IOnlineLogService { |
||||
|
int addBatch(List<OnlineLog> list); |
||||
|
} |
@ -0,0 +1,19 @@ |
|||||
|
package com.zc.business.service.impl; |
||||
|
|
||||
|
import com.zc.business.domain.OnlineLog; |
||||
|
import com.zc.business.mapper.OnlineLogMapper; |
||||
|
import com.zc.business.service.IOnlineLogService; |
||||
|
import org.springframework.stereotype.Service; |
||||
|
|
||||
|
import javax.annotation.Resource; |
||||
|
import java.util.List; |
||||
|
@Service |
||||
|
public class OnlineLogServiceImpl implements IOnlineLogService { |
||||
|
@Resource |
||||
|
private OnlineLogMapper onlineLogMapper; |
||||
|
|
||||
|
@Override |
||||
|
public int addBatch(List<OnlineLog> list) { |
||||
|
return onlineLogMapper.addBatch(list); |
||||
|
} |
||||
|
} |
@ -0,0 +1,352 @@ |
|||||
|
package com.zc.business.task; |
||||
|
|
||||
|
import com.alibaba.excel.util.DateUtils; |
||||
|
import com.alibaba.fastjson.JSON; |
||||
|
import com.alibaba.fastjson.JSONObject; |
||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
||||
|
import com.ruoyi.common.core.domain.AjaxResult; |
||||
|
import com.ruoyi.common.core.redis.RedisCache; |
||||
|
import com.ruoyi.common.utils.spring.SpringUtils; |
||||
|
import com.zc.business.constant.RedisKeyConstants; |
||||
|
import com.zc.business.domain.DcDevice; |
||||
|
import com.zc.business.domain.OnlineLog; |
||||
|
import com.zc.business.domain.OnlineSum; |
||||
|
import com.zc.business.enums.UniversalEnum; |
||||
|
import com.zc.business.service.IDcDeviceService; |
||||
|
import com.zc.business.service.IOnlineLogService; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
import java.io.BufferedReader; |
||||
|
import java.io.IOException; |
||||
|
import java.io.InputStreamReader; |
||||
|
import java.net.InetAddress; |
||||
|
import java.time.LocalDateTime; |
||||
|
import java.time.ZoneId; |
||||
|
import java.time.ZonedDateTime; |
||||
|
import java.time.temporal.ChronoUnit; |
||||
|
import java.util.*; |
||||
|
import java.util.concurrent.ConcurrentHashMap; |
||||
|
import java.util.concurrent.ExecutorService; |
||||
|
import java.util.concurrent.Executors; |
||||
|
import java.util.concurrent.TimeUnit; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.springframework.util.ObjectUtils; |
||||
|
|
||||
|
import javax.tools.JavaFileManager; |
||||
|
import javax.xml.stream.Location; |
||||
|
|
||||
|
/** |
||||
|
* 设备在线率检测 |
||||
|
*/ |
||||
|
@Component("DeviceOnline") |
||||
|
public class DeviceOnlineTask { |
||||
|
Logger logger = LoggerFactory.getLogger(DeviceOnlineTask.class); |
||||
|
IDcDeviceService dcDeviceService = SpringUtils.getBean(IDcDeviceService.class); |
||||
|
IOnlineLogService onlineLogService = SpringUtils.getBean(IOnlineLogService.class); |
||||
|
RedisCache redisCache = SpringUtils.getBean(RedisCache.class); |
||||
|
ExecutorService executorService; |
||||
|
final static int BATCH_SIZE = 100; |
||||
|
/** |
||||
|
* 设备在线率检测一小时执行一次 |
||||
|
*/ |
||||
|
public void deviceOnlineTask() { |
||||
|
LambdaQueryWrapper<DcDevice> lambdaQueryWrapper = new LambdaQueryWrapper<>(); |
||||
|
List<DcDevice> deviceList = dcDeviceService.list(lambdaQueryWrapper); |
||||
|
Map<Long,OnlineLog> onlineLogMap = new ConcurrentHashMap<>(); |
||||
|
executorService = Executors.newFixedThreadPool(UniversalEnum.ONE_HUNDRED.getNumber()); |
||||
|
for (DcDevice device : deviceList) { |
||||
|
executorService.submit(()->{ |
||||
|
try { |
||||
|
String ipAddress = device.getDeviceIp(); |
||||
|
OnlineLog onlineLog; |
||||
|
if(ipAddress == null || ipAddress.isEmpty()){ |
||||
|
//IP为空,查询物联状态
|
||||
|
onlineLog = getIotDeviceStatus(device); |
||||
|
}else { |
||||
|
if(isReachable(ipAddress)){ |
||||
|
onlineLog = sendPingPacket(device); |
||||
|
}else { |
||||
|
onlineLog = new OnlineLog.LogBuilder().buildBad(device); |
||||
|
} |
||||
|
} |
||||
|
if(onlineLog != null){ |
||||
|
onlineLogMap.put(device.getId(), onlineLog); |
||||
|
} |
||||
|
} catch (Exception e) { |
||||
|
e.printStackTrace(); |
||||
|
logger.error("Error pinging device {},message {}", device.getDeviceIp(), e.getMessage()); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
shutdown(); |
||||
|
//批量处理数据
|
||||
|
addBatch(new ArrayList<>(onlineLogMap.values())); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 是否可达 |
||||
|
* @param ipAddress IP地址 |
||||
|
* @return @see boolean |
||||
|
*/ |
||||
|
private boolean isReachable(String ipAddress) { |
||||
|
try { |
||||
|
InetAddress address = InetAddress.getByName(ipAddress); |
||||
|
return address.isReachable(UniversalEnum.FIVE_THOUSAND.getNumber()); |
||||
|
} catch (IOException e) { |
||||
|
e.printStackTrace(); |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 发送ping包(通用) |
||||
|
* @param device ip地址 |
||||
|
* @return @see OnlineLog |
||||
|
*/ |
||||
|
private OnlineLog sendPingPacket(DcDevice device){ |
||||
|
switch (SystemType.checkSystem()){ |
||||
|
case LINUX_SYSTEM: |
||||
|
return sendPingPacketOfLinux(device); |
||||
|
case WIN_SYSTEM: |
||||
|
return sendPingPacketOfWindows(device); |
||||
|
case AIX_SYSTEM: |
||||
|
case UNIX_SYSTEM: |
||||
|
throw new UnsupportedOperationException("不支持的系统类型"); |
||||
|
default: |
||||
|
throw new IllegalStateException("未知的系统类型,无法执行命令"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 发送ping包(linux) |
||||
|
* @param device ip地址 |
||||
|
* @return @see OnlineLog |
||||
|
*/ |
||||
|
public OnlineLog sendPingPacketOfLinux(DcDevice device) { |
||||
|
OnlineLog.LogBuilder logBuilder = new OnlineLog.LogBuilder(); |
||||
|
try { |
||||
|
// Execute the ping command
|
||||
|
Process process = Runtime.getRuntime().exec(PingCommand.LINUX_PING.getValue() + device.getDeviceIp()); // Sending 4 ICMP Echo Request packets
|
||||
|
// Read the output of the command
|
||||
|
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); |
||||
|
int transmitted = 0; |
||||
|
int received = 0; |
||||
|
double rttAvg = 0.0; |
||||
|
String line; |
||||
|
while ((line = reader.readLine()) != null) { |
||||
|
if (line.contains("packets transmitted")) { |
||||
|
String[] stats = line.split(", "); |
||||
|
transmitted = Integer.parseInt(stats[0].split(" ")[0]); |
||||
|
received = Integer.parseInt(stats[1].split(" ")[0]); |
||||
|
} |
||||
|
if(line.contains("rtt")){ |
||||
|
String[] stats = line.split(" "); |
||||
|
rttAvg = Double.parseDouble(stats[3].split("/")[1]); |
||||
|
} |
||||
|
} |
||||
|
return logBuilder.setDeviceStatus(UniversalEnum.ONE.getValue()) |
||||
|
.setSendCount(transmitted) |
||||
|
.setReceiveCount(received) |
||||
|
.setRttAvg(rttAvg) |
||||
|
.build(device); |
||||
|
} catch (IOException e) { |
||||
|
e.printStackTrace(); |
||||
|
return logBuilder.buildBad(device); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public OnlineLog sendPingPacketOfWindows(DcDevice device) { |
||||
|
OnlineLog.LogBuilder logBuilder = new OnlineLog.LogBuilder(); |
||||
|
ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", "/c", "ping", "-n", "4", device.getDeviceIp()); |
||||
|
try { |
||||
|
// 启动进程
|
||||
|
Process process = processBuilder.start(); |
||||
|
// 读取命令的标准输出
|
||||
|
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK")); |
||||
|
int transmitted = 0; |
||||
|
int received = 0; |
||||
|
double rttAvg = 0.0; |
||||
|
String line; |
||||
|
while ((line = reader.readLine()) != null) { |
||||
|
if (line.contains("已发送")) { |
||||
|
String[] stats = line.split(","); |
||||
|
transmitted = Integer.parseInt(stats[0].split("= ")[1]); |
||||
|
received = Integer.parseInt(stats[1].split("= ")[1]); |
||||
|
} |
||||
|
if(line.contains("平均")){ |
||||
|
String[] stats = line.split(","); |
||||
|
rttAvg = Double.parseDouble(stats[2].split("= ")[1].substring(0, stats[2].split("= ")[1].length()-2)); |
||||
|
} |
||||
|
} |
||||
|
// 等待进程结束
|
||||
|
process.waitFor(); |
||||
|
return logBuilder.setDeviceStatus(UniversalEnum.ONE.getValue()) |
||||
|
.setSendCount(transmitted) |
||||
|
.setReceiveCount(received) |
||||
|
.setRttAvg(rttAvg) |
||||
|
.build(device); |
||||
|
} catch (IOException | InterruptedException e) { |
||||
|
e.printStackTrace(); |
||||
|
return logBuilder.buildBad(device); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 关闭线程池 |
||||
|
*/ |
||||
|
public void shutdown() { |
||||
|
executorService.shutdown(); // 发起关闭请求,不再接受新任务,但会等待已提交的任务完成
|
||||
|
try { |
||||
|
// 等待所有任务完成,或者等待直到超时
|
||||
|
if (!executorService.awaitTermination(55, TimeUnit.MINUTES)) { |
||||
|
// 超时后尝试停止所有正在执行的任务
|
||||
|
executorService.shutdownNow(); // 这不会等待正在执行的任务完成
|
||||
|
} |
||||
|
} catch (InterruptedException e) { |
||||
|
Thread.currentThread().interrupt(); // 重新设置中断状态
|
||||
|
executorService.shutdownNow(); // 尝试停止所有任务
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 批量处理数据 |
||||
|
* @param onlineLogs 待处理数据 |
||||
|
*/ |
||||
|
private void addBatch(List<OnlineLog> onlineLogs) { |
||||
|
for (int i = 0; i < onlineLogs.size(); i += BATCH_SIZE) { |
||||
|
int endIndex = Math.min(i + BATCH_SIZE, onlineLogs.size()); |
||||
|
List<OnlineLog> subList = onlineLogs.subList(i, endIndex); |
||||
|
int rows = onlineLogService.addBatch(subList); |
||||
|
if(rows >0) { |
||||
|
for (OnlineLog onlineLog : subList) { |
||||
|
incrementSummary(onlineLog); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
/** |
||||
|
* 增量汇总,当天数据增量汇总到Redis |
||||
|
*/ |
||||
|
private void incrementSummary(OnlineLog onlineLog) { |
||||
|
// 获取当天日期
|
||||
|
String date = DateUtils.format(new Date(), "yyyy-MM-dd"); |
||||
|
if(ObjectUtils.isEmpty(onlineLog) || ObjectUtils.isEmpty(onlineLog.getDeviceId())){ |
||||
|
System.out.println("数据为空"); |
||||
|
} |
||||
|
long deviceId = onlineLog.getDeviceId(); |
||||
|
OnlineSum onlineSum = redisCache.getCacheMapValue(RedisKeyConstants.DEVICE_ONLINE , date+":"+deviceId); |
||||
|
if (ObjectUtils.isEmpty(onlineSum)){ |
||||
|
onlineSum = new OnlineSum().copyFromLog(onlineLog); |
||||
|
redisCache.setCacheMapValue(RedisKeyConstants.DEVICE_ONLINE, date+onlineLog.getDeviceId(), onlineSum); |
||||
|
Long ttl = redisCache.getExpire(RedisKeyConstants.DEVICE_ONLINE); |
||||
|
if(ttl == -1) redisCache.expire(RedisKeyConstants.DEVICE_ONLINE,getTimeout()); |
||||
|
}else { |
||||
|
//增量计算
|
||||
|
onlineSum.incrementSummary(onlineLog); |
||||
|
redisCache.setCacheMapValue(RedisKeyConstants.DEVICE_ONLINE, date+onlineLog.getDeviceId(), onlineSum); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取设备在线状态 |
||||
|
* @param device 设备信息 |
||||
|
* @return @see PingResult |
||||
|
*/ |
||||
|
private OnlineLog getIotDeviceStatus(DcDevice device){ |
||||
|
OnlineLog.LogBuilder logBuilder = new OnlineLog.LogBuilder(); |
||||
|
try { |
||||
|
AjaxResult deviceByIotDeviceId = dcDeviceService.getDeviceByIotDeviceId(device.getIotDeviceId()); |
||||
|
if (Objects.equals(String.valueOf(deviceByIotDeviceId.get("code")), UniversalEnum.TWO_HUNDRED.getValue())){ |
||||
|
String deviceState = ((JSONObject) JSON.toJSON(deviceByIotDeviceId.get("data"))).getString("deviceState"); |
||||
|
if (!ObjectUtils.isEmpty(deviceState) && Objects.equals(deviceState, UniversalEnum.ON_LINE.getValue())) { |
||||
|
return logBuilder.buildGood(device); |
||||
|
} |
||||
|
} |
||||
|
return logBuilder.buildBad(device); |
||||
|
} catch (Exception e) { |
||||
|
e.printStackTrace(); |
||||
|
return logBuilder.buildBad(device); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private long getTimeout(){ |
||||
|
// 获取当前时间
|
||||
|
ZonedDateTime now = ZonedDateTime.now(ZoneId.systemDefault()); |
||||
|
// 获取今天午夜的时间(即今天的00:00:00)
|
||||
|
ZonedDateTime midnight = now.truncatedTo(ChronoUnit.DAYS); |
||||
|
// 计算两个时间点之间的秒数差
|
||||
|
long secondsToday = ChronoUnit.SECONDS.between(midnight, now); |
||||
|
// 一天的秒数
|
||||
|
long secondsInDay = ChronoUnit.SECONDS.between(midnight, midnight.plusDays(1)); |
||||
|
// 当天剩余的秒数
|
||||
|
return secondsInDay - secondsToday; |
||||
|
} |
||||
|
enum SystemType { |
||||
|
WIN_SYSTEM("win"), |
||||
|
LINUX_SYSTEM("linux"), |
||||
|
AIX_SYSTEM("aix"), |
||||
|
UNIX_SYSTEM("unix"), |
||||
|
UNKNOWN_SYSTEM("unknown"); |
||||
|
String value; |
||||
|
String getValue() { |
||||
|
return value; |
||||
|
} |
||||
|
SystemType(String value) { |
||||
|
this.value = value; |
||||
|
} |
||||
|
static SystemType checkSystem(){ |
||||
|
String osName = System.getProperty("os.name").toLowerCase(); |
||||
|
if (osName.contains(SystemType.WIN_SYSTEM.getValue())) { |
||||
|
return SystemType.WIN_SYSTEM; |
||||
|
} else if (osName.contains(SystemType.LINUX_SYSTEM.getValue())) { |
||||
|
return SystemType.LINUX_SYSTEM; |
||||
|
} else if (osName.contains(SystemType.AIX_SYSTEM.getValue())) { |
||||
|
return SystemType.AIX_SYSTEM; |
||||
|
} else if (osName.contains(SystemType.UNIX_SYSTEM.getValue())) { |
||||
|
return SystemType.UNIX_SYSTEM; |
||||
|
} |
||||
|
return SystemType.UNKNOWN_SYSTEM; |
||||
|
} |
||||
|
} |
||||
|
enum PingCommand{ |
||||
|
LINUX_PING("ping -c 4 "), |
||||
|
WINDOWS_PING("ping "); |
||||
|
private final String value; |
||||
|
|
||||
|
String getValue() { |
||||
|
return value; |
||||
|
} |
||||
|
PingCommand(String value) { |
||||
|
this.value = value; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static void main(String[] args) { |
||||
|
// 假设你要ping的主机地址
|
||||
|
String host = "10.0.111.11"; |
||||
|
|
||||
|
// 构建ping命令,注意:Windows和Unix/Linux的ping命令略有不同
|
||||
|
// Windows: ping -n 4 www.google.com
|
||||
|
// Unix/Linux: ping -c 4 www.google.com
|
||||
|
ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", "/c", "ping", "-n", "4", host); |
||||
|
|
||||
|
try { |
||||
|
// 启动进程
|
||||
|
Process process = processBuilder.start(); |
||||
|
|
||||
|
// 读取命令的标准输出
|
||||
|
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK")); |
||||
|
String line; |
||||
|
while ((line = reader.readLine()) != null) { |
||||
|
System.out.println(line); |
||||
|
} |
||||
|
|
||||
|
// 等待进程结束
|
||||
|
int exitCode = process.waitFor(); |
||||
|
System.out.println("\nExited with error code : " + exitCode); |
||||
|
|
||||
|
} catch (IOException | InterruptedException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,38 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
<!DOCTYPE mapper |
||||
|
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
||||
|
<mapper namespace="com.zc.business.mapper.OnlineLogMapper"> |
||||
|
|
||||
|
<resultMap type="OnlineLog" id="OnlineLog"> |
||||
|
|
||||
|
<result property="id" column="id"/> |
||||
|
|
||||
|
</resultMap> |
||||
|
|
||||
|
<insert id="addBatch"> |
||||
|
insert into dc_online_log |
||||
|
( |
||||
|
device_id,device_name,device_ip,stake_mark,device_status,send_count, |
||||
|
receive_count,loss_count,loss_rate,network_quality,rtt_avg,monitor_time |
||||
|
) |
||||
|
values |
||||
|
<foreach collection="list" item="item" index="index" separator=","> |
||||
|
( |
||||
|
#{item.deviceId}, |
||||
|
#{item.deviceName}, |
||||
|
#{item.deviceIp}, |
||||
|
#{item.stakeMark}, |
||||
|
#{item.deviceStatus}, |
||||
|
#{item.sendCount}, |
||||
|
#{item.receiveCount}, |
||||
|
#{item.lossCount}, |
||||
|
#{item.lossRate}, |
||||
|
#{item.networkQuality}, |
||||
|
#{item.rttAvg}, |
||||
|
#{item.monitorTime} |
||||
|
) |
||||
|
</foreach> |
||||
|
</insert> |
||||
|
|
||||
|
</mapper> |
Loading…
Reference in new issue