Я хочу реализовать функцию, в которой приложение проверяет, находится ли принтер в сети, прежде чем отправлять задание на печать, чтобы, если принтер находится в автономном режиме, пользователь (кассир) получал предупреждение и заказ не терялся.
В настоящее время я использую PrintServiceLookup.lookupPrintServices() в Java, чтобы получить принтер по имени, но я не могу надежно определить если принтер онлайн. Имя принтера определяется правильно, но информация о состоянии отсутствует.
Я рассмотрел:
Использование WMIC или запрос порта принтера Windows → не работает надежно для этого принтера.
Отправка небольшого тестового отпечатка, чтобы проверить, доступен ли принтер → работает, но мне интересно, есть ли более чистый способ.
Мои вопросы:
Есть способ на Java проверить онлайн-/оффлайн-статус сетевого POS-принтера по имени?
Есть ли способ надежно получить IP-адрес принтера из Java, если известно только имя принтера?
Существуют ли какие-либо рекомендации для POS-принтеров Ethernet для проверки подключения перед печатью?
Я специально ориентируюсь на DGT POS Printer Speed Line 300-UL, но общие решения для Ethernet POS-принтеров на Java также приветствуются.
Заранее спасибо!
Моя функция печати
public static void printToPOSInvoice(ObservableList
printRules, long orderHeader_id, Preferences preferences) {
System.out.println("Print to pos");
// Provjera da li je POS ispis uopšte uključen
if (!preferences.getBoolean(Functions.POSSTATUS, false)) {
return; // Izađi ako POS nije uključen
}
try {
OrderHeader aos = OrderHeaderService.orderHeaderService.getById(orderHeader_id);
Table tempTable = TablesServices.tablesServices.getById(aos.getTable_id());
if (tempTable == null) {
tempTable = new Table(0, "", 0, "", 1, "");
}
final Table table = tempTable;
Map groupsToPrint =
PrintGroupService.groupItemsByPrinter(printRules, CartFunctions.cartList);
// KREĆEMO S ITERACIJOM ZA ISPIS
groupsToPrint.forEach((printerName, items) -> {
try {
// 1. PROVJERA POSTOJANJA PRINTERA
PrintService service = PrintRulesService.getPrintServiceByName(printerName);
if (service == null) {
throw new RuntimeException(
"Printer '" + printerName + "' nije pronađen. Provjerite naziv ili instalaciju drivera."
);
}
System.out.println("Printer je pronađen: " + printerName);
// --- Generisanje teksta i podataka (ne mijenja se) ---
String text = PrintRulesService.printRulesService.generatePrintTextInvoice(aos, items);
byte[] data = PrintRulesService.concat(
PrintRulesService.INIT,
PrintRulesService.ALIGN_CENTER,
PrintRulesService.LARGE_ON,
PrintRulesService.BOLD_ON,
PrintRulesService.text("==== NARUDZBA ====\n"),
// ... ostali podaci (skraćeno zbog preglednosti) ...
PrintRulesService.text(text),
PrintRulesService.LF, PrintRulesService.LF,
PrintRulesService.ALIGN_CENTER,
QRGenerator.generateQRForOrder(aos, null),
PrintRulesService.LF, PrintRulesService.LF,
PrintRulesService.ALIGN_CENTER,
PrintRulesService.text("==== Hvala! ====\n"),
PrintRulesService.LF, PrintRulesService.LF,
PrintRulesService.LF, PrintRulesService.LF,
PrintRulesService.LF,
PrintRulesService.CUT
);
// ----------------------------------------------------
// 3) Slanje bajtova POS printeru
PrintRulesService.printBytes(printerName, data);
} catch (RuntimeException re) {
// Hvata greške prilikom traženja pisača
Dialogs.showOKDialog(
PrintRulesService.class,
"Greška Pripreme",
"Došlo je do greške u pripremi ispisa za '" + printerName + "':\n" + re.getMessage()
);
} catch (Exception e) {
// Hvata sve I/O i PrintService greške iz PrintRulesService.printBytes(printerName, data)
Dialogs.showOKDialog(
PrintRulesService.class,
"Greška POS Uređaja: " + printerName,
"**Pisač je OFFLINE ili nedostupan!**\n\nDošlo je do greške prilikom ispisa na '" + printerName + "':\n" + e.getMessage()
);
}
}); // Kraj forEach
} catch (Exception e) {
// Hvata greške izvan petlje (npr., dohvaćanje OrderHeader ili TablesServices)
Dialogs.showOKDialog(
PrintRulesService.class,
"Opća Greška Sustava",
"Došlo je do opće greške prije ispisa:\n" + e.getMessage()
);
}
}
И функция printBytes:
public static void printBytes(String printerName, byte[] bytes) {
try {
// 1. Dohvati printer
PrintService service = getPrintServiceByName(printerName);
//
if (service == null) {
System.out.println("Printer '" + printerName + "' nije pronađen ili nije uključen.");
throw new RuntimeException("Printer '" + printerName + "' nije pronađen ili nije uključen.");
}
// 2. Priprema za ispis
DocPrintJob job = service.createPrintJob();
DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
Doc doc = new SimpleDoc(bytes, flavor, null);
// 3. POKUŠAJ ISPIS
job.print(doc, null);
} catch (Exception e) {
System.out.println(e.getMessage());
//
throw new RuntimeException("Greška prilikom slanja podataka na POS printer: " + e.getMessage(), e);
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... er-in-java
Мобильная версия