Сайт | Скачать | Видео | Wiki

Автор Тема: Linux и сканер штрихкодов  (Прочитано 13741 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн eai

  • Старожил
  • ****
  • Сообщений: 245
  • Репутация: +12/-0
  • Автор темы
Linux и сканер штрихкодов
« : 29 Сентябрь 2010, 13:20:22 »
Всем доброго времЯчка

Может быть односельчане не владеют вопросом, но все же хочу поднять тему.

Вот приспичило мне в магазинах где я работаю сделать информационный киоск.
Что это такое, да простой компьютер где покупатель может лазить по товарам, смотреть описалово.
Формально тот же инет магазин или каталог.
Посему нет ничего проще, поставь компов в зале магазина с Пуппи или ChromeOS(ждем) и пусть покупатели ходЮть и смотрят.
Но есть одна закавыка.
Очень важна функция когда покупатель подносит товар со штрихкодом к компьютеру сканирует его и ФА! комп сам нашел товар по штрихкоду и развернул все описалово и цены.
НО браузеры не работают с внешними устройствами, и судя по всему не будут!
В винде я бы решал проблемы следующим образом.
Делается приложение, которое умеет перехватывать события сканера, визуальная же часть приложения просто является контейнером для Осла.
Запустился комп, открылось приложение запросило нужную страницу, работай не хочу.
Покупатель сканирует товар и оп, оболочка загружает нужную страницу или того паче вызывает JS код в осле с указанием штрихкода.
Красиво, но как что либо подобное сделать Nix не знаю.
Посоветуйте кто чем может :)


« Последнее редактирование: 29 Сентябрь 2010, 13:24:15 от eai »
Нет в природе ничего такого чего бы человек с головой и руками не смог бы сломать

Оффлайн Liss

  • Ветеран
  • *****
  • Сообщений: 632
  • Репутация: +23/-0
Re: Linux и сканер штрихкодов
« Ответ #1 : 29 Сентябрь 2010, 14:11:26 »
Вот решение любопытное. Но тут есть одна зависимость. winserver...
Терпение, труд и какая-то мать, все перетрут.

Оффлайн eai

  • Старожил
  • ****
  • Сообщений: 245
  • Репутация: +12/-0
  • Автор темы
Re: Linux и сканер штрихкодов
« Ответ #2 : 29 Сентябрь 2010, 14:36:01 »
Вот решение любопытное. Но тут есть одна зависимость. winserver...
Где вот? ;-)

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

Оффлайн gmaster

  • Пользователь
  • **
  • Сообщений: 39
  • Репутация: +8/-0
Re: Linux и сканер штрихкодов
« Ответ #3 : 29 Сентябрь 2010, 20:03:40 »
Самый простой вариант (общая идея):

1. Подключаем сканер в разрыв клавиатуры, настраиваем завершение скана символом CR.
2. На страничке среди прочих красивостей делаем форму с одним текстовым полем для приёма штрих-кода, в которое скрипт устанавливает фокус ввода.
3. При срабатывании сканера завершающий CR является аналогом нажатия Enter. Срабатывает форма.
4. Далее понятно и, по-моему, надёжно.

Паппи справится.

Оффлайн eai

  • Старожил
  • ****
  • Сообщений: 245
  • Репутация: +12/-0
  • Автор темы
Re: Linux и сканер штрихкодов
« Ответ #4 : 30 Сентябрь 2010, 15:08:44 »
1. Подключаем сканер в разрыв клавиатуры, настраиваем завершение скана символом CR.

Ok

2. На страничке среди прочих красивостей делаем форму с одним текстовым полем для приёма штрих-кода, в которое скрипт устанавливает фокус ввода.
А если еще есть поля или ссылка фокусирована, или не дай бог адресная строка.

3. При срабатывании сканера завершающий CR является аналогом нажатия Enter. Срабатывает форма.
Только если был фокус у нужного элемента


Мы сделали по другому
1. Кроме CR  в конце еще и спец символ в начале
2. Для document ловим событие keydown, если key спец символ то фокус в поле поиска
ну а дальше как было описано

Но все равно мне это не кажется очень надежным.
Что например произойдет если браузер не успеет передать фокус в нужный элемент до того как пойдут другие символы.
Опять таки управление может быть передано каким то элементам браузера (не страницы) которые не сгенерируют событие keydown для документа ...
Нет в природе ничего такого чего бы человек с головой и руками не смог бы сломать

Оффлайн takefive

  • без свинга нет музыки...
  • Новичок
  • *
  • Сообщений: 11
  • Репутация: +0/-0
  • takefive
    • takefive.dp.ua
Re: Linux и сканер штрихкодов
« Ответ #5 : 30 Сентябрь 2010, 19:38:38 »
Тема для меня интересная. Хочу попробовать себя в программировании. Мне нужно прочитать штрих код со сканера. Нашел ссылку http://www.opennet.ru/docs/RUS/serial_guide/#2_5_2 - подскажите, я на верном пути?

