niimbot-d110-pc: черновик
All checks were successful
Build and deploy mmote.ru / Build-And-Deploy (push) Successful in 21s
BIN
content/posts/niimbot-d110-pc/2devices.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
content/posts/niimbot-d110-pc/BluetoothView.png
Normal file
After Width: | Height: | Size: 7.6 KiB |
BIN
content/posts/niimbot-d110-pc/UB500.jpg
Normal file
After Width: | Height: | Size: 6.0 KiB |
BIN
content/posts/niimbot-d110-pc/aa1in.png
Normal file
After Width: | Height: | Size: 6.6 KiB |
BIN
content/posts/niimbot-d110-pc/aa1out.jpg
Normal file
After Width: | Height: | Size: 87 KiB |
BIN
content/posts/niimbot-d110-pc/aa2in.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
content/posts/niimbot-d110-pc/aa2out.jpg
Normal file
After Width: | Height: | Size: 91 KiB |
BIN
content/posts/niimbot-d110-pc/cmd_print.png
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
content/posts/niimbot-d110-pc/cmd_venv.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
content/posts/niimbot-d110-pc/fakepaper.jpg
Normal file
After Width: | Height: | Size: 84 KiB |
BIN
content/posts/niimbot-d110-pc/gridin.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
content/posts/niimbot-d110-pc/gridout.jpg
Normal file
After Width: | Height: | Size: 1.0 MiB |
256
content/posts/niimbot-d110-pc/index.md
Normal file
@ -0,0 +1,256 @@
|
|||||||
|
---
|
||||||
|
title: Niimbot D110 - печатаем этикетки с компьютера
|
||||||
|
date: 2024-05-31T19:54:14+03:00
|
||||||
|
draft: true
|
||||||
|
categories:
|
||||||
|
- misc
|
||||||
|
featured_image: miniature.jpg
|
||||||
|
lastmod: 2024-06-02T23:00:55+03:00
|
||||||
|
tags:
|
||||||
|
- bluetooth
|
||||||
|
- python
|
||||||
|
- windows
|
||||||
|
telegram_entry_id: mmotium/10
|
||||||
|
description: Пробуем печать на Bluetooth принтере этикеток с помощью компьютера, Bluetooth адаптера и Python
|
||||||
|
---
|
||||||
|
|
||||||
|
Захотелось мне компактный принтер этикеток приобрести. Чтобы там коробочки и бутылочки всякие маркировать.
|
||||||
|
Выбор пал на нынче популярный Bluetooth принтер Niimbot D110.
|
||||||
|
|
||||||
|
Приложение для него существует только для телефона. Это удобно в тех условиях, когда нет компьютера под рукой.
|
||||||
|
И в случае, если приложение сделано хорошо.
|
||||||
|
|
||||||
|
<!--more-->
|
||||||
|
|
||||||
|
А пока мы имеем:
|
||||||
|
|
||||||
|
* при каждом входе в приложение нужно посмотреть рекламу;
|
||||||
|
* в приложении для сохранения шаблонов требуется регистрация;
|
||||||
|
* шрифты при пикселизации выглядят жутковато, непонятно как будет выглядеть этикетка до печати;
|
||||||
|
* дизайнить этикетки с помощью пальца - то ещё удовольствие;
|
||||||
|
* для просмотра заготовок, иконок требуется включать VPN;
|
||||||
|
* оптимизация оставляет желать лучшего, всё тормозит.
|
||||||
|
|
||||||
|
Поэтому попробуем напечатать этикетки при помощи компьютера.
|
||||||
|
|
||||||
|
Существует проект [AndBondStyle/niimprint](https://github.com/AndBondStyle/niimprint) (доработанный форк [kjy00302/niimprint](https://github.com/kjy00302/niimprint)) на Python. Проект реализует протокол обмена принтера и позволяет печатать картинки с компьютера по Bluetooth. Если последнего на компьютере нет, то необходим адаптер. У меня такой:
|
||||||
|
|
||||||
|
![UB500.jpg](UB500.jpg "Tp-Link UB500")
|
||||||
|
|
||||||
|
Ко всему прочему при печати этим способом игнорируется проверка оригинальности ленты, поэтому можно печатать на чём попало.
|
||||||
|
Для тестов я вставлял куски чеков, чтобы не тратить этикетки.
|
||||||
|
|
||||||
|
## Определение mac адреса принтера
|
||||||
|
|
||||||
|
Данные моего принтера:
|
||||||
|
|
||||||
|
```
|
||||||
|
Серийный номер: G326030306
|
||||||
|
Аппаратная версия: 13.10
|
||||||
|
Версия прошивки: 13.10
|
||||||
|
```
|
||||||
|
|
||||||
|
У принтера два mac адреса. Один обычный, другой - BLE. В моём случае это:
|
||||||
|
|
||||||
|
* `03:26:03:C3:F9:11` - нужный
|
||||||
|
* `26:03:03:c3:f9:11` - BLE
|
||||||
|
|
||||||
|
Нужный нужный адрес я нашёл с помощью [BluetoothView](https://www.nirsoft.net/utils/bluetooth_viewer.html).
|
||||||
|
Утилита не показывает BLE устройства, а это как раз нам и надо.
|
||||||
|
|
||||||
|
![](BluetoothView.png)
|
||||||
|
|
||||||
|
## Настройка niimprint
|
||||||
|
|
||||||
|
Теперь займёмся niimprint. Инструкция для Windows.
|
||||||
|
|
||||||
|
1. Устанавливаем Python 3.11+, если ещё это не сделали. Открываем окно команд.
|
||||||
|
|
||||||
|
2. Клонируем или скачиваем репозиторий
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
git clone https://github.com/AndBondStyle/niimprint
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Переходим в директорию репозитория
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
cd niimprint
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Создаем и активируем виртуальное окружение, чтобы не засорять глобальный список пакетов
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
python -m venv venv
|
||||||
|
|
||||||
|
venv\Scripts\activate
|
||||||
|
```
|
||||||
|
|
||||||
|
![](cmd_venv.png)
|
||||||
|
|
||||||
|
5. Теперь устанавливаем зависимости. Тут уже как больше хочется.
|
||||||
|
|
||||||
|
- Напрямую
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
Далее из-за того, что проект выполнен в виде модуля, [чтобы всё работало](https://github.com/AndBondStyle/niimprint/issues/24), нужно выполнить
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
set PYTHONPATH=<текущий путь>
|
||||||
|
```
|
||||||
|
|
||||||
|
Например
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
set PYTHONPATH=D:\Apps\niimprint
|
||||||
|
:: или
|
||||||
|
set PYTHONPATH=%cd%
|
||||||
|
```
|
||||||
|
|
||||||
|
- Через Poetry как задумывалось автором
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
pip install poetry
|
||||||
|
|
||||||
|
poetry install
|
||||||
|
```
|
||||||
|
|
||||||
|
5. Запускаем печать
|
||||||
|
|
||||||
|
- Напрямую
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
python niimprint --model d110 --conn bluetooth --addr 03:26:03:C3:F9:11 --rotate 90 --density 2 --image template_15x30.png
|
||||||
|
```
|
||||||
|
|
||||||
|
`--model d110` — модель принтера d110
|
||||||
|
|
||||||
|
`--conn bluetooth` — тип соединения bluetooth
|
||||||
|
|
||||||
|
`--addr 03:26:03:C3:F9:11` — bluetooth адрес
|
||||||
|
|
||||||
|
`--rotate 90` — использовать альбомную ориентацию картинки
|
||||||
|
|
||||||
|
`--density 2` — плотность 3 (1-3 для d110)
|
||||||
|
|
||||||
|
`--image template_15x30.png` — изображение для печати
|
||||||
|
|
||||||
|
![](cmd_print.png)
|
||||||
|
|
||||||
|
- Через Poetry
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
poetry run <команда выше>
|
||||||
|
```
|
||||||
|
|
||||||
|
В первый раз появится запрос сопряжения
|
||||||
|
|
||||||
|
![new_device](new_device.png)
|
||||||
|
|
||||||
|
![pairing](pairing.png)
|
||||||
|
|
||||||
|
Если mac адрес указан верно, то сопряжение завершится успешно и сразу начнётся печать.
|
||||||
|
|
||||||
|
### Упрощение печати - добавление принтера в меню "Отправить"
|
||||||
|
|
||||||
|
1. В адресной строке проводника ввести `shell:sendto` и нажать Enter.
|
||||||
|
|
||||||
|
2. В открывшейся директории создать файл `niimprint.cmd` или с другим именем по желанию.
|
||||||
|
|
||||||
|
3. Содержимое файла отредактировать под себя:
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
@echo off
|
||||||
|
|
||||||
|
set NIIMPRINT_DIR=D:\Apps\niimprint
|
||||||
|
|
||||||
|
set PYTHONPATH=%NIIMPRINT_DIR%
|
||||||
|
cd /d %NIIMPRINT_DIR%
|
||||||
|
venv\Scripts\python.exe niimprint --model d110 --conn bluetooth --addr 03:26:03:C3:F9:11 --rotate 90 --density 2 --image "%1"
|
||||||
|
|
||||||
|
if %errorlevel% neq 0 pause
|
||||||
|
```
|
||||||
|
|
||||||
|
Теперь кликаем правой кнопкой по картинке и выбираем `niimprint.cmd`
|
||||||
|
|
||||||
|
![sendto](sendto.png)
|
||||||
|
|
||||||
|
При успешной печати окно команд закроется, при ошибке - останется открытым.
|
||||||
|
|
||||||
|
## Подготовка изображений
|
||||||
|
|
||||||
|
[Разрешение печати](https://github.com/AndBondStyle/niimprint/tree/main?tab=readme-ov-file#image-resolution) у D110 - 8 пикселей на мм (~203 dpi). Максимальная высота печати - 15 мм.
|
||||||
|
|
||||||
|
Максимальная высота картинки: `8 пикс. * 15 мм = 120 пикс.`
|
||||||
|
|
||||||
|
Но на деле - немного меньше - 96 пикс. Это максимальное разрешение печатающей головки.
|
||||||
|
|
||||||
|
Итак, для этикетки шириной 30 мм и высотой 15 мм разрешение картинки должно быть `240 x 96` пикс. Также нужно отступить немного от краёв, так как позиционирование не совсем точное.
|
||||||
|
|
||||||
|
**Картинки лучше сразу преобразовывать в чёрно-белые, без оттенков серого**. Так можно сразу понять как будет выглядеть этикетка.
|
||||||
|
Вот, например, как будет выглядеть шрифт, у которого остались оттенки серого:
|
||||||
|
|
||||||
|
![](aa1in.png)
|
||||||
|
|
||||||
|
![](aa1out.jpg)
|
||||||
|
|
||||||
|
Шрифт стал страшным и зубастым (как и происходит при печати с телефона). А теперь изначально сделаем картинку чёрно-белой:
|
||||||
|
|
||||||
|
![](aa2in.png)
|
||||||
|
|
||||||
|
![](aa2out.jpg)
|
||||||
|
|
||||||
|
Так уже лучше. Поэтому нужно сразу использовать шрифты, которые нормально будут выглядеть без сглаживания.
|
||||||
|
|
||||||
|
Как выглядит градиент и пиксельная сетка (слева артефакт от прошлой печати, повторно использовал этикетку):
|
||||||
|
|
||||||
|
![](gridin.png)
|
||||||
|
|
||||||
|
![](gridout.jpg)
|
||||||
|
|
||||||
|
### Мои шаблоны для этикеток
|
||||||
|
|
||||||
|
![Шаблон 15x30мм (240x96)](template_15x30.png "15x30мм (240x96)")
|
||||||
|
|
||||||
|
![](label15x30.jpg)
|
||||||
|
|
||||||
|
## Прочее полезное
|
||||||
|
|
||||||
|
### Как печатать с телефона на любой термобумаге
|
||||||
|
|
||||||
|
Может пригодиться для проверки что получится при печати, а этикетки тратить не хочется.
|
||||||
|
|
||||||
|
1. Вставить замену бумаги лицевой стороной вниз
|
||||||
|
|
||||||
|
![fakepaper](fakepaper.jpg)
|
||||||
|
|
||||||
|
2. Приложить оригинальную ленту этикеткой к корпусу
|
||||||
|
|
||||||
|
![paperontop](paperontop.jpg)
|
||||||
|
|
||||||
|
3. Закрыть крышку.
|
||||||
|
|
||||||
|
После закрытия крышки принтер прочитает через корпус RFID метку на бобине и поймёт, что в него вставлена оригинальная лента.
|
||||||
|
После этого ленту можно убрать.
|
||||||
|
|
||||||
|
> ⚠ Нужно понимать, что принтер каким-то образом понимает, сколько он отпечатал этикеток с конкретного картриджа
|
||||||
|
> (записывает в RFID метку или в собственную память).
|
||||||
|
> И, скорее всего, не станет печатать с телефона, когда посчитает, что исчерпал количество этикеток.
|
||||||
|
>
|
||||||
|
> Печати через niimprint это не касается, проверка картриджа происходит на стороне клиента.
|
||||||
|
> Сам принтер проверяет только есть ли лента рядом с головкой (оптический датчик).
|
||||||
|
|
||||||
|
|
||||||
|
### Дамп RFID метки оригинального картриджа (Mifare Ultralight)
|
||||||
|
|
||||||
|
![](original15x30.jpg)
|
||||||
|
|
||||||
|
```hexdump
|
||||||
|
1DAB437D
|
||||||
|
D38C0000
|
||||||
|
5FA380FF
|
||||||
|
E1101200
|
||||||
|
```
|
BIN
content/posts/niimbot-d110-pc/label15x30.jpg
Normal file
After Width: | Height: | Size: 86 KiB |
BIN
content/posts/niimbot-d110-pc/miniature.jpg
Normal file
After Width: | Height: | Size: 123 KiB |
BIN
content/posts/niimbot-d110-pc/new_device.png
Normal file
After Width: | Height: | Size: 4.1 KiB |
BIN
content/posts/niimbot-d110-pc/original15x30.jpg
Normal file
After Width: | Height: | Size: 82 KiB |
BIN
content/posts/niimbot-d110-pc/pairing.png
Normal file
After Width: | Height: | Size: 7.5 KiB |
BIN
content/posts/niimbot-d110-pc/paperontop.jpg
Normal file
After Width: | Height: | Size: 105 KiB |
BIN
content/posts/niimbot-d110-pc/sendto.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
content/posts/niimbot-d110-pc/template_15x30.kra
Normal file
BIN
content/posts/niimbot-d110-pc/template_15x30.png
Normal file
After Width: | Height: | Size: 500 B |