Skip to content

Работа со сканером [iOS]

siggb edited this page Oct 27, 2014 · 7 revisions

Socket Mobile

Подключение по шагам:

  • включаем сканер по нажатию на кнопку на корпусе (нижняя, маленькая)
  • выполняет unlink - одновременно зажимаем 2 кнопки на корпусе
  • включаем сканер
  • в настройках устройства выбираем Socketmobile[CHS<код>]
  • производится подключение без ввода кодов по профилю Bluetooth-MFI
  • обмен информацией по каналу сканер-iPad с использованием SDK от SocketMobile.

Ссылка на SDK и документацию: here.

DataLogic

Подключение по шагам:

  • включаем сканер
  • в настройках устройства выбираем Datalogic Keyboard
  • видим код, цифры которого последовательно считываем сканером по штрих-кодам
  • завершаем подключение, слышим звуковой сигнал, сканер подключен по профилю Bluetooth-HID

Программируем сканер на добавление к считанным кодам спец-символа: (необходимо для контроля ввода кодов)

  • входим в режим программирования
  • выбираем тип спец-символа: Suffix
  • последовательно вводим нужный нам спец-символ (или цепочку спец-символов) в 16 СС (например, для символа $ надо ввести код 24)
  • выходим из режима программирования

Особенности работы Objective-C:

  • сканер считывает коды посимвольно - следовательно, в поля ввода символы так же вводятся посимвольно (интервал ввода ~0.01-0.03 сек)
  • чтобы скрыть клавиатуру у UITextView надо проделать следующее:
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    dataArray = [NSMutableArray array];
    timeArray = [NSMutableArray array];
    
    // кастомный слой ввода, который показывается всегда, если в поле вводится текст
    // (даже если поле скрыто) -> поэтому высота минимальная
    UIView *inp_view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 768, 0.01f)];
    [inp_view setBackgroundColor:[UIColor yellowColor]];
    
    // присваиваем слой ввода и скрываем
    [self.hiddenTextView setInputView:inp_view];
    [self.hiddenTextView setHidden:YES];
}
  • в протокольном методе отрабатываем посимвольный ввод:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    NSLog(@"- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text");
    NSLog(@"-> text = %@", text);

    // помещаем в массив таймштамп
    [timeArray addObject:[NSDate date]];
    // если пришел спец.символ конца строки - обновляем таблицу
    if ([text isEqualToString:SPECIAL_EOS_CHAR]) {
        [self.tableViewItem reloadData];
    }
    else if (timeArray.count == 1) {
        // если пришел первый символ - помещаем его в массив данных
        [dataArray addObject:[NSMutableString stringWithString:text]];
    }
    else if (timeArray.count > 1) {
        // если пришел не первый символ
        NSDate *second_date = timeArray.lastObject;
        NSDate *first_date = timeArray[timeArray.count-2];
        double interval = [second_date timeIntervalSinceDate:first_date];
        NSLog(@"interval = %f", interval);
        
        // в случае, если интервал между текущим и предыдущим таймштампами меньше константы -
        // - значит ввод символов текущего кода
        if (interval <= AVER_TIMEINTERVAL_BETWEEN_CHARS) {
            [(NSMutableString*)dataArray.lastObject appendString:text];
            
            // здесь обновлять таблицу можно, но накладно
            //[self.tableViewItem reloadData];
        }
        else {
            // если интервал большой, значит ввод нового кода -
            // - создаем новую строку
            [dataArray addObject:[NSMutableString stringWithString:text]];
        }
    }
    
    return YES;
}
  • За индикацию конца строки со штрих-кодом отвечает спец-символ $. В принципе, по этому спец-символу можно также добавлять новые строки в dataArray. Однако, сейчас добавление новых строк осуществляется проверкой интервалов между вводом двух символов в UITextView. Два макроса:
#define AVER_TIMEINTERVAL_BETWEEN_CHARS 0.05f
#define SPECIAL_EOS_CHAR                @"$"

Полный проект здесь: here.

Clone this wiki locally