shtrih-m / javapos_shtrih

Реализация JavaPOS драйвера принтера фискального регистратора для устройств Штрих-М
http://www.shtrih-m.ru
MIT License
33 stars 16 forks source link

mcClearBuffer выдаёт ошибку #156

Closed Tango600 closed 1 year ago

Tango600 commented 1 year ago

Касса: Штрих-Нано-Ф, прошивка версии 355. Драйвер версии: 679. При вызове mcClearBuffer происходит исключение. errorCode=114, extended=461. сообщение=161, FS: Invalid 0xBx command sequence.

VitalyKravtsov2016 commented 1 year ago

Судя по всему, Штрих-Нано-Ф не поддерживает очистку буфера кодов маркировки. В ФР Сергея Ляховича это работает. Попрошу разработчика ФР поправить.

Tango600 commented 1 year ago

А как быть с проверкой кода, точнее с получением результат проверки?

Tango600 commented 1 year ago

Судя по всему, Штрих-Нано-Ф не поддерживает очистку буфера кодов маркировки. В ФР Сергея Ляховича это работает. Попрошу разработчика ФР поправить.

Пока рабочим способом является только чтение документа из кассы и выявлением тега 2106.

VitalyKravtsov2016 commented 1 year ago

Для проверки кода маркировки нужно использовать команду FF61. В драйвере это код команды directIO SMFPTR_DIO_CHECK_ITEM_CODE2. В ответе возвращается значение тега 2106.

Tango600 commented 1 year ago

Для проверки кода маркировки нужно использовать команду FF61. В драйвере это код команды directIO SMFPTR_DIO_CHECK_ITEM_CODE2. В ответе возвращается значение тега 2106.

А какой это метод драйвера?

VitalyKravtsov2016 commented 1 year ago

Это метод directIO(SMFPTR_DIO_CHECK_ITEM_CODE2). Реализация метода: public void execute(int[] data, Object object) throws Exception {

    Object[] params = (Object[])object;
    DIOUtils.checkObjectMinLength(params, 10);

    FSCheckMC command = new FSCheckMC();
    command.itemStatus = (Integer)params[0];
    command.checkMode = (Integer)params[1];
    command.mcData = (byte[])params[2];
    command.tlv = (byte[])params[3];
    getPrinter().check(getPrinter().fsCheckMC(command));
    params[4] = new Integer(command.localCheckStatus);
    params[5] = new Integer(command.localErrorCode);
    params[6] = new Integer(command.symbolicType);
    params[7] = new Integer(command.serverErrorCode);
    params[8] = new Integer(command.serverCheckStatus);
    params[9] = command.serverTLVData;
}

Сейчас добавлю в класс ShtrihFiscalPrinter113

Tango600 commented 1 year ago

Кроме не ещё реализованного в версии 633, метода, другие аналогичные или какая то комбинация методов не работают? ККМ: Штрих-Нано-Ф.

VitalyKravtsov2016 commented 1 year ago

Метод реализован давно. Просто здесь я проиллюстрировал реализацию.

VitalyKravtsov2016 commented 1 year ago

Класс ShtrihFiscalPrinter113 упрощает вызов команд directIO

VitalyKravtsov2016 commented 1 year ago

https://github.com/shtrih-m/javapos_shtrih/releases/tag/687

public class CheckItemCodeResponse
{
    public int localCheckStatus;
    public int localErrorCode;
    public int symbolicType;
    public int serverErrorCode;
    public int serverCheckStatus;
    public byte[] serverTLVData;

    public CheckItemCodeResponse(){
    }
}

public CheckItemCodeResponse checkItemCode2(int itemStatus, 
        int checkMode, byte[] data, byte[] tlv) throws Exception{

    Object[] params = new Object[10];

    params[0] = new Integer(itemStatus);
    params[1] = new Integer(checkMode);
    params[2] = data;
    params[3] = tlv;
    directIO(SmFptrConst.SMFPTR_DIO_CHECK_ITEM_CODE2, null, params);
    CheckItemCodeResponse response = new CheckItemCodeResponse();
    response.localCheckStatus = (Integer)params[4];
    response.localErrorCode = (Integer)params[5];
    response.symbolicType = (Integer)params[6];
    response.serverErrorCode = (Integer)params[7];
    response.serverCheckStatus = (Integer)params[8];
    response.serverTLVData = (byte[])params[9];
    return response;
}
Tango600 commented 1 year ago

Для проверки кода маркировки нужно использовать команду FF61. В драйвере это код команды directIO SMFPTR_DIO_CHECK_ITEM_CODE2. В ответе возвращается значение тега 2106.

Нет. public static final int SMFPTR_DIO_SEND_ITEM_CODE = 0x61;

Tango600 commented 1 year ago

Вызов checkItemCode2(1, 0, codeRawData, new byte[0]) приводит к невозможности закрыть чек. Вызов checkItemCode2(1, 0, codeRawData, null) к ошибке, разрыву соединения.

На Штрих Нано.

Tango600 commented 1 year ago

Провёл на драйвере 692, чеки закрываются, соединение не рвётся.

VitalyKravtsov2016 commented 1 year ago

А что с повторным соединением?

Tango600 commented 1 year ago

У меня таких проблем не поступало, подхватывает сразу. Посмотрим через неделю, как разойдётся приложение по сети.

vk-gc commented 1 year ago

Имеется следующая последовательность вызова методов для регистрации позиции в чеке согласно примеру из FFD105Documents:

fsWriteOperationTag(2108, 0)
setParameter(SmFptrConst.SMFPTR_DIO_PARAM_ITEM_PAYMENT_TYPE, 4)
setParameter(SmFptrConst.SMFPTR_DIO_PARAM_ITEM_SUBJECT_TYPE, 33)
setParameter(SmFptrConst.SMFPTR_DIO_PARAM_ITEM_TOTAL_AMOUNT, 100)
printRecItem(...)

В какой момент необходимо вызывать checkItemCode2, setItemCode, acceptItemCode(true) и какая должна быть последовательность вызова, чтобы печаталось [M+/-]?

И еще вопрос, у атола есть таймаут на серверную проверку КМ, есть ли для штриха такая опция?

Tango600 commented 1 year ago

У меня лучше всего работала такая последовательность. Но, результат проверки я ловил уже разбирая сам чек, после проведения.

printer.setItemCode(goodCheckInfo.codeMarking);
printer.checkItemCode(goodCheckInfo.codeMarking);
vk-gc commented 1 year ago

У меня лучше всего работала такая последовательность. Но, результат проверки я ловил уже разбирая сам чек, после проведения.

printer.setItemCode(goodCheckInfo.codeMarking);
printer.checkItemCode(goodCheckInfo.codeMarking);

Вызываете просто checkItemCode(code) без передачи планируемого статуса и без меры и дробной части для весовой молочки?

И таймауты никак не ставятся?

Tango600 commented 1 year ago

Параметры передаю ранее. Про таймауты не знаю.

VitalyKravtsov2016 commented 1 year ago

Добрый день. Таймауты проверки КМ задаются в таблице ФР 19, Параметры офд: 19,1,7,2,0,5,65535,'Таймаут чтения ответа км','33' 19,1,8,2,0,2,65535,'Таймаут чтения ответа км при проверке','5'

Tango600 commented 1 year ago

Что даёт команда checkItemCode2 на МГМ-ФН? У меня получается вот что: Проверка КМ Штрих Что значит поле localErrorCode, оно не 0.

vk-gc commented 1 year ago

@Tango600 Вот в исходниках нашел:

Screenshot 2023-07-24 at 18 14 32