Как проверить онлайн/оффлайн статус 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-принтер Speed Line 300-UL, но также приветствуются общие решения для Ethernet POS-принтеров на Java.
Заранее спасибо!
Моя функция печати
public static void printToPOSInvoice(ObservableList
printRules, long orderHeader_id, Preferences preferences) {
System.out.println("Print to pos");

// Checking if POS printing is enabled at all
if (!preferences.getBoolean(Functions.POSSTATUS, false)) {
return; // Exit if POS is disabled
}

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);

// WE START WITH THE ITERATION FOR PRINTING
groupsToPrint.forEach((printerName, items) -> {

try {
// 1. CHECKING THE EXISTENCE OF A PRINTER
PrintService service = PrintRulesService.getPrintServiceByName(printerName);
if (service == null) {
throw new RuntimeException(
"Printer '" + printerName + "' is not found. Check name or driver."
);
}
System.out.println("Printer is found: " + printerName);

// --- Text and data generation ---
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"),
// ... other data (abbreviated for clarity) ...
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) Sending bytes to POS printer
PrintRulesService.printBytes(printerName, data);

} catch (RuntimeException re) {
// Catches errors when searching for printers
Dialogs.showOKDialog(
PrintRulesService.class,
"Preparation Error",
"An error occurred while preparing the print job for '" + printerName + "':\n" + re.getMessage()

);
} catch (Exception e) {
// Catches all I/O and PrintService errors from PrintRulesService.printBytes(printerName, data)
Dialogs.showOKDialog(
PrintRulesService.class,
"Error from POS printer: " + printerName,
"**Printer is OFFLINE or unavailable!**\n\n An error occurred while printing to '" + printerName + "':\n" + e.getMessage() );
}
}); //

} catch (Exception e) {
// Catch errors outside the loop (e.g., retrieving OrderHeader or TablesServices)

Dialogs.showOKDialog(
PrintRulesService.class,
"General System Error",
"A general error occurred before printing.:\n" + e.getMessage()
);
}
}

И функция printBytes:
public static void printBytes(String printerName, byte[] bytes) {
try {
// 1. Get a printer
PrintService service = getPrintServiceByName(printerName);

// 🔴Printer does not exist → throw an error !!!
if (service == null) {
System.out.println("Printer '" + printerName + "' not found or not ON.");
throw new RuntimeException("Printer '" + printerName + "' not found or not ON.");
}

// 2. Preparing for printing
DocPrintJob job = service.createPrintJob();
DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
Doc doc = new SimpleDoc(bytes, flavor, null);

// 3. try print
job.print(doc, null);

} catch (Exception e) {
System.out.println(e.getMessage());
// 🔴 Any error goes further to printToPOSInvoice
throw new RuntimeException("Error sending data to POS printer: " + e.getMessage(), e);
}
}


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

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

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

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

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

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