Поводом написания этой маленькой статьи послужила странная ситуация, сложившаяся с настройкой сканеров штрих кода для работы с маркировкой в режиме именно клавиатуры.
Я думаю многие уже бились головой об стену не понимая как настроить сканер для корректной работы с маркировкой по ФФД 1.2.
Под корректной работой понимается, что считанный сканером код должен хотя бы распознаваться сначала корректно онлайн сервером ОФД и конечно далее сервером честного знака (это уже при включенном разрешительном режиме).
Суть проблемы в том, что в коде маркировка по формату Datamatrix присутствуют обычно 2 разделителя со значением 0x1d или их ещё называют GS.
Это управляющие символы, как они ещё применялись со времён программирования на перфокартах. Проблема в том, что они отсутствуют на клавиатуре визуально, располагаются в самом начале таблицы ASCII, и не имеют символьного представления. То есть в текстовом редакторе вы их просто так не увидите.
Да, надо отметить,развлекаемся со сканерами мы в Виндоус. На Винде, как я понял, USB драйвер клавиатуры всегда передавал сканкоды в соответствии с таблицей XT стандарта, где за каждой клавишей закреплёно конкретное значение.
USB драйвер всегда передает байты, как вы понимаете, и всегда от конкретной клавиши идёт одно конкретное значение (байт если хотите).
Так вот далее именно операционная система, настройки конкретного пользователя интерпретируют эти байты в соответствие с выбранной раскладкой клавиатуры или локалью и у нас появляются разные языки русский, английский и т.д. Но изначально из канала USB байты одни те же поступают.
Теперь о сканере штрих кода. Сканер также как и человек с клавиатуры передает те же байты, как бы нажимая клавиши в соответствии с используемой в нем настройкой языка. Тут обычно всегда латиница, на это можно не обращать внимание.
Но как ему передать символ GS?
Передать как он есть GS и есть 0x01.
Заменить его на код клавиши F8.
Заменить на один или комбинацию нескольких из других символов.
Все эти варианты могут вполне себе работать, так как сканеры имеют дополнительно настроечные штрих-коды для замены передаваемых символов. Но вот развлечение это очень себе не интересное, так как помнить как настраивается конкретный сканер, потом настраивать его по инструкции, потом может удаленно диктовать продавцу через анидеск какой штрих код считать для этого, все это головная боль, которая никому не нужна, но так сложилось исторически, что она есть.
Теперь хочу сказать по поводу первого варианта, что если оставить GS как есть и ничего не менять — это нормальный режим работы, во всяком случае для USB клавиатуры, все будет нормально передаваться и через RDP, и при работе через анидеск и поправьте меня если у кого были с этим какие‑то проблемы.
И можно так все было и оставить производителями сканеров штрих кода. Но как‑то так получилось, что по умолчанию они зачем‑то решили заменять GS на F8. Зачем? Наверное хотели как лучше...
А теперь попробуйте считать в блокноте клавишу F8, конечно вы не увидите ничего, как впрочем и символ GS вы тоже просто так не увидите.
И вот вы имеете последовательность от сканера, где GS заменён на F8, который вы никак не видите, и вы пихаете этот код для проверки серверу ОФД и конечно вы получаете отказ и очень начинаете переживать по поводу почему ничего не работает...
По факту вам надо было бы, чтобы ваша товароучетка заменила обратно F8 на GS. Но для начала надо знать, что происходит на уровне сканкодов.
Мы сделали небольшую программку на Qt (С++) для считывания данных от сканера в блокнот (на основе QPlainTextEdit) и включили лог через событие OnKeyPress.
Да и конечно еще мы задали сразу локаль Latin-1, понятно зачем.
И только теперь на самом деле мы поняли суть проблемы и самое главное как ее решать. На наш взляд разумнее не парится с настройкой сканеров каким-то особым образом. Лучше использовать настройки по умолчанию с одним небольшим «но» — на до смотреть в логе, что передается перед '91' и '92' и далее в товароучетке (конечно если там такая возможность есть) переопределять обратно, то есть восстанавливать GS в GS.
Надо отметить, что если вы используете сканер в режиме COM порта, то конечно проблем с передачей GS у вас не будет изначально. Но очень многое десктопные приложения не имеют варианта COM порта.
К тому же есть большая коллекция программ, которые выполняются в облаке, то есть пользователь работает через браузер и теперь как этой облачной программе получить доступ в COM порту компьютера? Правильно — только написать и запустить свой сервер на этом ПК. А вот режим клавиатуры всегда работает из коробки без дополнительных проблем.
Я не претендую на оригинальность подхода, просто потерял много времени у одного клиента пока не понял, что их товароучетка работать с маркировкой не будет «от слова совсем» по причине, что разработчик не понимает нюансы использования сканеров в режиме клавиатуры, при этом и поставщик сканеров удивленно говорил, что у всех работает маркировка и разработчик товароучетки удивлялся, у всех работает, только у вас почему‑то нет...
Бесплатная программка с открытым исходным кодом на С++ для тестирования сканеров barcode_scanner_kb_test.exe если, что здесь (под виндоус).
Надеюсь хабровчане поделятся в комментариях своим опытом решения пободной проблемы со сканерами.