Оффлайн eai

  • Старожил
  • ****
  • Сообщений: 245
  • Репутация: +12/-0
  • Автор темы
Re: Linux и сканер штрихкодов
« Ответ #6 : 01 Октябрь 2010, 09:58:58 »
Тема для меня интересная. Хочу попробовать себя в программировании. Мне нужно прочитать штрих код со сканера. Нашел ссылку http://www.opennet.ru/docs/RUS/serial_guide/#2_5_2 - подскажите, я на верном пути?
Путь то верный но ... долгий
Обычно делается не совсем так
К сканёру идет драйвер который цепляется программой

кроме того это только для COM варианта, 50% рынка занимают сканеры USB&PS/2
Они сточки зрения компа выглядят обычной клавиатурой.
Но и тут есть драйвера, которые вешают слушатель глобальный на ввод клавы и смотрят, если быстро ведена последовательность и это штрихкод (анализ) то не передавать ввод клавиатуры а генерировать событие "введен штрихкод"
« Последнее редактирование: 01 Октябрь 2010, 10:01:28 от eai »
Нет в природе ничего такого чего бы человек с головой и руками не смог бы сломать

Оффлайн gmaster

  • Пользователь
  • **
  • Сообщений: 39
  • Репутация: +8/-0
Re: Linux и сканер штрихкодов
« Ответ #7 : 01 Октябрь 2010, 12:18:23 »
2. На страничке среди прочих красивостей делаем форму с одним текстовым полем для приёма штрих-кода, в которое скрипт устанавливает фокус ввода.
А если еще есть поля или ссылка фокусирована, или не дай бог адресная строка.

Давай усовершенствуем пункт 2. Откроем страничку без адресной строки с информационным блоком, который строго не более экрана, чтобы не использовать прокрутку, и с ОДНИМ полем ввода ШК, чтобы фокусу деваться было просто некуда. После запуска информационного киоска уносим клавиатуру в подсобку.

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

То есть даём покупателю возможность совершать только одно действие - ввод ШК.

Оффлайн eai

  • Старожил
  • ****
  • Сообщений: 245
  • Репутация: +12/-0
  • Автор темы
Re: Linux и сканер штрихкодов
« Ответ #8 : 01 Октябрь 2010, 19:12:32 »
2. На страничке среди прочих красивостей  После запуска информационного киоска уносим клавиатуру в подсобку.
Не реально потому что
1. 25 магазинов, по 10 компов в каждом = 250. по теории вероятности постоянно случается неприятность, то завис то свет выключили .... кто будет ходить и приносить клаву
2. А коли юзер захочет по названию поискать ;-)
3. А коли я захочу расширить функционал и пользователь сам можетсоставить себе покупку и передать продавцу и споконйо подождать пока ему соберут заказ. Тут как не крути клава нужна

(тачскрин не предлагать, зело дорого)
Нет в природе ничего такого чего бы человек с головой и руками не смог бы сломать

Оффлайн gmaster

  • Пользователь
  • **
  • Сообщений: 39
  • Репутация: +8/-0
Re: Linux и сканер штрихкодов
« Ответ #9 : 01 Октябрь 2010, 21:57:45 »
Нашел ссылку http://www.opennet.ru/docs/RUS/serial_guide/#2_5_2 - подскажите, я на верном пути?

Думаю, на верном. Я пытал первоисточник http://www.easysw.com/~mike/serial/serial.html  :)

Оффлайн takefive

  • без свинга нет музыки...
  • Новичок
  • *
  • Сообщений: 11
  • Репутация: +0/-0
  • takefive
    • takefive.dp.ua
Re: Linux и сканер штрихкодов
« Ответ #10 : 01 Октябрь 2010, 22:16:36 »
В моем понимании в виндовс драйвер сканера - некий: ком, оле, активХ и т.п. объект посредник между приложением и портом. В линукс-юникс ничего подобного не обнаружил. Просветите в общих чертах - как должно взаимодействовать мое приложение с портом?

eai - почему нельзя пойти от обратного? Получаем ШК от сканера, формируем ссылку и отправляем в броузер
« Последнее редактирование: 02 Октябрь 2010, 02:24:01 от takefive »

Оффлайн gmaster

  • Пользователь
  • **
  • Сообщений: 39
  • Репутация: +8/-0
Re: Linux и сканер штрихкодов
« Ответ #11 : 02 Октябрь 2010, 12:33:29 »
Просветите в общих чертах - как должно взаимодействовать мое приложение с портом?

Можно обойтись без написания своего драйвера. Есть утилита для взаимодействия с портом. Делаем поиск на форуме по слову catty.

Оффлайн takefive

  • без свинга нет музыки...
  • Новичок
  • *
  • Сообщений: 11
  • Репутация: +0/-0
  • takefive
    • takefive.dp.ua
