提交 5de68433 authored 作者: yangli's avatar yangli

删除

上级 bbe17153
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
<!-- Eclipse Paho 1.1.0 contains major issue with persistence of buffered messages. Using 1.1.1-SNAPSHOT for now. Need to remove this after Paho 1.1.1 release --> <!-- Eclipse Paho 1.1.0 contains major issue with persistence of buffered messages. Using 1.1.1-SNAPSHOT for now. Need to remove this after Paho 1.1.1 release -->
<paho.client.version>1.2.0</paho.client.version> <paho.client.version>1.2.0</paho.client.version>
<milo.client.version>0.1.0</milo.client.version> <milo.client.version>0.1.0</milo.client.version>
<moquette.version>0.10</moquette.version>
<netty.version>4.1.22.Final</netty.version> <netty.version>4.1.22.Final</netty.version>
<commons-lang3.version>3.4</commons-lang3.version> <commons-lang3.version>3.4</commons-lang3.version>
<jackson.version>2.10.2</jackson.version> <jackson.version>2.10.2</jackson.version>
...@@ -100,14 +99,6 @@ ...@@ -100,14 +99,6 @@
<artifactId>org.eclipse.paho.client.mqttv3</artifactId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>${paho.client.version}</version> <version>${paho.client.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.sun.winsw</groupId>
<artifactId>winsw</artifactId>
<version>${winsw.version}</version>
<classifier>bin</classifier>
<type>exe</type>
<scope>provided</scope>
</dependency>
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId> <artifactId>commons-lang3</artifactId>
...@@ -133,12 +124,6 @@ ...@@ -133,12 +124,6 @@
<artifactId>jackson-databind</artifactId> <artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version> <version>${jackson.version}</version>
</dependency> </dependency>
<dependency>
<groupId>io.moquette</groupId>
<artifactId>moquette-broker</artifactId>
<version>${moquette.version}</version>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>cn.hutool</groupId> <groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId> <artifactId>hutool-all</artifactId>
......
...@@ -19,7 +19,8 @@ import com.priusis.controller.RemoteControlController; ...@@ -19,7 +19,8 @@ import com.priusis.controller.RemoteControlController;
import com.priusis.lib.R; import com.priusis.lib.R;
import com.priusis.monitor.mqtt.*; import com.priusis.monitor.mqtt.*;
import com.priusis.service.common.MacAddrService; import com.priusis.service.common.MacAddrService;
import com.priusis.utils.*; import com.priusis.utils.MacAddrUtil;
import com.priusis.utils.SysConfigUtil;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.handler.ssl.SslContext; import io.netty.handler.ssl.SslContext;
...@@ -28,8 +29,8 @@ import io.netty.util.concurrent.Promise; ...@@ -28,8 +29,8 @@ import io.netty.util.concurrent.Promise;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.eclipse.paho.client.mqttv3.MqttMessage; import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.hyperic.sigar.FileSystem; import org.hyperic.sigar.Mem;
import org.hyperic.sigar.*; import org.hyperic.sigar.Sigar;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
...@@ -398,9 +399,6 @@ public class MqttServiceImpl implements MqttService, MqttHandler, MqttClientCall ...@@ -398,9 +399,6 @@ public class MqttServiceImpl implements MqttService, MqttHandler, MqttClientCall
// 存储rpc下发的数据 // 存储rpc下发的数据
powerHandler(message, requestId, bizRequestId, mqttRpcDataMessage); powerHandler(message, requestId, bizRequestId, mqttRpcDataMessage);
remoteControlHandler(message, requestId, bizRequestId, mqttRpcDataMessage); remoteControlHandler(message, requestId, bizRequestId, mqttRpcDataMessage);
realDataMonitorScanHandler(message, requestId, bizRequestId, mqttRpcDataMessage);
remoteRtcHandler(message, requestId, bizRequestId, mqttRpcDataMessage);
try { try {
if (!Arrays.asList("power", "remote_control", "remote_control_exit", "remote_control_accept", if (!Arrays.asList("power", "remote_control", "remote_control_exit", "remote_control_accept",
...@@ -458,10 +456,6 @@ public class MqttServiceImpl implements MqttService, MqttHandler, MqttClientCall ...@@ -458,10 +456,6 @@ public class MqttServiceImpl implements MqttService, MqttHandler, MqttClientCall
/** /**
* 远程RPC处理 * 远程RPC处理
* *
...@@ -528,104 +522,9 @@ public class MqttServiceImpl implements MqttService, MqttHandler, MqttClientCall ...@@ -528,104 +522,9 @@ public class MqttServiceImpl implements MqttService, MqttHandler, MqttClientCall
} }
} }
/**
* 数据更新频率变为一秒刷新一次 / 扫描软件请求
*
* @param message
* @param requestId
* @param mqttRpcDataMessage
*/
private void realDataMonitorScanHandler(String message, int requestId, String bizRequestId, MqttRpcDataMessage
mqttRpcDataMessage) {
String method = mqttRpcDataMessage.getMethod();
if (!"real_data_monitor".equals(method) && !"facility_scan".equals(method)) {
return;
}
try {
// 数据更新频率变为一秒刷新一次
if ("real_data_monitor".equals(method) && !realDataMonitor) {
realDataMonitor = true;
log.info("数据上报频率请求接受!!! params: {}", mqttRpcDataMessage.getParams());
realDataMonitorScheduler(mqttRpcDataMessage);
}
if ("facility_scan".equals(method)) {
log.info("收到平台扫描软件请求");
programController.addProgram2Platform(bizRequestId);
}
ObjectNode paramsNode = newNode();
paramsNode.put("code", "1");
paramsNode.put("msg", "success");
paramsNode.put("status", "success");
byte[] msgData = toBytes(newNode().put("requestId", bizRequestId).put("method", method)
.put("resTime", System.currentTimeMillis()).put("response", paramsNode.toString()));
persistMessage(DEVICE_RPC_RES_TOPIC + "/" + requestId, msgIdSeq.incrementAndGet(), msgData, null,
error ->
log.warn("Could not publish realDataMonitorSca res", error));
} catch (Exception e) {
log.error("Failed to process rpc command persistent : {}", message, e);
ObjectNode paramsNode = newNode();
paramsNode.put("code", "0");
paramsNode.put("msg", "fail");
paramsNode.put("status", "fail");
byte[] msgData = toBytes(newNode().put("requestId", bizRequestId).put("method", method)
.put("resTime", System.currentTimeMillis()).put("response", paramsNode.toString()));
persistMessage(DEVICE_RPC_RES_TOPIC + "/" + requestId, msgIdSeq.incrementAndGet(), msgData, null,
error ->
log.warn("Could not publish realDataMonitorSca res", error));
}
}
/**
* 收到语音通话请求
*
* @param message
* @param requestId
* @param mqttRpcDataMessage
*/
private void remoteRtcHandler(String message, int requestId, String bizRequestId, MqttRpcDataMessage
mqttRpcDataMessage) {
String method = mqttRpcDataMessage.getMethod();
if (!"remote_rtc".equals(method)) {
return;
}
try {
if ("remote_rtc".equals(method)) {
log.info("收到语音通话请求");
try {
boolean hasApqExeProcess = WinExecuteUtils.findProcess("apq.exe");
if (!hasApqExeProcess) {
String apqExePath = ParseUrlUtil.parseAbsolutePath("apq.exe", "../../../tools/install-package/client/x64/client-soft", "../client-soft");
ProcessExtensionsApqUtil.apq_CreateProcessAsUser(apqExePath);
}
SysConfigUtil.saveProperty("control.request", "2");
} catch (Exception e) {
log.error("语音通话请求异常", e);
SysConfigUtil.saveProperty("control.request", "0");
}
ObjectNode paramsNode = newNode();
paramsNode.put("code", "1");
paramsNode.put("msg", "success");
paramsNode.put("status", "success");
byte[] msgData = toBytes(newNode().put("requestId", bizRequestId).put("method", method)
.put("resTime", System.currentTimeMillis()).put("response", paramsNode.toString()));
persistMessage(DEVICE_RPC_RES_TOPIC + "/" + requestId, msgIdSeq.incrementAndGet(), msgData, null,
error ->
log.warn("Could not publish remoteRtc res", error));
}
} catch (Exception e) {
log.error("Failed to process rpc command persistent : {}", message, e);
ObjectNode paramsNode = newNode();
paramsNode.put("code", "0");
paramsNode.put("msg", "fail");
paramsNode.put("status", "fail");
byte[] msgData = toBytes(newNode().put("requestId", bizRequestId).put("method", method)
.put("resTime", System.currentTimeMillis()).put("response", paramsNode.toString()));
persistMessage(DEVICE_RPC_RES_TOPIC + "/" + requestId, msgIdSeq.incrementAndGet(), msgData, null,
error ->
log.warn("Could not publish remoteRtc res", error));
}
}
/** /**
* 数据上报频率请求 * 数据上报频率请求
...@@ -645,47 +544,17 @@ public class MqttServiceImpl implements MqttService, MqttHandler, MqttClientCall ...@@ -645,47 +544,17 @@ public class MqttServiceImpl implements MqttService, MqttHandler, MqttClientCall
realDataMonitor = false; realDataMonitor = false;
realDataMonitorSchedulerFuture.cancel(false); realDataMonitorSchedulerFuture.cancel(false);
} }
String cpuLoad = "cpuLoad"; String cpuLoad = "cpuLoad";
String cpuTemp = "cpuTemp";
String memoryOccupyRate = "memoryOccupyRate"; String memoryOccupyRate = "memoryOccupyRate";
String diskFree = "diskFree";
// CPU负载 // CPU负载
double cpuLoadV = Double.parseDouble(decimalFormat.format(sigar.getCpuPerc().getCombined() * 100)); double cpuLoadV = Double.parseDouble(decimalFormat.format(sigar.getCpuPerc().getCombined() * 100));
int[] cpuAndGpuTemp = CoreTempUtil.getCpuAndGpuTemp();
// CPU温度
double cpuTempV = cpuAndGpuTemp[0];
Mem mem = sigar.getMem(); Mem mem = sigar.getMem();
// 内存占用率 // 内存占用率
double memoryOccupyRateV = Double.parseDouble(decimalFormat.format(mem.getUsed() * 1.0 / mem.getTotal() * 100)); double memoryOccupyRateV = Double.parseDouble(decimalFormat.format(mem.getUsed() * 1.0 / mem.getTotal() * 100));
// 磁盘使用容量
String collect = null; Map<String, Object> data = MapUtil.<String, Object>builder()
FileSystem[] diskStores;
Map<String, Object> data = null;
try {
diskStores = sigar.getFileSystemList();
collect = Arrays.stream(diskStores)
.filter(partition -> StrUtil.isNotBlank(partition.getDevName()))
.filter(partition -> 2 == partition.getType())
.map(partition -> {
try {
FileSystemUsage usage = sigar.getFileSystemUsage(partition.getDirName());
return "\"" + StrUtil.removeSuffix(partition.getDevName(), ":\\") + "盘\":\"" +
decimalFormat.format(100d * (usage.getTotal() - usage.getFree()) / usage.getTotal()) + "%\"";
} catch (SigarException e) {
log.error("SigarException: {}", e.getMessage());
}
return "";
})
.collect(Collectors.joining(",", "{", "}"));
} catch (Exception e) {
log.error("硬盘数据获取失败", e);
}
data = MapUtil.<String, Object>builder()
.put(cpuTemp, cpuTempV)
.put(cpuLoad, cpuLoadV) .put(cpuLoad, cpuLoadV)
.put(memoryOccupyRate, memoryOccupyRateV) .put(memoryOccupyRate, memoryOccupyRateV)
.put(diskFree, collect)
.build(); .build();
log.info("采集数据,上报属性: i:{}, mapData:{}", i, data); log.info("采集数据,上报属性: i:{}, mapData:{}", i, data);
List<KvEntry> attrData = getKvEntries(fromString(JSONUtil.toJsonStr(data))); List<KvEntry> attrData = getKvEntries(fromString(JSONUtil.toJsonStr(data)));
......
...@@ -2,15 +2,14 @@ package com.priusis.controller; ...@@ -2,15 +2,14 @@ package com.priusis.controller;
import cn.hutool.core.io.unit.DataSizeUtil; import cn.hutool.core.io.unit.DataSizeUtil;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.priusis.lib.R; import com.priusis.lib.R;
import com.priusis.service.common.MacAddrService; import com.priusis.service.common.MacAddrService;
import com.priusis.utils.CoreTempUtil;
import com.priusis.utils.Oshi4NoneSigarUtil; import com.priusis.utils.Oshi4NoneSigarUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.hyperic.sigar.*; import org.hyperic.sigar.CpuInfo;
import org.hyperic.sigar.Mem;
import org.hyperic.sigar.OperatingSystem;
import org.hyperic.sigar.Sigar;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
...@@ -23,10 +22,8 @@ import java.net.SocketException; ...@@ -23,10 +22,8 @@ import java.net.SocketException;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.util.Arrays;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
/** /**
* @author yangli * @author yangli
...@@ -54,56 +51,11 @@ public class DeviceInfoController { ...@@ -54,56 +51,11 @@ public class DeviceInfoController {
@Scheduled(fixedDelay = 600000) @Scheduled(fixedDelay = 600000)
protected void refresh() throws UnknownHostException { protected void refresh() throws UnknownHostException {
Sigar sigar = new Sigar(); Sigar sigar = new Sigar();
JSONObject diskModel = null;
JSONObject diskCap = null;
JSONObject diskFree = null;
FileSystem[] diskStores;
decimalFormat.applyPattern("#.00"); decimalFormat.applyPattern("#.00");
try {
String diskStoresFromOshiJson = Oshi4NoneSigarUtil.getDiskStoresModelJsonFromOshi();
if (null != diskStoresFromOshiJson) {
diskModel = JSONUtil.parseObj(diskStoresFromOshiJson);
}
diskStores = sigar.getFileSystemList();
diskCap = JSONUtil.parseObj(Arrays.stream(diskStores)
.filter(partition -> StrUtil.isNotBlank(partition.getDevName()))
.filter(partition -> 2 == partition.getType())
.map(partition -> {
try {
FileSystemUsage usage = sigar.getFileSystemUsage(partition.getDirName());
return "\"" + StrUtil.removeSuffix(partition.getDevName(), ":\\") + "盘\":\"" +
DataSizeUtil.format(usage.getTotal() * 1024) + "\"";
} catch (SigarException e) {
log.error("SigarException: {}", e.getMessage());
}
return "";
})
.collect(Collectors.joining(",", "{", "}")));
diskFree = JSONUtil.parseObj(Arrays.stream(diskStores)
.filter(partition -> StrUtil.isNotBlank(partition.getDevName()))
.filter(partition -> 2 == partition.getType())
.map(partition -> {
try {
FileSystemUsage usage = sigar.getFileSystemUsage(partition.getDirName());
return "\"" + StrUtil.removeSuffix(partition.getDevName(), ":\\") + "盘\":\"" +
decimalFormat.format(100d * usage.getFree() / usage.getTotal()) + "%\"";
} catch (SigarException e) {
log.error("SigarException: {}", e.getMessage());
}
return "";
})
.collect(Collectors.joining(",", "{", "}")));
} catch (Exception e) {
log.error("硬盘数据获取失败", e);
}
String memoryCap = ""; String memoryCap = "";
String cpuModel = ""; String cpuModel = "";
// double cpuLoad = 0;
// String memoryAvailable = '';
double cpuTemp = 0; double cpuTemp = 0;
String operatingSystem = ""; String operatingSystem = "";
String baseboard = ""; String baseboard = "";
...@@ -119,15 +71,9 @@ public class DeviceInfoController { ...@@ -119,15 +71,9 @@ public class DeviceInfoController {
Mem mem = sigar.getMem(); Mem mem = sigar.getMem();
memoryCap = DataSizeUtil.format(mem.getTotal()); memoryCap = DataSizeUtil.format(mem.getTotal());
// cpuLoad = Double.parseDouble(new DecimalFormat("#.00").format(sigar.getCpuPerc().getCombined() * 100));
// memoryAvailable = new DecimalFormat("#,##0.###").format(mem.getFree() / Math.pow(1024, 3));
OperatingSystem OS = OperatingSystem.getInstance(); OperatingSystem OS = OperatingSystem.getInstance();
operatingSystem = OS.getVendor() + " " + OS.getName().replace("Win32", "Windows") + " " + OS.getVersion() + "(" + OS.getArch() + ")"; operatingSystem = OS.getVendor() + " " + OS.getName().replace("Win32", "Windows") + " " + OS.getVersion() + "(" + OS.getArch() + ")";
// cpuTemp = Double.parseDouble(new DecimalFormat("#.00").format(OshiUtil.getSensors().getCpuTemperature()));
cpuTemp = CoreTempUtil.getCpuTemp();
} catch (Exception e) { } catch (Exception e) {
log.error("SigarException", e); log.error("SigarException", e);
} }
...@@ -140,12 +86,7 @@ public class DeviceInfoController { ...@@ -140,12 +86,7 @@ public class DeviceInfoController {
.put("ip", ip) .put("ip", ip)
.put("cpuModel", cpuModel) .put("cpuModel", cpuModel)
.put("cpuTemp", cpuTemp) .put("cpuTemp", cpuTemp)
// .put("cpuLoad", cpuLoad)
// .put("memoryAvailable", memoryAvailable)
.put("memoryCap", memoryCap) .put("memoryCap", memoryCap)
.put("diskModel", diskModel)
.put("diskCap", diskCap)
.put("diskFree", diskFree)
.build(); .build();
} }
......
...@@ -5,8 +5,6 @@ import cn.hutool.core.collection.ConcurrentHashSet; ...@@ -5,8 +5,6 @@ import cn.hutool.core.collection.ConcurrentHashSet;
import cn.hutool.core.collection.ListUtil; import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.io.StreamProgress; import cn.hutool.core.io.StreamProgress;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpResponse;
...@@ -15,18 +13,14 @@ import cn.hutool.json.JSONArray; ...@@ -15,18 +13,14 @@ import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists;
import com.priusis.cache.InstalledProgramCache; import com.priusis.cache.InstalledProgramCache;
import com.priusis.lib.R; import com.priusis.lib.R;
import com.priusis.service.common.MacAddrService; import com.priusis.service.common.MacAddrService;
import com.priusis.utils.ProcessExtensionsApqUtil;
import com.priusis.utils.SysConfigUtil; import com.priusis.utils.SysConfigUtil;
import com.priusis.vo.FacilityProgramVo;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -35,10 +29,8 @@ import javax.servlet.http.HttpServletResponse; ...@@ -35,10 +29,8 @@ import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern; import javax.validation.constraints.Pattern;
import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
...@@ -308,153 +300,4 @@ public class ProgramController { ...@@ -308,153 +300,4 @@ public class ProgramController {
.map(R::success) .map(R::success)
.orElseGet(R::success); .orElseGet(R::success);
} }
//// @Scheduled(fixedDelay = 60000)
public void addProgram2Platform(String bizRequestId) throws IOException {
String mac = macAddrService.getMacAddr();
if (StrUtil.isBlank(mac)) {
log.warn("未获取到MAC地址");
return;
}
// 已安装软件列表
List<FacilityProgramVo> programNames = installedProgramCache.getPrograms()
.stream().map(FacilityProgramVo::toFacilityProgramVoFromCache).sorted().collect(Collectors.toList());
log.info("收到平台扫描软件请求,已安装软件:{}", programNames.size());
// 扫描进程列表
Set<String> processNames = new HashSet<>();
Process process = Runtime.getRuntime().exec("cmd /c tasklist"
+ " -fi " + '"' + "USERNAME ne NT AUTHORITY\\NETWORK SERVICE" + '"'
+ " -fi " + '"' + "USERNAME ne NT AUTHORITY\\LOCAL SERVICE" + '"'
+ " -fi " + '"' + "USERNAME ne Window Manager\\UMFD-0" + '"'
+ " -fi " + '"' + "USERNAME ne Font Driver Host\\UMFD-1" + '"'
+ " -fi " + '"' + "USERNAME ne Font Driver Host\\DWM-1" + '"'
+ " -fi " + '"' + "USERNAME ne 暂缺" + '"'
+ " /fo csv");
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK"))) {
reader.readLine();
String line;
while ((line = reader.readLine()) != null) {
// 去除注册表的数据
String taskProcess = line.substring(1, line.indexOf("\",\""));
if (!containsOfCache(taskProcess) && !excludePrograms.contains(taskProcess)) {
processNames.add(taskProcess);
}
}
process.destroy();
}
List<FacilityProgramVo> processNameVos = Lists.newArrayList();
for (String processName : processNames) {
processNameVos.add(FacilityProgramVo.toFacilityProgramVoFromProcessName(processName));
}
log.info("收到平台扫描软件请求,扫描进程列表:{}", processNameVos.size());
String postResult = HttpUtil.post(gateway + addProgramUrl,
JSONUtil.createObj()
.set("macAddress", mac)
.set("requestId", bizRequestId)
.set("programList", programNames)
.set("processList", processNameVos)
.toString());
log.info("设备软件扫描,result:{},requestId:{},programList:{},processList:{}", postResult, bizRequestId, programNames.size(), processNameVos.size());
}
private boolean containsOfCache(String taskProcess) {
boolean result = false;
try {
for (Map<String, String> program : installedProgramCache.getPrograms()) {
String startPath = MapUtil.getStr(program, "startPath");
if (!StrUtil.isBlank(startPath) && startPath.contains("." + taskProcess)) {
result = true;
continue;
}
}
} catch (Exception e) {
log.error("系统异常", e);
}
return result;
}
public static void main(String[] args) throws InterruptedException, IOException {
String t = "{\"changeContent\":\"拔出U盘/移动硬盘\",\"changeRemark\":\"USB 大容量存储设备;;Storage Media;兼容 USB 存储设备;class\u003dUSB;\",\"changeType\":2,\"deviceClass\":\"USB_DRIVE\"}";
System.out.println(t);
/*int exitVal = -1;
try {
exitVal = Runtime.getRuntime().exec("cmd /c \"D:\\work\\priusis\\priusis-iot\\apq-iot\\apq-client\\tools\\install-package\boot\\dist\\apq-info-install.exe\"").waitFor();
} catch (Exception e) {
log.error("执行安装文件失败", e);
}
System.out.println(exitVal);
System.out.println("========");*/
// System.out.println("cmd /c tasklist -fi " + '"' + "imagename ne NT AUTHORITY SYSTEM" + '"' + " -fi " + '"' + "imagename ne NT AUTHORITY SYSTEM" + '"' + " /fo csv");
/* int exitVal = -1;
try {
exitVal = Runtime.getRuntime().exec("cmd /c \"D:\\work\\priusis\\priusis-iot\\apq-iot\\apq-client\\tools\\install-package\\boot\\dist\\阿普奇检测客户端_x32.exe\" /sp- /silent /norestart /suppressmsgboxes").waitFor();
} catch (Exception e) {
log.error("执行安装文件失败", e);
}
System.out.println(exitVal);*/
// =================================================================
/*String url = "http://apuqi.oss-cn-zhangjiakou.aliyuncs.com/ossdata/20220420/f65fe478633c43f493a0b60d13717504.exe";
String fileName = url.substring(url.lastIndexOf("/") + 1);
System.out.println(fileName);
Runtime.getRuntime().exec("cmd /c \"C:\\apqdownloads\\f65fe478633c43f493a0b60d13717504.exe\"");
System.out.println(11);*/
}
@Scheduled(fixedDelay = 360000)
protected void autoUpgradeJob() {
try {
log.info("执行自动安装文件 ==============1");
boolean autoUpgrade = Convert.toBool(SysConfigUtil.getProperty("auto.upgrade"), true);
if (!autoUpgrade) return;
String downloadPath = SysConfigUtil.getProperty("download.path",
System.getProperty("user.dir").substring(0, 3) + "apqdownloads");
File dir = new File(downloadPath);
if (!dir.exists()) dir.mkdirs();
log.info("执行自动安装文件 ==============2");
list("upgrade", 1, 10000).getData().getRecords()
.parallelStream()
// upgradeTime
.filter(m -> BooleanUtil.toBoolean(m.get("isUpgrade")) && ObjectUtil.notEqual(m.get("version"), m.get("localVersion")))
.forEach(m -> {
log.info("执行自动安装文件 ==============3");
String url = m.get("url");
String fileName = url.substring(url.lastIndexOf("/") + 1);
File fileE = new File(downloadPath + File.separator + fileName);
if (!fileE.exists()) {
HttpResponse rsp = HttpUtil.createGet(url).execute(true);
fileE = rsp.writeBodyForFile(dir, null);
}
// int exitVal = -1;
try {
String exeCmd = "autoExe.bat \"" + fileE.getPath() + "\"";
ProcessExtensionsApqUtil.apq_CreateProcessAsUser(exeCmd);
log.info("执行安装文件 {} ", exeCmd);
// Runtime.getRuntime().exec("cmd /c \"C:\\apqdownloads\\f65fe478633c43f493a0b60d13717504.exe\" /sp- /silent /norestart /suppressmsgboxes");
installedProgramCache.updateProgramInfoCacheByNameAndVersion(m.get("name"), m.get("version"));
} catch (Exception e) {
log.error("执行安装文件 {} 失败", fileE.getPath(), e);
}
log.info("执行安装文件 ==============");
// if (exitVal == 0) {
// String reqUrl = gateway + StrUtil.format(upgradeStatusUpIssueUrl, macAddrService.getMacAddr(), m.get("id"));
// HttpUtil.post(reqUrl, (String) null);
// }
});
} catch (Exception e) {
log.error("自动升级任务执行异常", e);
}
}
} }
...@@ -3,37 +3,30 @@ package com.priusis.job; ...@@ -3,37 +3,30 @@ package com.priusis.job;
import cn.hutool.core.io.unit.DataSizeUtil; import cn.hutool.core.io.unit.DataSizeUtil;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import cn.hutool.system.oshi.CpuInfo; import com.priusis.client.service.MqttRpcDataMessage;
import cn.hutool.system.oshi.OshiUtil;
import com.priusis.service.common.MacAddrService; import com.priusis.service.common.MacAddrService;
import com.priusis.utils.CoreTempUtil;
import com.priusis.utils.DiskSmartUtil;
import com.priusis.utils.Oshi4NoneSigarUtil; import com.priusis.utils.Oshi4NoneSigarUtil;
import com.priusis.utils.sigar.SigarUtil; import com.priusis.utils.sigar.SigarUtil;
import com.priusis.vo.ApqInfoDataVo; import com.priusis.vo.ApqInfoDataVo;
import com.priusis.client.service.MqttRpcDataMessage;
import com.priusis.vo.RemoteDeviceVoResult;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.hyperic.sigar.*; import org.hyperic.sigar.Mem;
import org.hyperic.sigar.Sigar;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import oshi.hardware.HWDiskStore;
import oshi.hardware.HWPartition;
import oshi.util.FormatUtil;
import java.net.InetAddress; import java.net.InetAddress;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.util.*; import java.util.HashMap;
import java.util.stream.Collectors; import java.util.List;
import java.util.Locale;
import java.util.Map;
@Slf4j @Slf4j
@Component @Component
...@@ -60,8 +53,7 @@ public class ApqInfoJob { ...@@ -60,8 +53,7 @@ public class ApqInfoJob {
private int runningIndex = 0; private int runningIndex = 0;
private static Map<String, Map<String, String>> hardwareCache = new HashMap<>();
private static Map<String, String> attrCache = new HashMap<>();
private Locale enlocale = new Locale("en", "US"); private Locale enlocale = new Locale("en", "US");
private DecimalFormat decimalFormat = (DecimalFormat)NumberFormat.getNumberInstance(enlocale); private DecimalFormat decimalFormat = (DecimalFormat)NumberFormat.getNumberInstance(enlocale);
...@@ -102,77 +94,21 @@ public class ApqInfoJob { ...@@ -102,77 +94,21 @@ public class ApqInfoJob {
String ip = "ip"; String ip = "ip";
String cpuModel = "cpuModel"; String cpuModel = "cpuModel";
String cpuLoad = "cpuLoad"; String cpuLoad = "cpuLoad";
String cpuTemp = "cpuTemp";
String gpuTemp = "gpuTemp";
String memoryCap = "memoryCap"; String memoryCap = "memoryCap";
String memoryAvailable = "memoryAvailable"; String memoryAvailable = "memoryAvailable";
String memoryOccupyRate = "memoryOccupyRate"; String memoryOccupyRate = "memoryOccupyRate";
String diskSpeed = "diskSpeed";
String diskModel = "diskModel";
String diskCap = "diskCap";
String diskFree = "diskFree";
String diskTemp = "diskTemp";
String ethernet = "ethernet"; String ethernet = "ethernet";
Map<String, Object> data = null; Map<String, Object> data = null;
try { try {
Sigar sigar = new Sigar(); Sigar sigar = new Sigar();
// 上报PC实时信息
String collect = Oshi4NoneSigarUtil.getDiskStoresModelFromOshi();
String collectForCheck = Oshi4NoneSigarUtil.getDiskStoresModelJsonFromOshi();
// 硬盘型号/ID变化后报警
Map<String, String> hardwareCacheRefresh = JSONUtil.toBean(collectForCheck, Map.class);
checkDiskHardware("hard_disk", hardwareCacheRefresh);
// 设备名称变更
checkFacilityName();
String collect1 = null;
String collect2 = null;
FileSystem[] diskStores;
try {
diskStores = sigar.getFileSystemList();
collect1 = Arrays.stream(diskStores)
.filter(partition -> StrUtil.isNotBlank(partition.getDevName()))
.filter(partition -> 2 == partition.getType())
.map(partition -> {
try {
FileSystemUsage usage = sigar.getFileSystemUsage(partition.getDirName());
return "\"" + StrUtil.removeSuffix(partition.getDevName(), ":\\") + "盘\":\"" +
DataSizeUtil.format(usage.getTotal() * 1024) + "\"";
} catch (SigarException e) {
log.error("SigarException: {}", e.getMessage());
}
return "";
})
.collect(Collectors.joining(",", "{", "}"));
collect2 = Arrays.stream(diskStores)
.filter(partition -> StrUtil.isNotBlank(partition.getDevName()))
.filter(partition -> 2 == partition.getType())
.map(partition -> {
try {
FileSystemUsage usage = sigar.getFileSystemUsage(partition.getDirName());
return "\"" + StrUtil.removeSuffix(partition.getDevName(), ":\\") + "盘\":\"" +
decimalFormat.format(100d * (usage.getTotal() - usage.getFree()) / usage.getTotal()) + "%\"";
} catch (SigarException e) {
log.error("SigarException: {}", e.getMessage());
}
return "";
})
.collect(Collectors.joining(",", "{", "}"));
} catch (Exception e) {
log.error("硬盘数据获取失败", e);
}
String memoryCapV = ""; String memoryCapV = "";
String diskSpeedV = "";
String diskTempV = ""; // 获取硬盘温度smart信息
String cpuModelV = ""; String cpuModelV = "";
double cpuLoadV = 0; double cpuLoadV = 0;
String memoryAvailableV = ""; String memoryAvailableV = "";
double memoryOccupyRateV = 0; double memoryOccupyRateV = 0;
double cpuTempV = 0;
double gpuTempV = 0;
String operatingSystemV = ""; String operatingSystemV = "";
String baseboardV = ""; String baseboardV = "";
String ipV = ""; String ipV = "";
...@@ -182,7 +118,6 @@ public class ApqInfoJob { ...@@ -182,7 +118,6 @@ public class ApqInfoJob {
baseboardV = Oshi4NoneSigarUtil.getBaseboardWithCache(); // 获取主板信息 缓存; baseboardV = Oshi4NoneSigarUtil.getBaseboardWithCache(); // 获取主板信息 缓存;
ipV = InetAddress.getLocalHost().getHostAddress(); ipV = InetAddress.getLocalHost().getHostAddress();
ethernetV = SigarUtil.ethernetSimple(sigar); ethernetV = SigarUtil.ethernetSimple(sigar);
diskTempV = DiskSmartUtil.getDeviceTemp();
org.hyperic.sigar.CpuInfo cpuInfo = sigar.getCpuInfoList()[0]; org.hyperic.sigar.CpuInfo cpuInfo = sigar.getCpuInfoList()[0];
cpuModelV = cpuInfo.getVendor() + " " + cpuInfo.getModel(); cpuModelV = cpuInfo.getVendor() + " " + cpuInfo.getModel();
...@@ -203,41 +138,22 @@ public class ApqInfoJob { ...@@ -203,41 +138,22 @@ public class ApqInfoJob {
memoryAvailableV = DataSizeUtil.format(mem.getUsed()) + "/" + DataSizeUtil.format(mem.getTotal()) memoryAvailableV = DataSizeUtil.format(mem.getUsed()) + "/" + DataSizeUtil.format(mem.getTotal())
+ "(" + memoryOccupyRateV + "%)"; + "(" + memoryOccupyRateV + "%)";
// OperatingSystem OS = OperatingSystem.getInstance();
operatingSystemV = Oshi4NoneSigarUtil.getOsWithCache(); operatingSystemV = Oshi4NoneSigarUtil.getOsWithCache();
// 用WMI接口读出的是CPU温度 getCpuTemperature == MSAcpiThermalZoneTemperature.queryCurrentTemperature();
// WMI接口读出的就是这个ACPI Thermal Zone的温度,是主板的温区温度,而不是CPU的温度
// 1. WMI需要BIOS支持,而很多BIOS并不支持
// 2. Thermal Zone的_TMP报告的一般是主板的某个温区,而不是CPU的温度
// 最佳实践 https://www.cnblogs.com/javawebsoa/archive/2013/05/31/3111351.html WinRing0.sys + rdmsr指令
// cpuTempV = Double.parseDouble(decimalFormat.format(OshiUtil.getSensors().getCpuTemperature()));
int[] cpuAndGpuTemp = CoreTempUtil.getCpuAndGpuTemp();
cpuTempV = cpuAndGpuTemp[0];
gpuTempV = cpuAndGpuTemp[1];
} catch (Exception e) { } catch (Exception e) {
log.error("SigarException", e); log.error("SigarException", e);
} }
diskSpeedV = SigarUtil.diskSpeed(sigar);
data = MapUtil.<String, Object>builder() data = MapUtil.<String, Object>builder()
.put(isNeedCollection(isNoneEven, operatingSystem, mapParams), operatingSystem, operatingSystemV) .put(isNeedCollection(isNoneEven, operatingSystem, mapParams), operatingSystem, operatingSystemV)
.put(isNeedCollection(isNoneEven, mac, mapParams), mac, macAddrService.getMacAddr()) .put(isNeedCollection(isNoneEven, mac, mapParams), mac, macAddrService.getMacAddr())
.put(isNeedCollection(isNoneEven, baseboard, mapParams), baseboard, baseboardV) .put(isNeedCollection(isNoneEven, baseboard, mapParams), baseboard, baseboardV)
.put(isNeedCollection(isNoneEven, ip, mapParams), ip, ipV) .put(isNeedCollection(isNoneEven, ip, mapParams), ip, ipV)
.put(isNeedCollection(isNoneEven, cpuModel, mapParams), cpuModel, cpuModelV) .put(isNeedCollection(isNoneEven, cpuModel, mapParams), cpuModel, cpuModelV)
.put(isNeedCollection(isNoneEven, cpuTemp, mapParams), cpuTemp, cpuTempV)
.put(isNeedCollection(isNoneEven, cpuLoad, mapParams), cpuLoad, cpuLoadV) .put(isNeedCollection(isNoneEven, cpuLoad, mapParams), cpuLoad, cpuLoadV)
.put(isNeedCollection(isNoneEven, gpuTemp, mapParams), gpuTemp, gpuTempV)
.put(isNeedCollection(isNoneEven, memoryCap, mapParams), memoryCap, memoryCapV) .put(isNeedCollection(isNoneEven, memoryCap, mapParams), memoryCap, memoryCapV)
.put(isNeedCollection(isNoneEven, memoryAvailable, mapParams), memoryAvailable, memoryAvailableV) .put(isNeedCollection(isNoneEven, memoryAvailable, mapParams), memoryAvailable, memoryAvailableV)
.put(isNeedCollection(isNoneEven, memoryOccupyRate, mapParams), memoryOccupyRate, memoryOccupyRateV) .put(isNeedCollection(isNoneEven, memoryOccupyRate, mapParams), memoryOccupyRate, memoryOccupyRateV)
.put(isNeedCollection(isNoneEven, diskSpeed, mapParams), diskSpeed, diskSpeedV)
.put(isNeedCollection(isNoneEven, diskTemp, mapParams), diskTemp, diskTempV)
.put(isNeedCollection(isNoneEven, diskModel, mapParams), diskModel, collect)
.put(isNeedCollection(isNoneEven, diskCap, mapParams), diskCap, collect1)
.put(isNeedCollection(isNoneEven, diskFree, mapParams), diskFree, collect2)
.put(isNeedCollection(isNoneEven, ethernet, mapParams), ethernet, ethernetV) .put(isNeedCollection(isNoneEven, ethernet, mapParams), ethernet, ethernetV)
.build(); .build();
log.info("采集数据,上报属性: mapData:{}", data); log.info("采集数据,上报属性: mapData:{}", data);
...@@ -245,117 +161,10 @@ public class ApqInfoJob { ...@@ -245,117 +161,10 @@ public class ApqInfoJob {
log.info("采集数据,上报属性: ret:{}", mapR); log.info("采集数据,上报属性: ret:{}", mapR);
} catch (Exception e) { } catch (Exception e) {
log.error("采集数据异常", e); log.error("采集数据异常", e);
data = MapUtil.<String, Object>builder().put("ERROR", e.getMessage()).build();
} }
} }
private void checkFacilityName() {
Map<String, String> map = System.getenv();
String computerName = map.get("COMPUTERNAME");// 获取计算机名
if (attrCache.isEmpty() || !StrUtil.equals(attrCache.get("FacilityName"), computerName)) {
Map<String, Object> params = new HashMap<>();
params.put("tenantId", tenantId);
params.put("productId", productId);
params.put("macAddress", macAddrService.getMacAddr());
params.put("name", computerName);
String remoteDeviceVoJson = HttpUtil.post(gateway + deviceUpdateNameUrl, JSONUtil.toJsonStr(params), 5000);
RemoteDeviceVoResult remoteDeviceVo = JSONUtil.toBean(remoteDeviceVoJson, RemoteDeviceVoResult.class);
if (remoteDeviceVo.getCode() == 0) {
attrCache.put("FacilityName", computerName);
}
}
}
/**
* 硬盘型号/ID变化后报警
* + 其他
*
* @param type 类型
* @param hardwareCacheRefresh
*/
private void checkDiskHardware(String type, Map<String, String> hardwareCacheRefresh) {
try {
if (hardwareCache.isEmpty()) {
// 获取采集到的硬件信息
ResponseEntity<MqttRpcDataMessage> forEntity = null;
try {
forEntity = restTemplate.getForEntity("http://localhost:8765/rpc_cmd/hardware_warning", MqttRpcDataMessage.class);
if (null != forEntity) {
MqttRpcDataMessage body = forEntity.getBody();
String params = body.getParams();
if (StrUtil.isNotBlank(params)) {
Map<String, Map<String, String>> hardwareCacheFromPersistence = JSONUtil.toBean(params, Map.class);
hardwareCache.putAll(hardwareCacheFromPersistence);
}
}
} catch (Exception e) {
log.error("采集数据异常", e);
}
}
Map<String, String> hardwareCache4ThisTypeMap = hardwareCache.get(type);
if (null != hardwareCache4ThisTypeMap && !hardwareCache4ThisTypeMap.isEmpty()) {
// 上报硬件监控数据
Map mapRequest = new HashMap();
hardwareCacheRefresh.forEach((k, v) -> {
if (!hardwareCache4ThisTypeMap.containsValue(v)) {
Map mapRequestDetail = new HashMap();
mapRequestDetail.put("name", k);
mapRequestDetail.put("value", v);
mapRequestDetail.put("type", "Add");
mapRequest.put(k, mapRequestDetail);
}
});
hardwareCache4ThisTypeMap.forEach((k, v) -> {
if (!hardwareCacheRefresh.containsValue(v)) {
Map mapRequestDetail = new HashMap();
mapRequestDetail.put("name", k);
mapRequestDetail.put("value", v);
mapRequestDetail.put("type", "Reduce");
mapRequest.put(k, mapRequestDetail);
}
});
if (!mapRequest.isEmpty()) {
mapRequest.put("type", type);
Map eventMapRequest = new HashMap();
eventMapRequest.put("requestId", 5);
eventMapRequest.put("methodName", "hardware_warning");
eventMapRequest.put("params", mapRequest);
Map map = restTemplate.postForObject("http://localhost:8765/uplink_event/oc-client", eventMapRequest, Map.class);
log.info("存在硬件扫描告警,上报告警事件: mapData:{}, ret:{}", mapRequest, map);
hardwareCache.put(type, hardwareCacheRefresh);
// 更新采集到的硬件信息
try {
MqttRpcDataMessage mqttRpcDataMessage = MqttRpcDataMessage.builder()
.sendTime(System.currentTimeMillis())
.method("hardware_warning")
.params(JSONUtil.toJsonStr(hardwareCache)).build();
restTemplate.postForObject("http://localhost:8765/rpc_cmd", mqttRpcDataMessage, String.class);
} catch (Exception e) {
log.error("采集数据异常", e);
}
}
} else {
hardwareCache.put(type, hardwareCacheRefresh);
// 更新采集到的硬件信息
try {
MqttRpcDataMessage mqttRpcDataMessage = MqttRpcDataMessage.builder()
.sendTime(System.currentTimeMillis())
.method("hardware_warning")
.params(JSONUtil.toJsonStr(hardwareCache)).build();
restTemplate.postForObject("http://localhost:8765/rpc_cmd", mqttRpcDataMessage, String.class);
} catch (Exception e) {
log.error("采集数据异常", e);
}
}
} catch (RestClientException e) {
log.error("硬盘型号/ID变化后报警异常");
}
}
private boolean isNeedCollection(boolean isNoneEven, String key, Map<String, Integer> mapParams) { private boolean isNeedCollection(boolean isNoneEven, String key, Map<String, Integer> mapParams) {
if (null != mapParams && mapParams.containsKey(key)) { if (null != mapParams && mapParams.containsKey(key)) {
...@@ -363,115 +172,4 @@ public class ApqInfoJob { ...@@ -363,115 +172,4 @@ public class ApqInfoJob {
} }
return isNoneEven; return isNoneEven;
} }
public static void main2(String[] args) throws InterruptedException, SigarException {
/*String data = "[" +
"{\"code\":\"cpuLoad\",\"name\":\"CPU负载\",\"frequency\":30}," +
"{\"code\":\"cpuTemp\",\"name\":\"CPU温度\",\"frequency\":30}," +
"{\"code\":\"mac\",\"name\":\"MAC地址\",\"frequency\":30}," +
"{\"code\":\"memoryCap\",\"name\":\"内存容量\",\"frequency\":30}," +
"{\"code\":\"diskCap\",\"name\":\"硬盘容量\",\"frequency\":30}," +
"{\"code\":\"diskModel\",\"name\":\"硬盘型号\",\"frequency\":60}," +
"]";
List<ApqInfoDataVo> apqInfoDataVoss = new ArrayList<>();
ApqInfoDataVo apqInfoDataVo = new ApqInfoDataVo();
apqInfoDataVo.setCode("diskModel");
apqInfoDataVo.setName("硬盘型号");
apqInfoDataVo.setFrequency(60);
apqInfoDataVoss.add(apqInfoDataVo);
ApqInfoDataVo apqInfoDataVo2 = new ApqInfoDataVo();
apqInfoDataVo2.setCode("memoryCap");
apqInfoDataVo2.setName("内存容量");
apqInfoDataVo2.setFrequency(30);
apqInfoDataVoss.add(apqInfoDataVo2);
String s = JSONUtil.toJsonStr(apqInfoDataVoss);
System.out.println(s);
List<ApqInfoDataVo> apqInfoDataVos = JSONUtil.toList(data, ApqInfoDataVo.class);
List<Map> apqInfoDataVos2 = JSONUtil.toList(data, Map.class);*/
// System.out.println(OshiUtil.getSensors().getCpuTemperature());
// System.out.println(OshiUtil.getHardware().getDiskStores()[0].getModel());
// System.out.println(DataSizeUtil.format(OshiUtil.getHardware().getDiskStores()[0].getReads()));
//System.out.println("CPU内存使用率:" + new DecimalFormat("#.##%").format((OshiUtil.getMemory().getAvailable() * 1.0 / OshiUtil.getMemory().getTotal())));
/*while (true) {
//System.out.println("CPU负载:" + new DecimalFormat("#.##%").format(OshiUtil.getCpuInfo().getUsed() / 100));
//System.out.println("硬盘剩余:" + OshiUtil.getHardware().getDiskStores()[0].getWriteBytes());
System.out.println(getCpuUsed());
Thread.sleep(3);
}*/
}
public static double getCpuUsed() {
/*SystemInfo systemInfo = new SystemInfo();
CentralProcessor processor = systemInfo.getHardware().getProcessor();
long[] prevTicks = processor.getSystemCpuLoadTicks();
long[] ticks = processor.getSystemCpuLoadTicks();
long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];
long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
long cSys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;
//System.out.println("----------------cpu信息----------------");
//System.out.println("cpu核数:" + processor.getLogicalProcessorCount());
//System.out.println("cpu系统使用率:" + new DecimalFormat("#.##%").format(cSys * 1.0 / totalCpu));
//System.out.println("cpu用户使用率:" + new DecimalFormat("#.##%").format(user * 1.0 / totalCpu));
//System.out.println("cpu当前等待率:" + new DecimalFormat("#.##%").format(iowait * 1.0 / totalCpu));
//System.out.println("cpu当前使用率:" + new DecimalFormat("#.##%").format(1.0-(idle * 1.0 / totalCpu)));
return new BigDecimal((1.0 - (idle * 1.0 / totalCpu)) * 100).setScale(2, BigDecimal.ROUND_DOWN).doubleValue();*/
CpuInfo cpuInfo = OshiUtil.getCpuInfo(100);
double used = Double.parseDouble(new DecimalFormat("#.00").format(100 - cpuInfo.getFree()));
return Math.min(Math.max(used, 0), 100);
}
private static void printDisks(List<HWDiskStore> list) {
System.out.println("Disks:");
for (HWDiskStore disk : list) {
boolean readwrite = disk.getReads() > 0 || disk.getWrites() > 0;
System.out.format(" %s: (model: %s - S/N: %s) size: %s, reads: %s (%s), writes: %s (%s), xfer: %s ms%n",
disk.getName(), disk.getModel(), disk.getSerial(),
disk.getSize() > 0 ? FormatUtil.formatBytesDecimal(disk.getSize()) : "?",
readwrite ? disk.getReads() : "?", readwrite ? FormatUtil.formatBytes(disk.getReadBytes()) : "?",
readwrite ? disk.getWrites() : "?", readwrite ? FormatUtil.formatBytes(disk.getWriteBytes()) : "?",
readwrite ? disk.getTransferTime() : "?");
HWPartition[] partitions = disk.getPartitions();
if (partitions == null) {
// TODO Remove when all OS's implemented
continue;
}
for (HWPartition part : partitions) {
System.out.format(" |-- %s: %s (%s) Maj:Min=%d:%d, size: %s%s%n", part.getIdentification(),
part.getName(), part.getType(), part.getMajor(), part.getMinor(),
FormatUtil.formatBytesDecimal(part.getSize()),
part.getMountPoint().isEmpty() ? "" : " @ " + part.getMountPoint());
}
}
}
public static void main(String[] args) throws SigarException {
Sigar sigar = new Sigar();
// System.out.println(sigar.getCpu().toString());
// org.hyperic.sigar.CpuInfo cpuInfo = sigar.getCpuInfoList()[0];
// String cpuModelV = cpuInfo.getVendor() + " " + cpuInfo.getModel();
// System.out.println(cpuModelV);
Mem mem = sigar.getMem();
String memoryAvailableV = FormatUtil.formatBytesDecimal(mem.getFree()) + "/" + FormatUtil.formatBytesDecimal(mem.getTotal())
+ "(" + Double.parseDouble(new DecimalFormat("#.00").format(mem.getFree() * 1.0 / mem.getTotal() * 100)) + ")";
System.out.println(mem.getFree() * 1.0 / mem.getTotal());
System.out.println(memoryAvailableV);
}
} }
package com.priusis.utils;
import cn.hutool.system.oshi.OshiUtil;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.ptr.IntByReference;
import java.util.Arrays;
/**
* Java通过JNA调用CoreTemp.dll实现温度采集 方式1
* https://github.com/boyang987/BLHWScaner
*/
public class CoreTemp1Util {
static final String coreFromOs = "CoreTemp" + (OshiUtil.getOs().getBitness() == 64 ? "x64" : "");
static final String WR0_DLL_NAME = ParseUrlUtil.parseAbsolutePath("/core/" + coreFromOs + ".dll", System.getProperty("user.dir") + "/apq-pc-common");
static CoreTemp WR0_INSTANCE = Native.loadLibrary(WR0_DLL_NAME, CoreTemp.class);
/**
* 获取cpu温度
*
* @return
*/
public static boolean GetCpuTemp(IntByReference cpuCoreNum, int[] cpuTemp) {
return WR0_INSTANCE.GetCpuTemp(cpuCoreNum, cpuTemp);
}
/**
* 获取gpu温度
*
* @return
*/
public static boolean GetGpuTemp(IntByReference pSensorNum, int[] gpuTemp) {
return WR0_INSTANCE.GetGpuTemp(pSensorNum, gpuTemp);
}
/**
* CPU温度
*/
public static int getCpuTemp() throws Exception {
IntByReference cpuCoreNum = new IntByReference(0);
int[] cpuTemp = new int[64];
CoreTemp1Util.GetCpuTemp(cpuCoreNum, cpuTemp);
return Arrays.stream(cpuTemp).max().getAsInt();
}
/**
* GPU温度
*/
public static int getGpuTemp() throws Exception {
IntByReference pSensorNum = new IntByReference(0);
int[] gpuTemp = new int[64];
CoreTemp1Util.GetGpuTemp(pSensorNum, gpuTemp);
return Arrays.stream(gpuTemp).max().getAsInt();
}
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// while (true) {
IntByReference cpuCoreNum = new IntByReference(0);
int[] cpuTemp = new int[64];
//WinRing0初始化
CoreTemp1Util.GetCpuTemp(cpuCoreNum, cpuTemp);
// int value = cpuCoreNum.getValue();
// System.out.println(value);
// for (int i = 0; i < value; i++) {
// System.out.println(cpuTemp[i]);
// }
IntByReference pSensorNum = new IntByReference(0);
int[] gpuTemp = new int[64];
CoreTemp1Util.GetGpuTemp(pSensorNum, gpuTemp);
System.out.println("CPU温度:" + Arrays.stream(cpuTemp).max().getAsInt()); // cpu温度
System.out.println("GPU温度:" + Arrays.stream(gpuTemp).max().getAsInt()); // gpu温度
System.out.println("===============================");
// Thread.sleep(1500);
// }
}
private interface CoreTemp extends Library {
// 声明将要调用的DLL中的方法
boolean GetCpuTemp(IntByReference cpuCoreNum, int[] cpuTemp);
boolean GetGpuTemp(IntByReference pSensorNum, int[] gpuTemp);
}
}
package com.priusis.utils;
import com.sun.jna.NativeLibrary;
import com.sun.jna.ptr.IntByReference;
import lombok.extern.slf4j.Slf4j;
import java.util.Arrays;
/**
* Java通过JNA调用CoreTemp.dll实现温度采集
* https://github.com/boyang987/BLHWScaner
*/
@Slf4j
public class CoreTempUtil {
// static final String coreFromOs = "CoreTemp" + (OshiUtil.getOs().getBitness() == 64 ? "x64" : "");
// static final String WR0_DLL_NAME = ParseUrlUtil.parseAbsolutePath("/core/" + coreFromOs + ".dll", System.getProperty("user.dir") + "/apq-pc-common");
static final String WR0_DLL_NAME = ParseUrlUtil.parseAbsolutePath("/core/CoreTemp.dll", System.getProperty("user.dir") + "/apq-pc-common");
/**
* CPU温度
*/
public static int[] getCpuAndGpuTemp() throws Exception {
NativeLibrary instance = null;
int[] cpuAndGpuTemp = new int[2];
try {
instance = NativeLibrary.getInstance(WR0_DLL_NAME);
IntByReference cpuCoreNum = new IntByReference(0);
int[] cpuTemp = new int[64];
int[] gpuTemp = new int[64];
//WinRing0初始化
instance.getFunction("GetCpuTemp").invoke(new Object[]{cpuCoreNum, cpuTemp});
int cpuTempV = Arrays.stream(cpuTemp).max().getAsInt();
instance.getFunction("GetGpuTemp").invoke(new Object[]{cpuCoreNum, gpuTemp});
int gpuTempV = Arrays.stream(gpuTemp).max().getAsInt();
cpuAndGpuTemp[0] = cpuTempV;
cpuAndGpuTemp[1] = gpuTempV;
return cpuAndGpuTemp;
} catch (Throwable e) {
log.error("获取CPU温度异常", e);
cpuAndGpuTemp[0] = 0;
cpuAndGpuTemp[1] = 0;
return cpuAndGpuTemp;
} finally {
if (null != instance) {
WinRing0Util.doDeinitializeOls();
instance.dispose();
instance = null;
}
}
}
/**
* CPU温度
*/
public static int getCpuTemp() throws Exception {
NativeLibrary instance = null;
try {
instance = NativeLibrary.getInstance(WR0_DLL_NAME);
IntByReference cpuCoreNum = new IntByReference(0);
int[] cpuTemp = new int[64];
//WinRing0初始化
instance.getFunction("GetCpuTemp").invoke(new Object[]{cpuCoreNum, cpuTemp});
return Arrays.stream(cpuTemp).max().getAsInt();
} catch (Exception e) {
log.error("获取CPU温度异常", e);
return 0;
} finally {
if (null != instance) {
WinRing0Util.doDeinitializeOls();
instance.dispose();
instance = null;
System.gc();
}
}
}
/**
* GPU温度
*/
public static int getGpuTemp() throws Exception {
NativeLibrary instance = null;
try {
instance = NativeLibrary.getInstance(WR0_DLL_NAME);
IntByReference pSensorNum = new IntByReference(0);
int[] gpuTemp = new int[64];
instance.getFunction("GetGpuTemp").invoke(new Object[]{pSensorNum, gpuTemp});
return Arrays.stream(gpuTemp).max().getAsInt();
} catch (Exception e) {
log.error("GPU温度", e);
return 0;
} finally {
if (null != instance) {
WinRing0Util.doDeinitializeOls();
instance.dispose();
instance = null;
}
}
}
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
/*while (true) {
NativeLibrary instance = NativeLibrary.getInstance(WR0_DLL_NAME);
IntByReference cpuCoreNum = new IntByReference(0);
int[] cpuTemp = new int[64];
//WinRing0初始化
instance.getFunction("GetCpuTemp").invoke(new Object[]{cpuCoreNum, cpuTemp});
int value = cpuCoreNum.getValue();
System.out.println(value);
for (int i = 0; i < value; i++) {
System.out.println(cpuTemp[i]);
}
IntByReference pSensorNum = new IntByReference(0);
int[] gpuTemp = new int[64];
instance.getFunction("GetGpuTemp").invoke(new Object[]{pSensorNum, gpuTemp});
System.out.println("CPU温度:" + Arrays.stream(cpuTemp).max().getAsInt()); // cpu温度
System.out.println("GPU温度:" + Arrays.stream(gpuTemp).max().getAsInt()); // gpu温度
instance.dispose();
System.out.println("===============================");
Thread.sleep(1500);
}*/
while (true) {
int[] cpuAndGpuTemp = CoreTempUtil.getCpuAndGpuTemp();
System.out.println(cpuAndGpuTemp[0]);
System.out.println(cpuAndGpuTemp[1]);
System.out.println("===============================");
Thread.sleep(1500);
}
}
}
package com.priusis.utils;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import oshi.util.FormatUtil;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
/**
* smartctl
* https://www.smartmontools.org/
*/
@Slf4j
public class DiskSmartUtil {
static final String SMARTCTL_EXE_PATH = ParseUrlUtil.parseAbsolutePath("/core/smartctl.exe", System.getProperty("user.dir") + "/apq-pc-client");
/**
* 获取硬盘温度smart信息
*
* @return
* @throws IOException
*/
public static Map<String, String> getDiskInfoFromSmart() throws IOException {
Map<String, String> result = new HashMap<>();
Process process = null;
String smartScan = "";
try {
process = Runtime.getRuntime().exec(SMARTCTL_EXE_PATH + " --scan -j"); // AHCI ATA NVMe https://blog.csdn.net/u012459957/article/details/51226658
try (InputStream inputStream = process.getInputStream()) {
smartScan = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
}
int index = 0;
JSONArray devices = JSONUtil.parseObj(smartScan).getJSONArray("devices");
List<String> deviceDataEList = new ArrayList<>();
for (int i = 0; i < devices.size(); i++) {
String name = devices.getJSONObject(i).getStr("name");
process = Runtime.getRuntime().exec(SMARTCTL_EXE_PATH + " -A -i " + name + " -j");
String smartctlAinfo = "";
try (InputStream inputStream = process.getInputStream()) {
smartctlAinfo = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
}
JSONObject smartctlInfoJsonObject = JSONUtil.parseObj(smartctlAinfo);
JSONObject temperature = smartctlInfoJsonObject.getJSONObject("temperature");
String diskTemp = "?";
if (null != temperature) {
diskTemp = temperature.getInt("current") + "";
}
String serialNumber = smartctlInfoJsonObject.getStr("serial_number");
String modelName = smartctlInfoJsonObject.getStr("model_name");
if (!deviceDataEList.contains(modelName)) {
StringBuffer sb = new StringBuffer();
String diskType = "";
if (smartctlAinfo.contains("HHD") || smartctlAinfo.contains("Head_Flying_Hours") || smartctlAinfo.contains("Load_Cycle_Count")) {
diskType = "机械硬盘";
} else if (smartctlAinfo.contains("SSD") || smartctlAinfo.contains("Solid State Device")) {
diskType = "固态硬盘";
}
sb.append("{");
sb.append("\"diskTemp\":\"").append(diskTemp).append("\",");
sb.append("\"diskType\":\"").append(diskType).append("\",");
sb.append("\"serialNumber\":\"").append(serialNumber).append("\"");
sb.append("}");
deviceDataEList.add(modelName);
result.put(modelName, sb.toString());
}
}
} catch (Exception e) {
log.error("获取硬盘smart信息异常", e);
}
if (null != process && process.isAlive()) {
process.destroy();
}
return result;
}
public static String getDeviceTemp() {
try {
Map<String, String> diskInfoFromSmartMap = DiskSmartUtil.getDiskInfoFromSmart();
StringBuilder sb = new StringBuilder();
for (String key : diskInfoFromSmartMap.keySet()) {
JSONObject diskInfoFromJson = JSONUtil.parseObj(diskInfoFromSmartMap.get(key));
String diskTemp = diskInfoFromJson.getStr("diskTemp");
if (!StrUtil.equals("?", diskTemp)) {
sb.append(key).append(":").append(diskTemp).append("℃");
sb.append(",");
}
}
return sb.substring(0, sb.length() - 1);
} catch (IOException e) {
log.error("获取硬盘温度smart信息异常", e);
}
return "";
}
public static void main(String[] args) throws IOException {
Map<String, String> diskInfoFromSmartMap = DiskSmartUtil.getDiskInfoFromSmart();
System.out.println(diskInfoFromSmartMap);
StringBuilder sb = new StringBuilder();
for (String key : diskInfoFromSmartMap.keySet()) {
JSONObject diskInfoFromJson = JSONUtil.parseObj(diskInfoFromSmartMap.get(key));
sb.append(key).append(":").append(diskInfoFromJson.getStr("diskTemp")).append("℃");
sb.append(",");
}
System.out.println(sb.substring(0, sb.length() - 1).toString());
}
}
package com.priusis.utils; package com.priusis.utils;
import cn.hutool.core.util.StrUtil;
import cn.hutool.system.oshi.OshiUtil; import cn.hutool.system.oshi.OshiUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.hyperic.sigar.SigarException;
import oshi.hardware.HWDiskStore;
import oshi.software.os.OperatingSystem; import oshi.software.os.OperatingSystem;
import oshi.util.FormatUtil;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j @Slf4j
public class Oshi4NoneSigarUtil { public class Oshi4NoneSigarUtil {
...@@ -33,63 +25,4 @@ public class Oshi4NoneSigarUtil { ...@@ -33,63 +25,4 @@ public class Oshi4NoneSigarUtil {
return os; return os;
} }
public static String getDiskStoresModelFromOshi() {
try {
HWDiskStore[] diskStoresFromOshi = OshiUtil.getHardware().getDiskStores();
// ADATA_IMSS314-128GM(128GB/固态硬盘)
Map<String, String> diskInfoFromSmartMap = DiskSmartUtil.getDiskInfoFromSmart();
diskStoresModel = Arrays.stream(diskStoresFromOshi)
.map(diskStoreFromOshi -> StrUtil.removeSuffix(StrUtil.removeSuffix(diskStoreFromOshi.getModel(), " (标准磁盘驱动器)"), " (Standard disk drives)")
+ "("
+ FormatUtil.formatBytesDecimal(diskStoreFromOshi.getSize())
+ diskTypeFromSmart(diskInfoFromSmartMap, StrUtil.removeSuffix(StrUtil.removeSuffix(diskStoreFromOshi.getModel(), " (标准磁盘驱动器)"), " (Standard disk drives)"))
+ ")")
.collect(Collectors.joining(","));
} catch (Exception e) {
log.error("硬盘型号数据获取失败", e);
}
return diskStoresModel;
}
public static String getDiskStoresModelJsonFromOshi() {
try {
HWDiskStore[] diskStoresFromOshi = OshiUtil.getHardware().getDiskStores();
// {"PHYSICALDRIVE0":"BIWIN SSD (Standard disk drives)(1904051301056)"}
diskStoresModel = Arrays.stream(diskStoresFromOshi)
.map(diskStoreFromOshi -> "\"" + diskStoreFromOshi.getName().replace("\\\\.\\", "") + "\":\"" +
StrUtil.removeSuffix(diskStoreFromOshi.getModel(), " (标准磁盘驱动器)") + "(" + diskStoreFromOshi.getSerial().trim() + ")\"")
.collect(Collectors.joining(",", "{", "}"));
} catch (Exception e) {
log.error("硬盘型号数据获取失败", e);
}
return diskStoresModel;
}
public static String diskTypeFromSmart(Map<String, String> diskInfoFromSmartMap, String diskModel) {
String diskInfoFromSmart = diskInfoFromSmartMap.get(diskModel);
String diskType = "/固态硬盘";
if (null != diskInfoFromSmart) {
if (diskInfoFromSmart.contains("机械硬盘")) {
diskType = "/机械硬盘";
} else if (diskInfoFromSmart.contains("固态硬盘")) {
diskType = "/固态硬盘";
}
}
return diskType;
}
public static void main(String[] args) throws SigarException {
// System.out.println(Oshi4NoneSigarUtil.getDiskStoresModelFromOshi());
/*Sigar sigar = new Sigar();
FileSystem[] diskStores = sigar.getFileSystemList();
for (FileSystem diskStore : diskStores) {
System.out.println(diskStore.getSysTypeName());
}*/
System.out.println(getDiskStoresModelJsonFromOshi());
}
} }
package com.priusis.utils;
import cn.hutool.system.oshi.OshiUtil;
import com.sun.jna.Library;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j;
/**
* CreatProcess
*/
@Slf4j
public class ProcessExtensionsApqUtil {
// static final String CP_DLL_NAME = ParseUrlUtil.parseAbsolutePath("/core/apq_CreatProcess" + (OshiUtil.getOs().getBitness() == 64 ? "x64" : "") + ".dll", System.getProperty("user.dir") + "/apq-pc-common");
static final String CP_DLL_NAME = ParseUrlUtil.parseAbsolutePath("/core/apq_CreatProcess.dll", System.getProperty("user.dir") + "/apq-pc-common");
static ProcessExtensionsApq CP_API_INSTANCE = Native.loadLibrary(CP_DLL_NAME, ProcessExtensionsApq.class);
/**
* 获取gpu温度
*
* @return
*/
public static int apq_CreateProcessAsUser(String pNameStr) {
int i = 0;
try {
log.info("=============================== s {}", pNameStr);
Pointer pName = new Memory(pNameStr.length() + 1); // WARNING: assumes ascii-only string
pName.setString(0, pNameStr);
i = CP_API_INSTANCE.apq_CreateProcessAsUser(pName);
log.info("=============================== e" + i);
} catch (Exception e) {
log.error("apq_CreateProcessAsUser error", e);
}
return i;
}
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String pNameStr = "C:\\windows\\notepad.exe D:\\info.log";
ProcessExtensionsApqUtil.apq_CreateProcessAsUser(pNameStr);
}
private interface ProcessExtensionsApq extends Library {
// 声明将要调用的DLL中的方法
int apq_CreateProcessAsUser(Pointer pName);
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论