Zebra jPOS: как иметь поддержку нескольких сканеров

Требование: для поддержки нескольких сканеров на машине с Windows.

Инструменты:

  • Zebra SDK сканер
  • Ручной сканер Zebra т.е. DS2208
  • JPOS
  • Приложение Spring Boot

Проблема: Первый сканер успешно заявлен. Однако утверждение второго сканера приводит к следующему исключению "Устройство уже заявлено другим управляющим устройством".

Анализ кода:

  • SymScannerSvc112 в качестве класса обслуживания, используемого для ручного сканера.

  • SymScannerSvc112 расширяет SymScannerSvc. SymScannerSvc содержит статическую переменную "_fClaimed".

  • Когда заявлен первый сканер, статическая переменная _fClaimed имеет значение true. Теперь, когда вы пытаетесь запросить второй сканер, следующий код мешает ему, так как _fClaimed установлен как true.

Код: SymScannerSvc.java:

this._alreadyClaimed = false;
            if(_fClaimed) {
                this._alreadyClaimed = true;
                this.release();
            }

Примечание: 1. Сканеры подключены к USB-портам.

jpos.xml

<?xml version="1.0" encoding="UTF-8"?>
<JposEntries>

<JposEntry logicalName="ZebraScannerSerial">
    <creation factoryClass="com.motorola.jpos.service.scanner.SymScannerSvc112Factory" serviceClass="com.motorola.jpos.service.scanner.SymScannerSvc112"/>
    <vendor name="Zebra Technologies" url="https://www.zebra.com"/>
    <jpos category="Scanner" version="1.12"/>
    <product description="Zebra Serial" name="Zebra Serial Scanner on COM1" url="https://www.zebra.com"/>

    <!--Other non JavaPOS required properties-->
    <!--Scanner configuration-->
    <!--Comm port device name-->
    <prop name="port" value="COM1"/>
    <!--Baud rate, default=9600, valid values are: 9600, 19200, 38400, 57600, 115200-->
    <prop name="baud" value="9600"/>
    <!--Data bits, default=7, valid values are: 5, 6, 7, 8-->
    <prop name="databits" value="8"/>
    <!--Stop bits, default=1, valid values are: 1=1 stop bit, 2=2 stop bits, 3=1.5 stop bits-->
    <prop name="stopbits" value="1"/>
    <!--Parity, default='O' (Odd), valid values are: 'N'one, 'O'dd, 'E'ven, 'M'ark, 'S'pace-->
    <prop name="parity" value="O"/>
    <!--Port mode, default='B', valid values are: 'B'=Nixdorf-B-->
    <prop name="mode" value="B"/>
    <!--UPC-A Length, default=13, indicates the number of digits generated by the scanner-->
    <!--for UPC-A labels based on the scanner's preamble and check digit settings.-->
    <!--The scanner service uses this value to determine when supplementals are present.-->
    <!--The default value of 13 assumes preamble is set to system character-->
    <!--and country code and that transmit check digit is enabled-->
    <prop name="UPCALength" value="13"/>
    <!--UPC-E Length, default=7, indicates the number of digits generated by the scanner-->
    <!--for UPC-E labels based on the scanner's preamble and check digit settings.-->
    <!--The scanner service uses this value to determine when supplementals are present.-->
    <!--The default value of 7 assumes preamble is set to system character-->
    <!--only and that transmit check digit is disabled-->
    <prop name="UPCELength" value="7"/>

    <!--Scanner type, default=0, valid values are: 7 - NixdofrUSB-->
    <prop name="ScannerType" value="7"/>
    <prop name="ExclusiveClaimLevel" value="0" />
</JposEntry>

<JposEntry logicalName="ZebraScannerUSB">
    <creation factoryClass="com.motorola.jpos.service.scanner.SymScannerSvc112Factory" serviceClass="com.motorola.jpos.service.scanner.SymScannerSvc112"/>
    <vendor name="Zebra Technologies" url="https://www.zebra.com"/>
    <jpos category="Scanner" version="1.12"/>
    <product description="Zebra USB" name="Zebra Scanner" url="https://www.zebra.com"/>

    <!--Other non JavaPOS required properties-->
    <!--Comm port device name, must be 'USB' for USB scanner-->
    <prop name="port" value="USB"/>
    <!--Scanner type, default=0, valid values are: 6 - IBM HID-->
    <prop name="ScannerType" value="6"/>
    <prop name="ExclusiveClaimLevel" value="1" />
</JposEntry>

