Проблема с запуском циклов при отправке команд в telnet через Java - PullRequest
0 голосов
/ 22 февраля 2019

Я создаю инструмент, который позволит мне и моей команде выполнять ряд ежедневных задач в нашем тестовом наборе.У нас есть несколько контроллеров кассовых операций, которые позволяют нам выполнять такие задачи, как открытие магазина и закрытие магазина, и меня попросили попытаться сделать что-то, что может выполнить это удаленно по расписанию, чтобы нашей команде по окружению не приходилось возитьсяисправить вещи, которые мы сломали, не используя их должным образом.

Ядром программы не является мой собственный код, так как я все еще плохо знаком с концепциями telnet, и кто-то выполнил за меня тяжелую работу.

Я могу отправлять команды, читать, пока в printstream не появятся определенные подсказки, моя проблема возникает с обработкой различных экранных подсказок, которые могут появляться или не отображаться для любого из контроллеров (некоторые операции не включаются, некоторые имеютпроблемы с принтером - все они обрабатываются сообщением об ошибке на контроллере и нажатием клавиши F для выхода или перехода.

Я могу поймать первое потенциальное сообщение с циклом if, но на всю жизнья не могу понять, как справиться со вторым потенциальным.

Я вставил свой код так далеко внизу (извиняюсь за любые вопиюще плохие практики - в настоящее время я свободен, выполняя его без поддержки свинца, поэтомуЯ приму совет, если вы готовы дать его :))

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import org.apache.commons.net.telnet.TelnetClient;

public class Test {

    private TelnetClient telnet = new TelnetClient();
    private InputStream in;
    private PrintStream out;
    private String prompt = ">";
    public String command;
    public String uid = "22222222";
    public String upw = "19731973";
    public String storeOpen = "1";
    static int startStatus;
    static int msgStatus;
    static int enableStatus;
    static int printerStatus;
    int reportStatus;

    public Test(String server, String user, String password, String job) {
        try {
            // Connect to the specified server
            telnet.connect(server, 23);

            // Get input and output stream references
            in = telnet.getInputStream();
            out = new PrintStream(telnet.getOutputStream());

            // Log the user on
            readUntil("Operator ID:");
            write(user);
            Thread.sleep(2000);
            readUntil("Password:");
            write(password);
            Thread.sleep(2000);

            // Advance to a prompt
            readUntil("Operator ID");
            write(uid);
            Thread.sleep(2000);
            readUntil("Password");
            write(upw);
            Thread.sleep(2000);
            readUntil("Store System Application");

            if (job.equalsIgnoreCase("open")) {
                Thread.sleep(2000);
                write(storeOpen);
                readUntil("1. Start of Day Procedures");
                Thread.sleep(2000);
                write(storeOpen);
                readUntil("1. Store Open");
                Thread.sleep(2000);
                write(storeOpen);
                Thread.sleep(2000);
                System.out.println("Store Opening Started");
                startStatus = 1;
            }
            if (readUntil("Store opening already performed - F7 to continue , F3 to quit.") != null) {
                //THIS IF WORKS
                Thread.sleep(2000);
                sendCommand("\033[18~");//F7
                // sendCommand("\033[13~");<-- should quit on this but I'm testing so I want to keep moving
                Thread.sleep(2000);
                System.out.println("STORE OPENING ALREADY PERFORMED, EXITING");
                //telnet.disconnect();
            }
            else if (readUntil("Store opening already performed - F7 to continue , F3 to quit.") == null) {
                System.out.println("Store Opening not already performed, continuing"); //THIS ELSE IF WORKS
            }
            if (readUntil("Some tills not enabled") != null) { //THIS IF FAILS TO TRIGGER
                sendCommand("\033[18~");
                System.out.println("Some tills failed to enable. Go check!");
            }
            else if (readUntil("Some tills not enabled") == null){//THIS IF FAILS TO TRIGGER
                System.out.println("All tills enabled, continuing");
            }
            if (readUntil("Status  : Printed report selection ") != null) {//THIS IF FAILS TO TRIGGER
                sendCommand("\033[13~");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

public static void main(String[] args) throws IOException, InterruptedException {
        // Creates a new rig
        Rigs newRig = new Rigs();
        System.out.println("Please enter the RIG you'd like to connect to:");
        BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
        String rig = sc.readLine();

        // Asks which task we want to perform
        if (newRig.rigs().containsKey(rig.toUpperCase())) {
            System.out.println("Please enter one of the following options: Open or Close");
            BufferedReader job = new BufferedReader(new InputStreamReader(System.in));
            String command = job.readLine();
            // Does the store opening task
            if (command.equalsIgnoreCase("open") || command.equalsIgnoreCase("close")) {
                String ip = newRig.rigs().get(rig.toUpperCase());
                Test telnet = new Test(ip, "111", "111", command);
                System.out.println("Store " + command + " complete for " + rig + ":" + ip);
                telnet.disconnect();
            }
        }
    }
}
...