Skip to main content

barcode-server

A simple daemon to read barcodes from USB Barcode Scanners and expose them to other service using a websocket API.

asciicast

Features

How to use

Device Access Permissions

Ensure the user running this application is in the correct group for accessing input devices (usually input), like this:

sudo usermod -a -G input myusername

Native

# create venv
python -m venv ./venv
# enter venv
source ./venv/bin/activate
# install barcode-server
pip install barcode-server
# exit venv
deactivate
# launch application
./venv/bin/python3 barcode-server run

Docker

When starting the docker container, make sure to pass through input devices:

docker run \
  --name barcode \
  --device=/dev/input \
  markusressel/barcode-server

Note: Although barcode-server will continuously try to detect new devices, even when passing through /dev/input like shown above, new devices can not be detected due to the way docker works. If you need to detect devices in real-time, you have to use the native approach.

You can specify the user id and group id using the PUID and PGID environment variables.

Webserver

By default the webserver will listen to 127.0.0.1 on port 9654.

Authorization

When specified in the config, an API token is required to authorize clients, which must be passed using a X-Auth-Token header when connecting. Since barcode-scanner doesn't rely on any persistence, the token is specified in the configuration file and can not be changed on runtime.

Rest API

barcode-server provides a simple REST API to get some basic information. This API can not be used to retrieve barcode events. To do that you have to use one of the approaches described below.

Endpoint Description
/devices A list of all currently detected devices.

Websocket API

In addition to the REST API barcode-server also exposes a websocket at /, which can be used to get realtime barcode scan events.

Messages received on this websocket are JSON formatted strings with the following format:

{
  "device": {
    "name": "BARCODE SCANNER BARCODE SCANNER",
    "path": "/dev/input/event3",
    "vendorId": "ffff",
    "productId": "0035",
  },
  "barcode": "4250168519463"
}

To test the connection you can use f.ex. websocat:

> websocat ws://127.0.0.1:9654 --header "X-Auth-Token:EmUSqjXGfnQwn5wn6CpzJRZgoazMTRbMNgH7CXwkQG7Ph7stex"
{"device":{"name":"BARCODE SCANNER BARCODE SCANNER","path":"/dev/input/event3","vendorId":65535,"productId":53},"barcode":"D-t38409355843o52230Lm54784"}
{"device":{"name":"BARCODE SCANNER BARCODE SCANNER","path":"/dev/input/event3","vendorId":65535,"productId":53},"barcode":"4250168519463"}

HTTP Request

When configured, you can let barcode-scanner issue a HTTP request (defaults to POST) when a barcode is scanned, which provides the ability to push barcode events to a server that is unaware of any client. The body of the request will contain the same JSON as in the websocket API example.

To do this simply add the following section to your config:

barcode_server:
  [...]
  http:
    url: "https://my.domain.com/barcode"

Have a look at the example config for more options.

MQTT Publish

When configured, you can let barcode-scanner publish barcode events to a MQTT broker. The payload of the message will contain the same JSON as in the websocket API example.

To do this simply add the following section to your config:

barcode_server:
  [...]
  mqtt:
    host: "my.mqtt.broker"

Have a look at the example config for more options.

Statistics

barcode-server exposes a prometheus exporter (defaults to port 8000) to give some statistical insight.

FAQ

Can I lock the Barcode Scanner to this application?

Yes. Most barcode readers normally work like a keyboard, resulting in their input being evaluated by the system, which can clutter up your TTY or other open programs. barcode-server will try to grab input devices, making it the sole recipient of all incoming input events from those devices, which should prevent the device from cluttering your TTY.

If, for some reason, this does not work for you, try this:

Create a file /etc/udev/rules.d/10-barcode.rules:

SUBSYSTEM=="input", ACTION=="add", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", RUN+="/bin/sh -c 'echo remove > /sys$env{DEVPATH}/uevent'"
SUBSYSTEM=="input", ACTION=="add", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", DEVPATH=="*:1.0/*", KERNEL=="event*", RUN+="/bin/sh -c 'ln -sf /dev/input/$kernel /dev/input/barcode_scanner'"

Replace the idVendor and idProduct values with the values of your barcode reader (a 4 digit hex value with leading zeros). You can find them in the log output of barcode-reader or using lsusb with the wireless receiver attached to your computer.

Reload udev rules using:

udevadm control --reload

then remove and reinsert the wireless receiver. You should now have a symlink in /dev/input/barcode_scanner:

ls -lha /dev/input/barcode_scanner

which can be used in the device_paths section of the barcode-server config.

Source: This and That

Contributing

GitHub is for social coding: if you want to write code, I encourage contributions through pull requests from forks of this repository. Create GitHub tickets for bugs and new features and comment on the ones that you are interested in.

License

barcode-server is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <https://www.gnu.org/licenses/>.

Metadata

Release files for barcode-server 1.3.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for barcode-server 1.3.1
File Size Uploaded
barcode-server-1.3.1.tar.gz 24.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for barcode-server 1.3.1
File Interpreter ABI Platform
barcode_server-1.3.1-py3-none-any.whl Python 3 none any Details

Total release size: 54.3 kB

Release files / barcode-server-1.3.1.tar.gz

Download URL barcode-server-1.3.1.tar.gz
Size 24.2 kB
Tags Source
SHA-256 checksum
How to use checksums
6ea0430e2ac34b8d258b0e919e3d213b28440f4608aca95ab91c00dcb720d13f
BLAKE2b-256 checksum
How to use checksums
e176594a2c411be1a9ca35b7f33f7ea0dfee207c32a355fe14c873218374e283
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.6.0 requests/2.24.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.6

Release files / barcode_server-1.3.1-py3-none-any.whl

Download URL barcode_server-1.3.1-py3-none-any.whl
Size 30.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ac0d670f804e2610b720bb9b3d3b34b7d32210ab847a1d69e8abcb7d346118eb
BLAKE2b-256 checksum
How to use checksums
5df7de961e7607a21b964d03db1282a1feb6e9afdf1440b320f9c91a4972b04a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.6.0 requests/2.24.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.6

Release history Release notifications | RSS feed

2.5.0

2 release files

2.4.2

2 release files

2.4.1

2 release files

2.4.0

2 release files

2.3.3

2 release files

2.3.2

2 release files

2.3.1

2 release files

2.3.0

2 release files

2.2.2

2 release files

2.2.1

2 release files

2.2.0

2 release files

2.1.0

2 release files

2.0.1

2 release files

2.0.0

2 release files

1.4.1

2 release files

1.4.0

2 release files

This release

1.3.1 This release

2 release files

1.3.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page