<JposEntry logicalName="IBM HANDHELD">
    <creation factoryClass="com.motorola.jpos.service.scanner.SymScannerSvc112Factory" serviceClass="com.motorola.jpos.service.scanner.SymScannerSvc112"/>
    <vendor name="Zebra Technologies" url="https://www.zebra.com"/>
    <jpos category="Scanner" version="1.12"/>
    <product description="Zebra USB" name="Zebra Scanner" url="https://www.zebra.com" />

    <!--Other non JavaPOS required properties-->
    <!--Comm port device name, must be 'USB' for USB scanner-->
    <prop name="port" value="USB"/>
    <!--Scanner type, default=0, valid values are: 6 - IBM HID-->
    <prop name="ScannerType" value="6"/>
    <prop name="ExclusiveClaimLevel" value="1" />
</JposEntry>

<JposEntry logicalName="ZebraUSBTableTop">
    <creation factoryClass="com.motorola.jpos.service.scanner.SymScannerSvc112Factory" serviceClass="com.motorola.jpos.service.scanner.SymScannerSvc112"/>
    <vendor name="Zebra Technologies" url="https://www.zebra.com"/>
    <jpos category="Scanner" version="1.12"/>
    <product description="Zebra USB Scanner" name="Zebra Scanner" url="https://www.zebra.com"/>

    <!--Other non JavaPOS required properties-->
    <!--Comm port device name, must be 'USB' for USB scanner-->
    <prop name="port" value="USBIBMTT"/>
    <!--Scanner type, default=0, valid values are: 18944=TableTop(0x4A00)-->
    <!--prop name="ScannerType" value="18944"-->
    <prop name="ScannerType" value="9"/>
    <prop name="ExclusiveClaimLevel" value="0" />
</JposEntry>

<JposEntry logicalName="ZebraUSBHandHeld">
    <creation factoryClass="com.motorola.jpos.service.scanner.SymScannerSvc112Factory" serviceClass="com.motorola.jpos.service.scanner.SymScannerSvc112"/>
    <vendor name="Zebra Technologies" url="https://www.zebra.com"/>
    <jpos category="Scanner" version="1.12"/>
    <product description="Zebra USB Scanner" name="Zebra Scanner" url="https://www.zebra.com"/>

    <!--Other non JavaPOS required properties-->
    <!--Comm port device name, must be 'USB' for USB scanner-->
    <prop name="port" value="USBIBMHID"/>
    <!--Scanner type, default=0, valid values are: 19200=HandHeld(0x4B00)-->
    <prop name="ScannerType" value="19200"/>
    <prop name="ExclusiveClaimLevel" value="0" />
</JposEntry>

<JposEntry logicalName="ZebraUSBOPOS">
    <creation factoryClass="com.motorola.jpos.service.scanner.SymScannerSvc112Factory" serviceClass="com.motorola.jpos.service.scanner.SymScannerSvc112"/>
    <vendor name="Zebra Technologies" url="https://www.zebra.com"/>
    <jpos category="Scanner" version="1.12"/>
    <product description="Zebra USB Scanner" name="Zebra Scanner" url="https://www.zebra.com"/>

    <!--Other non JavaPOS required properties-->
    <!--Comm port device name, must be 'USB' for USB scanner-->
    <prop name="port" value="USBOPOS"/>
    <!--Scanner type, default=0, valid values are: 13 -->
    <prop name="ScannerType" value="13"/>
    <prop name="ExclusiveClaimLevel" value="0" />
</JposEntry>

<JposEntry logicalName="ZebraScannerSNAPI">
    <creation factoryClass="com.motorola.jpos.service.scanner.SymScannerSvc112Factory" serviceClass="com.motorola.jpos.service.scanner.SymScannerSvc112"/>
    <vendor name="Zebra Technologies" url="https://www.zebra.com"/>
    <jpos category="Scanner" version="1.12"/>
    <product description="Zebra SNAPI Scanner" name="Zebra Scanner" url="https://www.zebra.com"/>

    <!--Other non JavaPOS required properties-->
    <!--Comm port device name, must be 'USB' for USB scanner-->
    <prop name="port" value="SNAPI"/>
    <!--Scanner type, default=0, valid values are: 2 - SNAPI-->
    <prop name="ScannerType" value="2"/>
    <prop name="ExclusiveClaimLevel" value="0" />
</JposEntry>


