This commit is contained in:
2026-10-13 13:50:34 +07:00
parent d77638308e
commit 0fa88bca22
7 changed files with 303 additions and 15 deletions
+47
View File
@@ -0,0 +1,47 @@
# Печать чеков команды на MXW01
Печать работает только на локальной площадке (`APP_MODE=venue`). На вкладке
«Команды» выберите «Печать чека» → проверьте предпросмотр → нажмите «Печатать».
Firefox и Chrome используют один серверный API; Web Bluetooth и настройки
браузера не нужны. Сервер берёт название и пароль команды из базы, а адрес QR —
из `APP_BASE_URL` площадки.
## Настройка площадки на Linux
1. Сервер venue и MXW01 должны находиться рядом на одном Linux-компьютере
с включённым Bluetooth. Установите термобумагу и включите принтер.
2. В локальном `venue/.env` задайте `MXW01_ADDRESS=<Bluetooth MAC принтера>`.
Адрес текущего MXW01 уже настроен локально; `.env` не включается в Git.
3. Соберите комплект существующей командой `make build`, затем запустите
`make venue`. Служба `receipt_printer` запускается из того же Go-образа.
4. Если приложение телефона подключено к принтеру, закройте его.
Служба печати использует прямое Bluetooth LE-соединение. Её контейнер работает
с `network_mode: host` и `NET_RAW`, без `privileged`, доступа к базе и TCP-порта.
API передаёт растровые данные через закрытый Unix-сокет в общем Docker-volume.
Остальные контейнеры сохраняют существующую сеть. Python, Bleak и BlueZ D-Bus
для печати не нужны.
Без `MXW01_ADDRESS` игра продолжает работать; при попытке печати сервер сообщает,
что принтер не настроен. На публичном сервере кнопки печати нет, и API её запрещает.
## Поведение и проверка
- За один запрос печатается один чек шириной 384 пикселя. Одновременный запрос
получает сообщение «принтер занят»; постоянной очереди нет.
- Сервер проверяет бумагу и состояние MXW01, затем ждёт подтверждение завершения
и проверяет контрольную сумму изображения. Общий таймаут — 110 секунд.
- Длинное название переносится. Неподдерживаемые символы, слишком длинная ссылка
или чек выше 1024 пикселей отклоняются до печати.
- После разрыва связи или таймаута сначала проверьте бумажный чек: он мог уже
выйти. Автоматической повторной печати нет. После устранения проблемы повторите
печать вручную; спящий принтер разбудите кнопкой.
- Перед игрой напечатайте две разные команды, проверьте названия и отсканируйте
QR телефоном в Wi-Fi площадки. Ссылка должна открывать напечатанную команду.
Чек содержит ссылку доступа команды; передавайте его участникам этой команды.
PNG-предпросмотр требует авторизации и отдаётся с `Cache-Control: no-store`.
Протокол проверен на текущем MXW01: фактический ответ состояния содержит
10 байт, а ответ завершения — подтверждение и две копии CRC изображения.
Источник описания формата: [измерения протокола MXW01](https://github.com/eliorpom-cmd/print-on-my-desk/blob/main/docs/09-protocol.md).