Довідник конфігурації Abhard
abhard — демон керування обладнанням (порт за замовчуванням 4601). Конфігурація зчитується з
файлу abhard.ini та файлу аутентифікації tokens.json, що знаходяться за платформно-специфічними
шляхами пошуку.
Розташування файлу конфігурації
Файли шукаються в наступному порядку, використовується перший знайдений:
Linux: $XDG_CONFIG_HOME/abacus/ · /opt/abacus/etc/ · /etc/abacus/ · директорія виконуваного файлу
Windows: %LOCALAPPDATA%\Abacus\ · %APPDATA%\Abacus\ · %ProgramData%\Abacus\ · директорія виконуваного файлу
Якщо файл не знайдено, стандартний конфіг буде створений у першій доступній для запису директорії.
Секція [main]
| Ключ | Типово | Опис |
|---|---|---|
port |
4601 |
HTTP-порт прослуховування |
logfile |
abhard.log |
Шлях до файлу журналу (абсолютний або відносно виконуваного файлу) |
whitelist |
127.0.0.1 |
Дозволені IP-адреси через крапку з комою; підтримуються діапазони (192.168.1.1-10) і CIDR (192.168.0.0/24) |
event_socket |
true |
Увімкнути сервер сокетів подій |
event_socket_host |
авто | Адреса прив'язки; автоматично визначається як перша адреса 192.168.x.x, потім будь-яка не-петльова IP, інакше 127.0.0.1 |
event_socket_port |
4651 |
Порт сервера сокетів подій |
event_socket_ping_idle |
4 |
Інтервал keepalive-пінгу (секунди) у відсутність подій |
Секції пристроїв ([device_*])
Кожна секція [device_*] визначає один апаратний пристрій. Ім'я секції може бути довільним, але
має починатися з device. Загальні поля для всіх пристроїв:
| Ключ | Обов'язково | Опис |
|---|---|---|
name |
Ні | Назва пристрою; за замовчуванням — ім'я секції |
type |
Так | Тип пристрою: scanner, printer, scales, prro |
subtype |
Так* | Дивіться таблиці нижче (* не використовується для scales) |
type = scanner
subtype = serial
Сканер штрихкодів через RS-232/UART.
| Ключ | Типово | Опис |
|---|---|---|
device |
— | Послідовний порт (наприклад /dev/ttyS0, COM1) |
baudrate |
9600 |
Швидкість передачі |
bits |
8 |
Біти даних |
parity |
N |
N · E · O · S · M |
stopbits |
1 |
Стоп-біти |
softflow |
false |
Програмне керування потоком XON/XOFF |
hardflow |
false |
Апаратне керування потоком RTS/CTS |
Захардкоджено: пауза завершення штрихкоду 75 мс; затримка циклу 20 мс.
subtype = hid (тільки Linux)
USB HID-сканер через libusb.
| Ключ | Типово | Опис |
|---|---|---|
vendor_id |
— | Ідентифікатор виробника USB у шістнадцятковому форматі (наприклад 0x0456) |
product_id |
— | Ідентифікатор пристрою USB у шістнадцятковому форматі (наприклад 0x0100) |
Захардкоджено: таймаут читання USB 500 мс; роздільник між скануваннями 1 с.
subtype = devfile (тільки Linux)
USB HID-сканер через файл пристрою /dev/hidraw*.
| Ключ | Типово | Опис |
|---|---|---|
device |
— | Шлях до файлу пристрою (наприклад /dev/hidraw0) |
Захардкоджено: пауза завершення штрихкоду 50 мс; таймаут select() 200 мс.
subtype = redirect
Проксіює запити сканування до іншого екземпляра abhard по HTTP.
| Ключ | Типово | Опис |
|---|---|---|
redirect_url |
— | Повна URL-адреса ендпоінту віддаленого сканера |
redirect_name |
— | Необов'язкова відображувана назва для проксі-цілі |
type = printer
subtype = escpos
Чековий принтер ESC/POS через файл пристрою.
| Ключ | Типово | Опис |
|---|---|---|
device |
— | Файл пристрою (наприклад /dev/usb/lp0, /dev/ttyS1) |
width |
40 |
Ширина паперу в символах |
codepage |
(немає) | Індекс кодової сторінки ESC/POS (ESC t n); пропустіть, щоб не ініціалізувати |
softrender |
false |
true = програмна генерація QR-коду; false = апаратна команда ESC/POS |
feed_lines |
3 |
Кількість рядків протяжки після кінця документа |
subtype = dummy
Записує завдання друку у файли замість апаратного пристрою (для тестування).
| Ключ | Типово | Опис |
|---|---|---|
target_dir |
(stdout) | Директорія для вихідних файлів; якщо порожньо — виводить у журнал |
width |
40 |
Ширина рядка в символах |
type = scales
Ваги з RS-232, зважування одного значення; subtype ігнорується.
| Ключ | Типово | Опис |
|---|---|---|
device |
/dev/ttyS0 |
Послідовний порт |
model |
VTA16 |
VTA16 або DigiDS |
timeout |
5000 |
Максимальний час очікування відповіді ваг (мс) |
baudrate |
9600 |
Швидкість передачі |
bits |
8 |
Біти даних |
parity |
N |
N · E · O · S · M |
stopbits |
1 |
Стоп-біти |
softflow |
false |
XON/XOFF |
hardflow |
false |
RTS/CTS |
Захардкоджено: повтор із наростанням — початок 100 мс, приріст 200 мс за спробу, максимум 1000 мс.
type = prro / subtype = eusign
Програмний реєстратор розрахункових операцій (ПРРО) через бібліотеку EUSignCP.
| Ключ | Типово | Опис |
|---|---|---|
key_path |
— | Шлях до файлу приватного ключа (.dat); відносні шляхи — відносно директорії виконуваного файлу |
key_password |
— | Пароль до приватного ключа |
certs_path |
(за замовчуванням бібліотеки) | Директорія з сертифікатами та CRL |
lib_path |
/opt/abacus/lib/ (Linux) |
Директорія бібліотеки EUSignCP |
proxy_address |
(немає) | Хост HTTP-проксі |
proxy_port |
0 |
Порт HTTP-проксі |
proxy_user |
(немає) | Логін для проксі |
proxy_pass |
(немає) | Пароль для проксі |
timeout_ms |
30000 |
Таймаут HTTP-запиту (мс) |
http_retries |
2 |
Кількість повторів при помилці HTTP |
http_retry_delay_ms |
1000 |
Затримка між повторами (мс) |
Аутентифікація — tokens.json
Шляхи пошуку (той самий порядок, що й для конфіг-файлу):
Linux: /opt/abacus/etc/tokens.json · $XDG_CONFIG_HOME/abacus/ · директорія виконуваного файлу
Windows: %LOCALAPPDATA%\Abacus\ · %APPDATA%\Abacus\ · %ProgramData%\Abacus\ · директорія виконуваного файлу
{
"tokens": {
"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX": {
"role": "administrator",
"description": "Адміністраторський токен",
"created": "2026-01-01T00:00:00",
"expires": 0
},
"YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY": {
"role": "worker",
"description": "Каса №1",
"created": "2026-01-01T00:00:00",
"expires": "2027-01-01T00:00:00"
}
}
}
| Роль | Права доступу |
|---|---|
administrator |
Повний доступ, включно з керуванням токенами |
worker |
Стандартні операції; не може видавати Z-звіти та керувати токенами |
probationer |
Обмежений доступ; не може надсилати фіскальні документи Z-звіту |
expires: рядок дати/часу ISO 8601 або 0 / відсутнє поле — токен безстроковий. Прострочені токени відхиляються та видаляються автоматично.
Повний приклад abhard.ini
[main]
port = 4601
logfile = /var/log/abacus/abhard.log
whitelist = 127.0.0.1;192.168.0.0/24
event_socket = true
event_socket_host = 192.168.1.10
event_socket_port = 4651
event_socket_ping_idle = 4
[device_scanner_serial]
name = BarcodeScanner
type = scanner
subtype = serial
device = /dev/ttyS0
baudrate = 9600
bits = 8
parity = N
stopbits = 1
softflow = false
hardflow = false
[device_scanner_hid]
name = USBScanner
type = scanner
subtype = hid
vendor_id = 0x0456
product_id = 0x0100
[device_scanner_hidraw]
name = HidrawScanner
type = scanner
subtype = devfile
device = /dev/hidraw0
[device_scanner_remote]
name = RemoteScanner
type = scanner
subtype = redirect
redirect_url = http://192.168.1.20:4601/api/scaner/BarcodeScanner
redirect_name = Branch2Scanner
[device_printer]
name = ReceiptPrinter
type = printer
subtype = escpos
device = /dev/usb/lp0
width = 42
codepage = 0
softrender = false
feed_lines = 3
[device_printer_test]
name = TestPrinter
type = printer
subtype = dummy
target_dir = /tmp/print_jobs
width = 42
[device_scales]
name = Scales
type = scales
model = DigiDS
device = /dev/ttyS1
timeout = 5000
baudrate = 9600
bits = 8
parity = N
stopbits = 1
[device_prro]
name = FiscalRegister
type = prro
subtype = eusign
key_path = /opt/abacus/etc/keys/Key-6.dat
certs_path = /opt/abacus/etc/cert/
key_password = SecretPassphrase
proxy_address = proxy.company.com
proxy_port = 8080
http_retries = 2
http_retry_delay_ms = 1000
timeout_ms = 45000