1. 0.2.1版本更新

This commit is contained in:
jianguo 2024-05-20 17:38:58 +08:00
parent d039590681
commit c5b9c59524
5 changed files with 232 additions and 77 deletions

15
pom.xml
View File

@ -55,6 +55,7 @@
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<scope>provided</scope>
<version>1.18.30</version>
</dependency>
<dependency>
@ -71,6 +72,20 @@
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>

View File

@ -2,6 +2,7 @@ package org.aohe.core.sane;
import au.com.southsky.jfreesane.SaneDevice;
import au.com.southsky.jfreesane.SaneException;
import au.com.southsky.jfreesane.SaneOption;
import cn.hutool.core.codec.Base64;
import com.alibaba.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j;
@ -39,7 +40,7 @@ public class SaneOperational {
r = setScanner(param.getString("scannerId"));
}else if ("001003".equals(function)){
//获取扫描仪操作符列表
// r = getDeviceOperations();
r = getOptions(param.getString("name"));
}else if ("001004".equals(function)){
//r = setDeviceOperations();
}else if ("001007".equals(function)){
@ -54,7 +55,6 @@ public class SaneOperational {
//r = startScan(param.getString("scannerId"),true);
}else if ("001016".equals(function)){
//r = startScan(param.getString("scannerId"),true);
SaneSessionUtils.printUsedIp();
r = R.ok();
}
}catch (Exception e){
@ -92,12 +92,12 @@ public class SaneOperational {
if(saneDrivers == null){
saneDrivers = scannerId;
}
SaneSessionUtils.setSaneDevice(scannerId);
return R.ok();
} catch (SaneException | IOException e) {
throw new RuntimeException(e);
log.error("打开扫描仪失败" , e);
}
return R.fail("打开扫描仪失败");
}
/**
@ -125,7 +125,16 @@ public class SaneOperational {
return R.ok(list);
} catch (IOException e) {
throw new RuntimeException(e);
log.error("扫描失败 ", e);
}
return R.fail("扫描失败");
}
public static R getOptions(String name){
List<SaneOption> options = SaneSessionUtils.getOptions(name);
if(options != null && !options.isEmpty()){
return R.ok(options);
}
return R.fail("调用失败");
}
}

View File

@ -0,0 +1,7 @@
package org.aohe.core.sane.mode;
public enum ScanMode {
Lineart,
Gray,
Color
}

View File

@ -2,27 +2,30 @@ package org.aohe.core.sane.utils;
import au.com.southsky.jfreesane.SaneDevice;
import au.com.southsky.jfreesane.SaneException;
import au.com.southsky.jfreesane.SaneOption;
import au.com.southsky.jfreesane.SaneSession;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.net.Ipv4Util;
import cn.hutool.core.net.NetUtil;
import cn.hutool.core.util.ByteUtil;
import cn.hutool.core.util.RuntimeUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.aohe.core.utils.CommandUtils;
import org.aohe.core.utils.SystemUtils;
import org.aohe.core.result.R;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.Map;
import au.com.southsky.jfreesane.OptionValueType;
import org.aohe.core.sane.mode.ScanMode;
@Slf4j
public class SaneSessionUtils {
@ -35,8 +38,6 @@ public class SaneSessionUtils {
private static final RemoteConfig remoteConfig = RemoteConfig.getInstance();
private static List<String> beUsedIp = new ArrayList<>(64);
/**
* 获取一个SaneSession实例用于与SANE设备进行通信
* @return SaneSession实例
@ -118,6 +119,9 @@ public class SaneSessionUtils {
*/
public static SaneDevice getDevice(String name) {
try {
if(StrUtil.isBlank(name)){
return saneDevice;
}
return setSaneDevice(name);
} catch (IOException | SaneException e) {
throw new RuntimeException(e);
@ -149,7 +153,185 @@ public class SaneSessionUtils {
}
}
}
/**
* 获取扫描仪参数
* @return list
* @throws IOException io异常
* @throws SaneException 扫描异常
*/
public static List<SaneOption> getOptions(String name){
SaneDevice saneDevice = getDevice(name);
if (saneDevice == null) {
return null;
}
try {
if (!saneDevice.isOpen()) {
saneDevice.open();
}
return saneDevice.listOptions();
} catch (IOException | SaneException e ) {
log.error("系统错误 ", e);
return null;
}
}
// /**
// * BW - 0
// * COLOR - 2
// * GRAYSCALE - 1
// * true ->auto
// * @param params
// */
// /**
// * 设置参数
// * @param params 参数 Dpi ->double 0-bw 2-color 1-gray true-auto
// * @throws SaneException 系统错误
// */
// public static void setOption(JSONObject params) throws SaneException, IOException {
// if(saneDevice == null){
// throw new SaneException("please first set device");
// }
// if(params == null){
// return;
// }
// Double key = params.getDouble("dpi");
// if(key != null){
// SaneOption dpi = saneDevice.getOption("Dpi");
// dpi.setIntegerValue(key.intValue());
// }
//
// Integer mode = params.getInteger("mode");
// if(mode != null){
// saneDevice.getOption("model");
// switch (mode){
// case 0:
// source.setColor(Source.ColorMode.BW);
// break;
// case 1:
// source.setColor(Source.ColorMode.GRAYSCALE);
// break;
// case 2:
// default:
// source.setColor(Source.ColorMode.COLOR);
// }
// }
//
// Boolean paperMode = params.getBoolean("paperMode");
// if(paperMode != null){
// source.setAutoDocumentFeeder(paperMode);
// }
//
// Boolean systemUI = params.getBoolean("systemUI");
// if(systemUI != null){
// source.setSystemUI(systemUI);
// }
// }
/**
* 设置扫描仪
* @param deviceName
* @param options
* @return
* @throws IOException
* @throws SaneException
*/
private R doSetOptions(String deviceName, LinkedHashMap<String, Object> options) throws IOException, SaneException {
SaneDevice saneDevice = getDevice(deviceName);
if (saneDevice == null) {
return null;
}
if (!saneDevice.isOpen()) {
saneDevice.open();
}
for (Map.Entry<String, Object> entry : options.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
SaneOption option = saneDevice.getOption(key);
if (ObjectUtil.isEmpty(option)) {
String errorMessage = String.format("option %s is not null,请检查该属性值是否含有使用条件.", key);
return R.fail(errorMessage);
}
OptionValueType optionType = option.getType();
if (!option.isActive()) {
String errorMessage2 = String.format("option %s is not active,请检查该属性值是否含有使用条件.%n option %s description:%s", option.getName(), option.getName(), option.getDescription());
return R.fail(errorMessage2);
}
switch (optionType) {
case BOOLEAN:
boolean val = Boolean.parseBoolean(String.valueOf(value));
option.setBooleanValue(val);
break;
case INT:
try {
int intVal = Integer.parseInt(String.valueOf(value));
int max = option.getRangeConstraints().getMaximumInteger();
int min = option.getRangeConstraints().getMinimumInteger();
int quantum = option.getRangeConstraints().getQuantumInteger();
if (intVal % quantum != 0 || intVal > max || intVal < min) {
String errorMessage3 = String.format("无效的%s值%s,有效范围为:[%s-%s],Quantum:%s", key, value, Integer.valueOf(min), Integer.valueOf(max), Integer.valueOf(quantum));
log.error(errorMessage3);
return R.fail(errorMessage3);
}
option.setIntegerValue(intVal);
break;
} catch (Exception nfe) {
String errorMessage4 = String.format("错误的Int类型值%s", value);
log.error(errorMessage4, nfe);
return R.fail(errorMessage4);
}
case FIXED:
try {
double doubleVal = Double.parseDouble(String.valueOf(value));
double max2 = BigDecimal.valueOf(option.getRangeConstraints().getMaximumFixed()).setScale(2, RoundingMode.HALF_UP).doubleValue();
double min2 = BigDecimal.valueOf(option.getRangeConstraints().getMinimumFixed()).setScale(2, RoundingMode.HALF_UP).doubleValue();
double quantum2 = BigDecimal.valueOf(option.getRangeConstraints().getQuantumFixed()).setScale(2, RoundingMode.HALF_UP).doubleValue();
if ((doubleVal / quantum2) % 1.0d != 0.0d || doubleVal > max2 || doubleVal < min2) {
String errorMessage5 = String.format("无效的%s值%s,有效范围为:[%s-%s],Quantum:%s", key, value, Double.valueOf(min2), Double.valueOf(max2), Double.valueOf(quantum2));
log.warn(errorMessage5);
return R.fail(errorMessage5);
}
option.setFixedValue(doubleVal);
break;
} catch (Exception nfe2) {
String errorMessage6 = String.format("错误的Double类型值%s", value);
log.error(errorMessage6, nfe2);
return R.fail(errorMessage6);
}
case STRING:
try {
String stringVal = value.toString();
List<String> effectiveValues = option.getStringConstraints();
if (effectiveValues != null) {
if (!effectiveValues.contains(stringVal)) {
String errorMessage7 = String.format("无效的%s值%s,有效范围为:[%s]", key, value, String.join(",", effectiveValues));
log.warn(errorMessage7);
return R.fail(errorMessage7);
}
option.setStringValue(stringVal);
if (option.getName().equals(getModeString())) {
//SaneSessionUtil.scanMode = (ScanMode) Enum.valueOf(ScanMode.class, stringVal);
}
}
break;
} catch (Exception nfe3) {
String errorMessage8 = String.format("错误的String类型值%s", value);
log.error(errorMessage8, nfe3);
return R.fail(errorMessage8);
}
}
}
return R.ok();
}
public static String getModeString() {
return "mode";
}
/**
* 释放资源
*/
@ -181,48 +363,7 @@ public class SaneSessionUtils {
}
/**
* 测试可用ip
* @param ips ip
*/
public static void beUsed(List<String> ips){
try (ExecutorService executorService = SystemUtils.newFixedThreadPool(2);){
for(String ip : ips){
log.info("ip:{} , 开始检测", ip);
executorService.submit(() -> SaneSessionUtils.beUsed(ip));
}
}catch (Exception e){
log.info("查找出错 ");
}
}
/**
* 测试可用ip
* @param ip ip
*/
public static void beUsed(String ip){
log.info("ip:{} , 可用性测试开始", ip);
if(!NetUtil.ping(ip)){
log.info("ip:{} , ping 测试不通过", ip);
return;
}
try (SaneSession session = SaneSession.withRemoteSane(InetAddress.getByName(ip))){
if(session == null){
return;
}
log.info("ip:{} , session 打开成功", ip);
//添加到可用列表
beUsedIp.add(ip);
} catch (IOException e) {
log.info("ip:{} , session 打开失败", ip);
throw new RuntimeException(e);
}
}
public static void printUsedIp(){
log.info("可用ip {} ", String.join("|", beUsedIp));
}
}

View File

@ -81,10 +81,10 @@ public class SystemUtils {
}
/**
* 获取第一个内网网卡地址
* 获取第一个内网网卡地址和掩码
* @return 地址
*/
public static String getInnerFirstEth(){
public static String getInnerFirstEthMask(){
Enumeration<NetworkInterface> netInterfaces;
try {
// 拿到所有网卡
@ -121,21 +121,4 @@ public class SystemUtils {
return "127.0.0.1/24";
}
public static void main(String[] args) throws InterruptedException {
String ip = getInnerFirstEth();
List<String> list = Ipv4Util.list(ip, false);
SaneSessionUtils.beUsed(list);
while (true){
Thread.sleep(10000);
SaneSessionUtils.printUsedIp();
}
}
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>());
}
}