+7 499 990-10-21

Одновременная работа сканера в ДЭНСИ:КАССА и в 1С

Одновременная работа сканера в ДЭНСИ:КАССА и в 1С

Сообщение Акцепт » 03 мар 2017, 15:01

День добрый!

Сканер Honeywell MS9520 (в bidirectional USB serial emulation mode), драйвер metro-usb.ko, определяется системой как /dev/ttyUSB0 (в Дэнси-кассе USB<->Com1).

Сканер замечательно распознается и работает как в Дэнси-Кассе, так и в 1С (1С по xfreerdp 0.8.2) по-отдельности. К сожалению, при одновременно запущенных Дэнси:Кассе и 1С, сканер работает только в Дэнси:Кассе.
В режиме эмулятора клавиатуры сканер с удаленной 1С по rdp работает некорректно (соединение медленное, штрих-код читается иногда нормально, иногда несколько первых символов, вобщем, криво и ненадежно)

Судя по всему, с одним ttyUSB портом две программы одновременно работать не могут. Увы мне.

Вопрос:

Можно как-то в линуксе исхитриться, "расшарить" ttyUSB и использовать его двумя программами одновременно?
Акцепт
 
Постов: 3
Зарегистрирован: 03 мар 2017, 14:34

Re: Одновременная работа сканера в ДЭНСИ:КАССА и в 1С

Сообщение Акцепт » 15 мар 2017, 14:55

Спасение утопающего - дело рук самого утопающего. Пришлось повозиться и поизобретать велосипед, но положительный результат получен - сканер штрих-кода нормально заработал в обеих программах одновременно, и ДЭНСИ:КАССА и в терминальной сессии 1С Предприятие 7.7.

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

Код: Выделить всё
*** Установка драйвера сканера MS9520 ***

1. Настроить сканер на режим bidirectional USB serial emulation mode (по руководству конфигурации)

