Scan event
Scan event is an event message that notifies about a scan from a connected scanner.
Fields
Name | Type | Description | Accepted values | Constraints | Required |
|---|---|---|---|---|---|
| string | The API version in which this request is valid. |
| Yes | |
| string | The message type. |
| Yes | |
| string | The message identifier (UUID) of the event. | Example: | UUID format | Yes |
| integer | The UNIX timestamp in milliseconds when the message was created. |
| 1546300800000 <= value <= 99999999999999 | Yes |
| string | The scanned data when the message is of type 'scan' (excluding bytes that are invalid characters). | UTF-8 | 1 <= length <= 2000 | Yes |
| string | The scanned data when the message is of type 'scan' encoded in URL-safe Base64 (useful when scanning bytes that are no valid UTF-8). | Any | 1 <= length <= 2000 | No |
| string | The serial number of the scanner for which the command is intended. | Any | 1 <= length <= 128 | Yes |
| string | The model of the scanner. | LEO, MARK Basic, MARK 2, MARK 3, MARK Display, MAI | Only the accepted values are valid. | Yes |
| string | The serial number of the Gateway that will receive the command. | Any | 1 <= length <= 128 | Yes |
| string | The type of scan performed. |
| Only the accepted values are valid. | No |
| float | The time it takes to scan the barcode (from triggering to capturing the scanned content). | Any | value >= 0.0 | No |
| float | The temperature of the scanner. | Any | value >= 0.0 | No |
| integer | The current scanning session ID. | Any | value > 0 | No |
Example
{
"api_version": "1.0",
"event_type": "scan",
"event_id": "02114da8-feae-46e3-8b00-a3f7ea8672df",
"time_created": 1546300800000,
"scan_code": "Hello, World!",
"scan_bytes": "SGVsbG8sIFdvcmxkIQ==",
"device_serial": "MDMR000000064",
"device_model": "Mark Display",
"gateway_serial": "PGGW000000058",
"scan_mode": "SCAN_MODE_SINGLE",
"scan_duration": "1.23",
"device_temperature": "22.30",
"scan_session_id": 1
}Binary Scan Data
Streams API uses JSON as marshalling format and therefore any string in a message is implicitly UTF-8 encoded. But as some barcode symbologies allow for other character encoding such as binary strings we want to also represent data that is not UTf-8 encoded.
To allow the transport of arbitrary e.g. binary strings in Streams API scan event messages, the data is armored using Base64 encoding.
Base64 Encoding details
The data in scan_bytes is encoded using the URL-safe alphabet.
E.g. the following Python 3 code simulates the effect:
from base64 import urlsafe_b64encode as b64encode original_data : bytes = get_scan_data_from_somewhere() scan_message.scan_bytes = b64encode(original_data).decode()
Handling Binary Scan Data
To consume the binary scan data the Base64 encoding needs to be undone. E.g. in Python 3 this needs also conversion between UTF-8 encoded str strings as used by JSON and raw bytes:
from base64 import urlsafe_b64decode as b64decode
from typing import Any
def handle_scan_event(event: dict[str, Any]) -> bytes:
"""
Handler to react to a scan stream event.
"""
if "scan_bytes" not in event:
return
raw_bytes = b64decode(event["scan_bytes"].encode())
do_something_with_the_data(raw_bytes)