Как проверить онлайн/оффлайн статус POS-принтера на Java?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как проверить онлайн/оффлайн статус POS-принтера на Java?

Сообщение Anonymous »

Я разрабатываю Java-приложение, которое печатает чеки на POS-принтере DGT POS Speed ​​Line 300-UL. Принтер подключен через Ethernet (сеть), а не через USB.
Я хочу реализовать функцию, в которой приложение проверяет, находится ли принтер в сети, прежде чем отправлять задание на печать, чтобы, если принтер находится в автономном режиме, пользователь (кассир) получал предупреждение и заказ не терялся.
В настоящее время я использую 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);

// 🔴 Printer ne postoji → baci grešku !!!
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());
// 🔴 Svaka greška ide dalje prema printToPOSInvoice
throw new RuntimeException("Greška prilikom slanja podataka na POS printer: " + e.getMessage(), e);
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... er-in-java
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»