2. Скачать (http://www.metrologic.ru/upload/Linux_Drivers.zip), собрать драйвер metro-usb.ko и поместить его в папку
/lib/modules/<версия ядра>/kernel/drivers/usb/serial
Замечание: При обновлении ядра ДЭНСИ:КАССЫ драйвер нужно пересобрать под новое ядро.
 
3. Обновить базу данных драйверов, выполнив depmod и запустить modprobe metro-usb. Если все нормально, то lsmod | grep metro покажет что-то типа
   metro_usb бла-бла
   usbserial бла-бла metro_usb

4. Добавить строку metro-usb в файл /etc/modules для его автозагрузки при старте системы.

5. В /etc/udev/rules.d поместить файл dancyscan.rules, содержащий строку:
   SUBSYSTEM=="tty", ATTRS{idVendor}=="0c2e", ATTRS{idProduct}=="0720",SYMLINK="ms9520", MODE="0777", RUN="/etc/virtcom/virtcom.sh"
   При подключении сканера в каталоге /dev будет создана ссылка @ms9520 на ttyUSB, который использует сканер. Работать со ссылкой надежнее,
   так как при подключении или переподключении USB-устройств, порт ttyUSB0 может занять другое устройство.



*** Настройки для одновременной работы сканера в двух программах ***
   
6. Схема дублирования потока данных от сканера выглядит следующим образом. В системе создается две пары виртуальных com-портов (pty) ttyIN0-->ttyUSB14 и
ttyIN1-->ttyUSB15 посредством программы-редиректора socat. Данные, поступающие на вход ttyIN0 передаются на ttyUSB14, а данные с ttyIN1 на ttyUSB15
соответственно. Пары изолированы друг от друга - то, что нам нужно. Данные, поступающие на @ms9520 (в моем случае на ttyUSB0), посредством вывода на
стандартное устройство (cat /dev/ms9520) выводятся редиректором-дубликатором tee (выводит данные со стандартного устройства на несколько стандартных
устройств) через ttyIN0 на ttyUSB14 и ttyIN1 на ttyUSB15 соответственно. В итоге получили, что хотели. В одной программе используем ttyUSB14,
в другой - ttyUSB15, сканер штрих-кода работает в обеих ОДНОВРЕМЕННО.
                                        |------>@ttyIN0----->@ttyUSB14---->Дэнси:Касса (ttyUSB14)
                                    cat | tee
Сканер MS920<--->@ms9520 (ttyUSB0) ---->|
                                        | tee
                                        |------@>ttyIN1----->@ttyUSB15---->1C (ttyUSB15)         

7. Установить программу-редиректор sосаt :
   apt-get install socat

8. В /etc/virtcom/ (см.п.5) поместить скрипт virtcom.sh, который будет автоматически запускаться при обнаружении сканера:

   #!/bin/sh

        # Виртуальные порты создаем в момент первого срабатывания скрипта, пересоздавать их при последующих
   # подключениях/отключениях сканера нет необходимости. Поток данных делаем однонаправленным опцией -u
       
        # Параметры socat для создания пар виртуальных портов
   comPair0="-u pty,link=/dev/ttyIN0,nonblock pty,link=/dev/ttyUSB14,nonblock"
   comPair1="-u pty,link=/dev/ttyIN1,nonblock pty,link=/dev/ttyUSB15,nonblock"
       
        # Параметры для редиректора-дубликатора tee
   pairstee="tee /dev/ttyIN0 /dev/ttyIN1"

        # Проверяем, созданы ли уже пары виртуальных портов. Если да, то ничего не делаем, если нет - то создаем.
   PIDcomPair0=`pgrep -f "socat $comPair0"`
   PIDcomPair1=`pgrep -f "socat $comPair1"`

   if ! [ $PIDcomPair0 ]; then
          socat $comPair0 &
           # Ждем секунду, пока первая пара виртуальных портов будет создана
      sleep 1
   fi

   if ! [ $PIDcomPair1 ]; then
          socat $comPair1 &
           # Ждем секунду, пока вторая пара виртуальных портов будет создана
      sleep 1
   fi

        # Ждем еще секунду, пока виртуальные порты создадутся (у кого-то могут создаваться быстрее, у меня - за две секунды)
   sleep 1

        # При отключении сканера ссылка на него /dev/ms9520 (как и ttyUSB0) удалятся, процесс tee грохается автоматически, но
        # мало ли, мы запускаем этот скрипт повторно вручную. Если редиректор для виртуальных портов исполняется, грохаем его
   if pgrep -f "$pairstee"; then
          killall $pairstee;
   fi
       
        # Даем полный доступ всем на использование виртуальных портов ttyUSB14 и ttyUSB15 
   chmod 777 /dev/ttyUSB14 /dev/ttyUSB15 > /dev/null

        # Дублируем поток данных со сканера на вход обеих пар виртуальных портов
   cat /dev/ms9520 | tee /dev/ttyIN0 /dev/ttyIN1 > /dev/null &


9. Если все прошло штатно, то ps ax|grep socat и ps ax|grep tee покажут, что необходимые процессы запущены:
          socat -u pty,link=/dev/ttyIN0,nonblock pty,link=/dev/ttyUSB14,nonblock
        socat -u pty,link=/dev/ttyIN1,nonblock pty,link=/dev/ttyUSB15,nonblock
   tee /dev/ttyIN0 /dev/ttyIN1

10. В данном примере ККМ подключить к ttyUSB14 (в настройках драйверов устройств ДЭНСИ:КАССА это USB<->COM15), а в 1С использовать
    в rdp-подключении порт ttyUSB15 (например, для freerdp-0.8.2 строка подключения может выглядеть так:
    freerdp -a16 -f -u user -p pass --no-tls --plugin cliprdr --plugun rdpdr --data serial:COM3:/dev/ttyUSB15 -- ТермСервер1C)

Акцепт
 
Постов: 3
Зарегистрирован: 03 мар 2017, 14:34

Re: Одновременная работа сканера в ДЭНСИ:КАССА и в 1С

Сообщение Alexander » 15 мар 2017, 15:17

А что происходит, если при сканировании и 1С и ДЭНСИ: КАССА находятся в режиме, в котором сканирование имеет смысл?
Обе программы корректно отрабатывают статус активного окна?
Alexander
 
Постов: 4955
Зарегистрирован: 16 авг 2009, 23:34
Откуда: Техподдержка ГК ДЭНСИ

Re: Одновременная работа сканера в ДЭНСИ:КАССА и в 1С

Сообщение Акцепт » 15 мар 2017, 17:07

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

Предлагаемый костыль был бы совсем ненужен, если бы в ДЭНСИ:КАССЕ в окне регистрации продаж (в котором кассир проводит 99% рабочего времени) можно было бы включать/выключать сканер (горячей клавишей или галкой в окне), что сопровождалось бы освобождением СОМ-порта сканера ДЭНСИ:КАССОЙ.
Акцепт
 
Постов: 3
Зарегистрирован: 03 мар 2017, 14:34

Re: Одновременная работа сканера в ДЭНСИ:КАССА и в 1С

Сообщение Alexander » 15 мар 2017, 17:51

Акцепт писал(а):костыль был бы совсем ненужен, если бы в ДЭНСИ:КАССЕ в окне регистрации продаж (в котором кассир проводит 99% рабочего времени) можно было бы включать/выключать сканер (горячей клавишей или галкой в окне), что сопровождалось бы освобождением СОМ-порта сканера ДЭНСИ:КАССОЙ

Эта кнопка называется [ScrollLock] - она позволяет переключать схемы оборудования.
Если сделать две одинаковые схемы, в одной из которых сканер есть, а в другой выключен, то...
Alexander
 
Постов: 4955
Зарегистрирован: 16 авг 2009, 23:34
Откуда: Техподдержка ГК ДЭНСИ


Вернуться в Торговое оборудование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


cron

Кто сейчас на конференции

Сейчас посетителей на конференции: 0, из них зарегистрированных: 0, скрытых: 0 и гостей: 0 (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (170) здесь было 16 май 2020, 01:50

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0