diff --git a/content/posts/niimbot-d110-pc/2devices.png b/content/posts/niimbot-d110-pc/2devices.png new file mode 100644 index 0000000..a679de3 Binary files /dev/null and b/content/posts/niimbot-d110-pc/2devices.png differ diff --git a/content/posts/niimbot-d110-pc/BluetoothView.png b/content/posts/niimbot-d110-pc/BluetoothView.png new file mode 100644 index 0000000..4114133 Binary files /dev/null and b/content/posts/niimbot-d110-pc/BluetoothView.png differ diff --git a/content/posts/niimbot-d110-pc/UB500.jpg b/content/posts/niimbot-d110-pc/UB500.jpg new file mode 100644 index 0000000..0388e6e Binary files /dev/null and b/content/posts/niimbot-d110-pc/UB500.jpg differ diff --git a/content/posts/niimbot-d110-pc/aa1in.png b/content/posts/niimbot-d110-pc/aa1in.png new file mode 100644 index 0000000..fd03d93 Binary files /dev/null and b/content/posts/niimbot-d110-pc/aa1in.png differ diff --git a/content/posts/niimbot-d110-pc/aa1out.jpg b/content/posts/niimbot-d110-pc/aa1out.jpg new file mode 100644 index 0000000..fa39c9a Binary files /dev/null and b/content/posts/niimbot-d110-pc/aa1out.jpg differ diff --git a/content/posts/niimbot-d110-pc/aa2in.png b/content/posts/niimbot-d110-pc/aa2in.png new file mode 100644 index 0000000..9390b01 Binary files /dev/null and b/content/posts/niimbot-d110-pc/aa2in.png differ diff --git a/content/posts/niimbot-d110-pc/aa2out.jpg b/content/posts/niimbot-d110-pc/aa2out.jpg new file mode 100644 index 0000000..8855a67 Binary files /dev/null and b/content/posts/niimbot-d110-pc/aa2out.jpg differ diff --git a/content/posts/niimbot-d110-pc/cmd_print.png b/content/posts/niimbot-d110-pc/cmd_print.png new file mode 100644 index 0000000..e68595e Binary files /dev/null and b/content/posts/niimbot-d110-pc/cmd_print.png differ diff --git a/content/posts/niimbot-d110-pc/cmd_venv.png b/content/posts/niimbot-d110-pc/cmd_venv.png new file mode 100644 index 0000000..de6b375 Binary files /dev/null and b/content/posts/niimbot-d110-pc/cmd_venv.png differ diff --git a/content/posts/niimbot-d110-pc/fakepaper.jpg b/content/posts/niimbot-d110-pc/fakepaper.jpg new file mode 100644 index 0000000..ad9d140 Binary files /dev/null and b/content/posts/niimbot-d110-pc/fakepaper.jpg differ diff --git a/content/posts/niimbot-d110-pc/gridin.png b/content/posts/niimbot-d110-pc/gridin.png new file mode 100644 index 0000000..7184828 Binary files /dev/null and b/content/posts/niimbot-d110-pc/gridin.png differ diff --git a/content/posts/niimbot-d110-pc/gridout.jpg b/content/posts/niimbot-d110-pc/gridout.jpg new file mode 100644 index 0000000..162711d Binary files /dev/null and b/content/posts/niimbot-d110-pc/gridout.jpg differ diff --git a/content/posts/niimbot-d110-pc/index.md b/content/posts/niimbot-d110-pc/index.md new file mode 100644 index 0000000..4a2baa7 --- /dev/null +++ b/content/posts/niimbot-d110-pc/index.md @@ -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. + +Приложение для него существует только для телефона. Это удобно в тех условиях, когда нет компьютера под рукой. +И в случае, если приложение сделано хорошо. + + + +А пока мы имеем: + +* при каждом входе в приложение нужно посмотреть рекламу; +* в приложении для сохранения шаблонов требуется регистрация; +* шрифты при пикселизации выглядят жутковато, непонятно как будет выглядеть этикетка до печати; +* дизайнить этикетки с помощью пальца - то ещё удовольствие; +* для просмотра заготовок, иконок требуется включать 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 +``` diff --git a/content/posts/niimbot-d110-pc/label15x30.jpg b/content/posts/niimbot-d110-pc/label15x30.jpg new file mode 100644 index 0000000..a44f06e Binary files /dev/null and b/content/posts/niimbot-d110-pc/label15x30.jpg differ diff --git a/content/posts/niimbot-d110-pc/miniature.jpg b/content/posts/niimbot-d110-pc/miniature.jpg new file mode 100644 index 0000000..518faca Binary files /dev/null and b/content/posts/niimbot-d110-pc/miniature.jpg differ diff --git a/content/posts/niimbot-d110-pc/new_device.png b/content/posts/niimbot-d110-pc/new_device.png new file mode 100644 index 0000000..7b38e54 Binary files /dev/null and b/content/posts/niimbot-d110-pc/new_device.png differ diff --git a/content/posts/niimbot-d110-pc/original15x30.jpg b/content/posts/niimbot-d110-pc/original15x30.jpg new file mode 100644 index 0000000..1173710 Binary files /dev/null and b/content/posts/niimbot-d110-pc/original15x30.jpg differ diff --git a/content/posts/niimbot-d110-pc/pairing.png b/content/posts/niimbot-d110-pc/pairing.png new file mode 100644 index 0000000..80f64a5 Binary files /dev/null and b/content/posts/niimbot-d110-pc/pairing.png differ diff --git a/content/posts/niimbot-d110-pc/paperontop.jpg b/content/posts/niimbot-d110-pc/paperontop.jpg new file mode 100644 index 0000000..9b43720 Binary files /dev/null and b/content/posts/niimbot-d110-pc/paperontop.jpg differ diff --git a/content/posts/niimbot-d110-pc/sendto.png b/content/posts/niimbot-d110-pc/sendto.png new file mode 100644 index 0000000..ee6a533 Binary files /dev/null and b/content/posts/niimbot-d110-pc/sendto.png differ diff --git a/content/posts/niimbot-d110-pc/template_15x30.kra b/content/posts/niimbot-d110-pc/template_15x30.kra new file mode 100644 index 0000000..3f2edbc Binary files /dev/null and b/content/posts/niimbot-d110-pc/template_15x30.kra differ diff --git a/content/posts/niimbot-d110-pc/template_15x30.png b/content/posts/niimbot-d110-pc/template_15x30.png new file mode 100644 index 0000000..f6ccd61 Binary files /dev/null and b/content/posts/niimbot-d110-pc/template_15x30.png differ