Re: Linux и сканер штрихкодов
« Ответ #12 : 02 Октябрь 2010, 21:11:55 »
на работе взял сканер на уикэнд и наваял. Первый опыт борьбы с СИ
Код
#include <stdio.h>   /* Стандартные объявления ввода/вывода */
#include <string.h>  /* Объявления строковых функций */
#include <unistd.h>  /* Объявления стандартных функций UNIX */
#include <fcntl.h>   /* Объявления управления файлами */
#include <errno.h>   /* Объявления кодов ошибок */
#include <termios.h> /* Объявления управления POSIX-терминалом */
 
int open_port(void);      //Функция открытия порта

int main(int argc,char **argv)
{
 char link[100];
 int fd=open_port(); //дескриптор файла порта
 int k;
 char scan_code[20];
 

 while(k!=-1)
  {
   k=read(fd,scan_code,20);
   strcpy(link, "firefox http://www.market.takefive.index.php?scan=");//адрес нужно изменить на реальный
   strncat(link, scan_code, k-1); //к ссылке добавляем ШК
   printf(" Hello World! %s \n",link); //на экран
   system(link); //запуск браузера
  }
 close(fd);
 return(0);
}

int  open_port(void)
{
 int fd;
 fd = open("/dev/ttyS0", O_RDONLY | O_NOCTTY |O_NONBLOCK);//чтение COM1 (ttyS0)
 //fd = open("/dev/ttyS1", O_RDONLY | O_NOCTTY |O_NONBLOCK);//чтение COM2 (ttyS1)
 if (fd == -1)
  {
   perror("open_port: Unable to open /dev/ttyS0 - ");
  }
 else
  {
   fcntl(fd, F_SETFL, 0);
  }
 return (fd);
}

Оффлайн eai

  • Старожил
  • ****
  • Сообщений: 245
  • Репутация: +12/-0
  • Автор темы
Re: Linux и сканер штрихкодов
« Ответ #13 : 04 Октябрь 2010, 09:29:00 »
eai - почему нельзя пойти от обратного? Получаем ШК от сканера, формируем ссылку и отправляем в броузер
Дык, я же что то того и описал что я бы сделал для Windows. Как в nix  сделать не знаю, ибо не знаю что использовать взаместо OLE
Нет в природе ничего такого чего бы человек с головой и руками не смог бы сломать

Оффлайн eai

  • Старожил
  • ****
  • Сообщений: 245
  • Репутация: +12/-0
  • Автор темы
Re: Linux и сканер штрихкодов
« Ответ #14 : 04 Октябрь 2010, 09:34:46 »
на работе взял сканер на уикэнд и наваял. Первый опыт борьбы с СИ
Код
#include <stdio.h>   /* Стандартные объявления ввода/вывода */
#include <string.h>  /* Объявления строковых функций */
#include <unistd.h>  /* Объявления стандартных функций UNIX */
#include <fcntl.h>   /* Объявления управления файлами */
#include <errno.h>   /* Объявления кодов ошибок */
#include <termios.h> /* Объявления управления POSIX-терминалом */
 
int open_port(void);      //Функция открытия порта

int main(int argc,char **argv)
{
 char link[100];
 int fd=open_port(); //дескриптор файла порта
 int k;
 char scan_code[20];
 

 while(k!=-1)
  {
   k=read(fd,scan_code,20);
   strcpy(link, "firefox http://www.market.takefive.index.php?scan=");//адрес нужно изменить на реальный
   strncat(link, scan_code, k-1); //к ссылке добавляем ШК
   printf(" Hello World! %s \n",link); //на экран
   system(link); //запуск браузера
  }
 close(fd);
 return(0);
}

int  open_port(void)
{
 int fd;
 fd = open("/dev/ttyS0", O_RDONLY | O_NOCTTY |O_NONBLOCK);//чтение COM1 (ttyS0)
 //fd = open("/dev/ttyS1", O_RDONLY | O_NOCTTY |O_NONBLOCK);//чтение COM2 (ttyS1)
 if (fd == -1)
  {
   perror("open_port: Unable to open /dev/ttyS0 - ");
  }
 else
  {
   fcntl(fd, F_SETFL, 0);
  }
 return (fd);
}

Хм, интересно, но не закончено, потому как  штрихкоды бываю оч. разные, по  длине и формату.
Да и каждый раз открывать новый экземпляр браузера не камельфо.
Вот если бы как то так


Код
if (!browser)
     browser = new ....;

if (browser->address != "sdcvsvcs")
     browser->address = "sdcvsvcs";
else
     browser->document->DOM->callJSfunction(code);

Код конечно не на сях, ибо с детства на С++ фигачу, и строковые тупо сравниваю операторами :)



« Последнее редактирование: 04 Октябрь 2010, 09:39:59 от eai »
Нет в природе ничего такого чего бы человек с головой и руками не смог бы сломать