mmote.ru/content/posts/niimbot-d110-pc/index.md
MultiMote 96a7507766
All checks were successful
Build and deploy mmote.ru / Build-And-Deploy (push) Successful in 21s
niimbot-d110-pc: черновик
2024-06-02 23:03:18 +03:00

257 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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
```