Я сделал подобное приложение, поэтому вот мои два цента.
USB-сканер в основном работает как клавиатура USB.Большинство отправит ключ ввода в качестве символа завершения, но это можно настроить на большинстве устройств.Я полагался на символ завершения для вождения действий в моем пользовательском интерфейсе.(По умолчанию Enter отправит выбранную в данный момент форму.)
Другая проблема заключается в том, что если это мобильное приложение, вы действительно хотите максимально избегать обращений к серверу.Я решил это с помощью тонны прикладной логики в пользовательском интерфейсе, однако вся бизнес-логика все еще была на сервере, поэтому для того, чтобы действия имели эффект, пользователю необходимо было подключиться и иметь возможность POST к серверу.
Итак, в суть вашей проблемы.Рассмотрим что-то вроде этого:
var state = 'WAITING'; # super simple state
function add(data) {
# courier checks an item, 'data' contains the data from the scanner
}
function input_handler(input) {
if (state == 'WAITING') {
if (input == 'DONE' || input == 'EXIT') {
state = 'DONE';
# abort, whatnot
} else {
state = 'SCAN';
input_handler(input); # recurse, with new state
}
} else {
add(input);
}
}
Это в основном конечный автомат, закодированный вручную.Когда курьер проверяет штрих-код «Я хочу начать сканирование для этого заказа», вы входите в режим, в котором каждый ввод поступает в ваш обработчик сканирования.Когда он сканирует штрих-код «Я закончил», вы проверяете результат и т. Д. Это можно улучшить, если использовать реальный конечный автомат.
Штрих-коды должны быть максимально простыми.Такие команды, как 'SCAN', 'EXIT', 'NOTHING_MORE_TO_SCAN' хороши, потому что они являются общими, и вашему приложению не нужно анализировать штрих-код на предмет значения.
Другая причина, по которой они просты, заключается в том, что вы столкнется с ситуацией, когда этикетка повреждена и ее невозможно отсканировать.Затем пользователь должен иметь возможность вручную вводить данные, не тратя дополнительное время на поиск специальных символов и т. Д.