Browse Source

update

master
zhaohe 1 day ago
parent
commit
060fdd7a44
  1. 2
      sh/deploy_ui.bat
  2. 4
      src/main/java/a8k/BoditechA800Application.java
  3. 44
      src/main/java/a8k/OS.java
  4. 2
      src/main/java/a8k/app/constant/AppVersion.java
  5. 5
      src/main/java/a8k/app/dao/type/db/NetworkSetting.java
  6. 4
      src/main/java/a8k/app/iflytophald/channel/PrinterUartCommunicationChannel.java
  7. 26
      src/main/java/a8k/app/service/appsetup/AppEnvInitializer.java
  8. 27
      src/main/java/a8k/app/service/appsetup/AppSetupInitializer.java
  9. 13
      src/main/java/a8k/app/service/background/ProjIDCardCtrlAndMonitorService.java
  10. 80
      src/main/java/a8k/app/service/os/OSNetworkMgrService.java
  11. 20
      src/main/resources/application.yml

2
sh/deploy_ui.bat

@ -0,0 +1,2 @@
ssh root@192.168.8.10 "rm -rf /app/appresource/static"
scp -r .\appresource\static root@192.168.8.10://app/appresource/

4
src/main/java/a8k/BoditechA800Application.java

@ -1,6 +1,7 @@
package a8k;
import a8k.app.service.appsetup.AppSetupInitializer;
import a8k.app.service.background.AppEventBusService;
import a8k.app.type.DeviceRunMode;
import a8k.app.type.appevent.AppEvent;
@ -34,6 +35,9 @@ public class BoditechA800Application implements ApplicationListener<ContextRefre
public void onApplicationEvent(ContextRefreshedEvent event) {
log.info("Springboot加载完成");
AppSetupInitializer appSetupInitializer = event.getApplicationContext().getBean(AppSetupInitializer.class);
appSetupInitializer.initOnSetup();
AppEventBusService eventBusService = event.getApplicationContext().getBean(AppEventBusService.class);
eventBusService.pushEvent(new SpringbootLoadingCompletedEvent());

44
src/main/java/a8k/OS.java

@ -57,34 +57,44 @@ public class OS {
return os.contains("windows");
}
public static LinuxCommandResult executeLinuxCommand(String command, long timeout, TimeUnit unit)
throws IOException, InterruptedException {
Long enterTimestamp = getMonotonicClockTimestamp();
var result = priExecuteLinuxCommand(command, timeout, unit);
Long exitTimestamp = getMonotonicClockTimestamp();
log.info("Exec: {}, 耗时: {} ms", command, (exitTimestamp - enterTimestamp));
return result;
}
private static LinuxCommandResult priExecuteLinuxCommand(String command, long timeout, TimeUnit unit)
throws IOException, InterruptedException {
if (isRunOnWindows()) {
log.info("当前操作系统为Windows,无法执行Linux命令: {}", command);
return new LinuxCommandResult(-1, "当前操作系统为Windows,无法执行Linux命令: " + command);
}
ProcessBuilder builder = new ProcessBuilder("/bin/bash", "-c", command);
builder.redirectErrorStream(true);
// builder.redirectErrorStream(true);
Process process = builder.start();
// 读取输出
StringBuilder output = new StringBuilder();
try (InputStream inputStream = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
String line;
while ((line = reader.readLine()) != null) {
output.append(line).append("\n");
}
}
// StringBuilder output = new StringBuilder();
// try (InputStream inputStream = process.getInputStream();
// BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
// String line;
// while ((line = reader.readLine()) != null) {
// output.append(line).append("\n");
// }
// }
// 等待命令完成带超时
boolean completed = process.waitFor(timeout, unit);
if (!completed) {
process.destroyForcibly();
throw new InterruptedException("命令执行超时");
}
return new LinuxCommandResult(process.exitValue(), output.toString());
// return new LinuxCommandResult(process.exitValue(), output.toString());
return new LinuxCommandResult(process.exitValue(), "");
}
static public String getEthName() {
@ -96,7 +106,7 @@ public class OS {
return "192.168.8.10";
}
// var all = NetworkInterface.getNetworkInterfaces();
// var all = NetworkInterface.getNetworkInterfaces();
NetworkInterface networkInterface = null;
@ -108,8 +118,7 @@ public class OS {
}
if (networkInterface == null) {
log.warn("未找到网卡: {}", getEthName());
return "";
return "-";
}
try {
@ -126,7 +135,7 @@ public class OS {
while (inetAddresses.hasMoreElements()) {
InetAddress inetAddress = inetAddresses.nextElement();
if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
// log.info("找到网卡 {} 的IPv4地址: {}", getEthName(), inetAddress.getHostAddress());
// log.info("找到网卡 {} 的IPv4地址: {}", getEthName(), inetAddress.getHostAddress());
return inetAddress.getHostAddress();
}
}
@ -142,6 +151,11 @@ public class OS {
return System.nanoTime() / 1_000_000; // 转换为毫秒
}
public static long getPowerOnTimestamp() {
// 这里假设电源开启时间是系统启动时间
return getMonotonicClockTimestamp();
}
public static boolean monotonicClockHasElapsed(long startTimestamp, long durationMillis) {
return (getMonotonicClockTimestamp() - startTimestamp) >= durationMillis;
}

2
src/main/java/a8k/app/constant/AppVersion.java

@ -1,5 +1,5 @@
package a8k.app.constant;
public class AppVersion {
public static final String APP_VERSION = "B80.CN.01.00.12";
public static final String APP_VERSION = "B80.CN.01.00.14";
}

5
src/main/java/a8k/app/dao/type/db/NetworkSetting.java

@ -1,6 +1,7 @@
package a8k.app.dao.type.db;
import a8k.app.dao.type.NetworkMode;
import a8k.app.utils.ZJsonHelper;
import a8k.app.utils.ZList;
import java.io.Serializable;
@ -28,4 +29,8 @@ public class NetworkSetting implements Serializable {
public StaticIPConfig staticIPConfig = new StaticIPConfig();
public DynamicIpConfig dynamicIpConfig = new DynamicIpConfig();
public String toString() {
return ZJsonHelper.objectToJson(this);
}
}

4
src/main/java/a8k/app/iflytophald/channel/PrinterUartCommunicationChannel.java

@ -93,7 +93,9 @@ public class PrinterUartCommunicationChannel {
private void onOpen(ServerHandshake serverHandshake) {
log.info("a8k canbus connect sucess");
log.info("a8k iflytophald connect success");
}
private void onMessage(String s) {

26
src/main/java/a8k/app/service/appsetup/AppEnvInitializer.java

@ -1,26 +0,0 @@
package a8k.app.service.appsetup;
import a8k.OS;
import a8k.app.service.os.OSDeviceInfoMgrService;
import a8k.app.service.statemgr.GStateMgrService;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
@RequiredArgsConstructor
public class AppEnvInitializer {
private final GStateMgrService gStateMgrService;
@PostConstruct
void init() {
log.info("AppEnvInitializer init");
// gStateMgrService.setSn(osDeviceInfoMgrService.readSN());
// gStateMgrService.setAssetId(osDeviceInfoMgrService.readAssetId());
gStateMgrService.setDeviceInited(false);
// 其他初始化逻辑
log.info("AppEnvInitializer init completed");
}
}

27
src/main/java/a8k/app/service/appsetup/AppSetupInitializer.java

@ -0,0 +1,27 @@
package a8k.app.service.appsetup;
import a8k.app.service.background.AppEventBusService;
import a8k.app.service.background.ProjIDCardCtrlAndMonitorService;
import a8k.app.service.os.OSNetworkMgrService;
import a8k.app.service.statemgr.GStateMgrService;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
@RequiredArgsConstructor
public class AppSetupInitializer {
private final GStateMgrService gStateMgrService;
private final OSNetworkMgrService networkMgrService;
private final ProjIDCardCtrlAndMonitorService projIDCardCtrlAndMonitorService;
public void initOnSetup() {
log.info("AppSetupInitializer init");
gStateMgrService.setDeviceInited(false);
projIDCardCtrlAndMonitorService.initWhenSetup();
log.info("AppEnvInitializer init completed");
}
}

13
src/main/java/a8k/app/service/background/ProjIDCardCtrlAndMonitorService.java

@ -52,6 +52,13 @@ public class ProjIDCardCtrlAndMonitorService {
return mountedIdCardInfo;
}
public void initWhenSetup() {
if (idCardStatus()) {
log.info("ID卡读卡器在线");
workQueue.addTask(() -> this.readIDCard(false));
}
}
//
// VIRTUAL
@ -91,14 +98,10 @@ public class ProjIDCardCtrlAndMonitorService {
eventBus.pushEvent(new AppIDCardUnmountEvent());
log.info("拔出ID卡");
}
} else if (event instanceof SpringbootLoadingCompletedEvent) {
if (idCardStatus()) {
log.info("ID卡读卡器在线");
workQueue.addTask(() -> this.readIDCard(false));
}
}
}
private void readIDCard(boolean pushMountEvent) {
//读取ID卡信息
byte[] data = null;

80
src/main/java/a8k/app/service/os/OSNetworkMgrService.java

@ -24,27 +24,56 @@ import java.util.concurrent.TimeUnit;
@Slf4j
@RequiredArgsConstructor
@EnableScheduling
public class OSNetworkMgrService implements ApplicationListener<ContextRefreshedEvent> {
public class OSNetworkMgrService {
private final NetworkSettingDao networkSettingDao;
private final GStateMgrService gStateMgrService;
private boolean networkSettingIsLoading = false;
private final Object updateNetConfigLock = new Object();
public NetworkSetting getNetworkSetting() {
return networkSettingDao.get();
}
/**
* 在应用启动时设置网络配置
*/
private void initNetwork() {
synchronized (updateNetConfigLock) {
if (networkSettingIsLoading) {
return;
}
if (OS.isRunOnWindows()) {
networkSettingIsLoading = true;
return;
}
NetworkSetting setting = networkSettingDao.get();
try {
doSetNetworkSetting(setting);
} catch (Exception e) {
log.error("setting network failed: {}", e.getMessage());
return;
}
networkSettingIsLoading = true;
}
}
public void setNetworkSetting(NetworkSetting setting) throws AppException {
log.info("Setting network configuration: {}", setting);
try {
doSetNetworkSetting(setting);
} catch (NetSettingIllegalException e) {
throw AppException.of(A8kEcode.NETWORK_PARAMETER_ERROR, e.getMessage());
} catch (IOException e) {
throw AppException.of(A8kEcode.CODEERROR, e.getMessage());
synchronized (updateNetConfigLock) {
log.info("Setting network configuration: {}", setting);
try {
doSetNetworkSetting(setting);
} catch (NetSettingIllegalException e) {
throw AppException.of(A8kEcode.NETWORK_PARAMETER_ERROR, e.getMessage());
} catch (IOException e) {
throw AppException.of(A8kEcode.CODEERROR, e.getMessage());
}
networkSettingDao.update(setting);
log.info("Network configuration updated: {}", setting);
networkSettingIsLoading = true;
}
networkSettingDao.update(setting);
log.info("Network configuration updated: {}", setting);
}
public void doSetNetworkSetting(NetworkSetting setting) throws NetSettingIllegalException, IOException, AppException {
@ -73,6 +102,7 @@ public class OSNetworkMgrService implements ApplicationListener<ContextRefreshed
try {
OS.executeLinuxCommand("netplan apply", 5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
throw new AppException(A8kEcode.SYS_CMD_EXEC_OVERTIME);
}
@ -82,29 +112,21 @@ public class OSNetworkMgrService implements ApplicationListener<ContextRefreshed
@Scheduled(fixedDelay = 1000)
void updateLocalIp() {
if (!networkSettingIsLoading) {
//
// TODO:
// 之所以要等到3分钟, 是因为目前netplan apply 在刚开始开机的情况下,执行会阻塞很久, 原因未知.....
// 只有三分钟之后,再执行netplan apply 才会运行正常.
//
if (OS.getPowerOnTimestamp() > 3 * 60 * 1000) {
initNetwork();
} else {
gStateMgrService.updateLocalIp("网络初始化中...");
}
return;
}
gStateMgrService.updateLocalIp(OS.getLocalIp());
}
/**
* 在应用启动时设置网络配置
*/
@Override public void onApplicationEvent(ContextRefreshedEvent event) {
if (OS.isRunOnWindows()) {
networkSettingIsLoading = true;
return;
}
NetworkSetting setting = networkSettingDao.get();
try {
doSetNetworkSetting(setting);
setting.firstRun = false;
networkSettingDao.update(setting);
log.info("Network setting applied on startup: {}", setting);
} catch (Exception e) {
log.error("setting network failed: {}", e.getMessage());
}
networkSettingIsLoading = true;
}
}

20
src/main/resources/application.yml

@ -1,9 +1,9 @@
#WEB虚拟后端
server.port: 80
iflytophald.ip: 127.0.0.1
iflytophald.enable: false
device.runmode: "VirtualStateGenerateMode"
lis.enable: false
#server.port: 80
#iflytophald.ip: 127.0.0.1
#iflytophald.enable: false
#device.runmode: "VirtualStateGenerateMode"
#lis.enable: false
#PC调试
#server.port: 80
@ -20,11 +20,11 @@ lis.enable: false
#正式部署
#server.port: 80
#device.runmode: "RealMode"
#iflytophald.ip: 127.0.0.1
#iflytophald.enable: true
#lis.enable: true
server.port: 80
device.runmode: "RealMode"
iflytophald.ip: 127.0.0.1
iflytophald.enable: true
lis.enable: true
a8k.enableTemperatureCtrl: true

Loading…
Cancel
Save