<JposEntry logicalName="ZebraAllScanners">
    <creation factoryClass="com.motorola.jpos.service.scanner.SymScannerSvc112Factory" serviceClass="com.motorola.jpos.service.scanner.SymScannerSvc112"/>
    <vendor name="Zebra Technologies" url="https://www.zebra.com"/>
    <jpos category="Scanner" version="1.12"/>
    <product description="Zebra Serial/USB Scanner" name="Zebra Scanner" url="https://www.zebra.com"/>

    <!--Scanner type, default=0, valid values are: 1- ALL Scanners-->
    <prop name="ScannerType" value="1"/>
    <prop name="ExclusiveClaimLevel" value="0" />
</JposEntry>

<JposEntry logicalName="IBM HANDHELD">
    <creation factoryClass="com.motorola.jpos.service.scanner.SymScannerSvc112Factory" serviceClass="com.motorola.jpos.service.scanner.SymScannerSvc112"/>
    <vendor name="Zebra Technologies" url="https://www.zebra.com"/>
    <jpos category="Scanner" version="1.12"/>
    <product description="Zebra Serial/USB Scanner" name="Zebra Scanner" url="https://www.zebra.com"/>

    <!--Scanner type, default=0, valid values are: 1- ALL Scanners-->
    <prop name="ScannerType" value="1"/>
    <prop name="ExclusiveClaimLevel" value="0" />
</JposEntry>


<JposEntry logicalName="ZebraScale">
    <creation factoryClass="com.motorola.jpos.service.SvcServiceInstanceFactoryImpl" serviceClass="com.motorola.jpos.service.scale.ScaleService113Impl"/>
    <vendor name="Zebra Technologies" url="https://www.zebra.com"/>
    <jpos   category="Scale" version="1.13"/>
    <product description="Zebra Scale" name="Zebra Scale" url="https://www.zebra.com"/>     
    <prop name="ErrorOnSameWeight" value="1"/>
</JposEntry>

2 ответа

Решение

Логическое имя JPOS "ZebraAllScanners" позволяет сканерам на разных USB-портах передавать штрих-коды в один экземпляр приложения с весенней загрузкой.

            <JposEntry logicalName="ZebraAllScanners">
                            <creation factoryClass="com.motorola.jpos.service.scanner.SymScannerSvc112Factory" serviceClass="com.motorola.jpos.service.scanner.SymScannerSvc112"/>
                            <vendor name="Zebra Technologies" url="https://www.zebra.com"/>
                            <jpos category="Scanner" version="1.12"/>
                            <product description="Zebra Serial/USB Scanner" name="Zebra Scanner" url="https://www.zebra.com"/>

                            <!--Scanner type, default=0, valid values are: 1- ALL Scanners-->
                            <prop name="ScannerType" value="1"/>
                            <prop name="ExclusiveClaimLevel" value="0" />
            </JposEntry>

Я думаю, что это, вероятно, стало ясно. В дополнительном запросе объяснения, написанном в комментарии, нет необходимости.

Это потому, что оригинальный дизайн объекта службы является неправильным. Служебные объекты не создаются, чтобы одно приложение могло одновременно использовать несколько сканеров одного и того же поставщика.

Возможно, из-за особенностей языка Java, поставщик создал проблему, пытаясь легко реализовать контроль исключений, который трудно реализовать.

Если вы хотите использовать несколько сканеров одновременно, рассмотрите конфигурацию устройства, чтобы каждый сканер работал с отдельным сервисным объектом.

Что касается jpos.xml, то все сканеры Zebra, похоже, используют один и тот же сервисный объект, поэтому подготовьте сканер другого поставщика.


К тому же:

"рассмотреть возможность настройки устройства таким образом, чтобы каждый сканер работал на отдельном сервисном объекте" означает, например, при одновременном подключении множества сканеров к одному POS, например, Zebra DS2208 в качестве первого устройства, Honeywell Genesis 7580g в качестве второго Устройство и Denso-Wave QK30, как третье устройство, не подключают несколько сканеров одного производителя.

Причина в том, что в следующей части каждой записи устройства в jpos.xml указан служебный объект для работы, но даже если это другой сканер (например, "ZebraScannerSerial" и "ZebraScannerUSB"), это содержимое Если они одинаковы, то же самое Сервисный объект будет считаться работающим.

 <creation factoryClass="com.motorola.jpos.service.scanner.SymScannerSvc112Factory" serviceClass="com.motorola.jpos.service.scanner.SymScannerSvc112"/>

И если считается, что один и тот же объект службы Zebra имеет общую переменную '_fClaimed', возникает вопрос о явлении.

Другие вопросы по тегам