mmote.ru/content/posts/niimbot-proto/index.md
MultiMote 6c579dafc3
All checks were successful
Build and deploy mmote.ru / Build-And-Deploy (push) Successful in 33s
niimbot-proto
2024-07-25 21:35:25 +03:00

83 lines
4.5 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
description: Изучаем протокол принтеров Niimbot и печатаем этикетки, отправляя пакеты
date: 2024-06-29T21:10:28+03:00
draft: false
tags:
- bluetooth
- niimbot
- термопечать
- Niimbot B1
- Niimbot B110
- реверс-инжиниринг
- javascript
- typescript
- web
categories:
- reverse-engineering
featured_image: miniature.jpg
lastmod: 2024-07-25T21:34:50+03:00
telegram_entry_id: ""
type: default
---
После того, как поигрались с [niimprint](/niimbot-d110-pc), захотелось чего-то большего. У меня появилась идея написать полноценный веб-интерфейс для печати, в котором можно будет и рисовать этикетки, и печатать. Для этого я решил изучить протокол принтеров.
<!--more-->
## Структура пакета
Сейчас в моём владении два принтера D110 и B1.
Вооружившись Wireshark и android телефоном, снял дампы обмена данными с принтером по bluetooth. Для этого нужно было включить опцию "Bluetooth HCI Snoop Log" в настройках разработчика, а потом на компьютере после печати запустить `adb bugreport <filename>`.
Изучив пакеты и сверившись с другими открытыми данными, получилась такая структура пакета:
![niimbot packet](packet.png)
* **Prefix** префикс `0x03`, присутствующий только при одной команде - **Connect**.
* **Head** всегда 2 байта `0x55` `0x55`.
* **Command** ID команды (пакета).
* **Data length** количество байтов данных, идущих далее.
* **Data** непосредственно данные в количестве **Data length**.
* **Checksum** вычисляется с помощью XOR всех байтов от **Command** до последнего байта **Data**.
* **Tail** всегда 2 байта `0xAA` `0xAA`.
## Важно знать
### Протокол обмена данным варьируется между разными моделями
В основном это касается набора пакетов при непосредственно печати.
### Протокол обмена данными варьируется даже в пределах ревизий одной модели
Это можно увидеть в декомпилированном коде приложения:
![](protocol_tasks.png)
### Принтер искусственно занижает плотность печати при использовании неправильной или отсутствующей RFID метке
Вот тут довольно интересно. Принтеры и приложения ведут себя по разному.
**Метки нет вообще**:
* **Niimbot Android**
- Этикетку создать невозможно в принципе.
* **Niimbot Windows**
- D110 - не поддерживается, хоть и может печатать по usb.
- B1 - печатать можно, игнорируя предупреждения, плотность очень низкая.
* **Сторонние проекты**
- D110 - печатает без проблем с нужной плотностью.
- B1 - печатает с низкой плотностью.
**Метка есть, но от бумаги размером, который не поддерживается принтером**:
* **Niimbot Android**:
- D110 - печатать можно, игнорируя предупреждения, плотность очень низкая (подлость самого приложения).
- B1 - аналогично с D110.
* **Niimbot Windows**
- D110 - печатать можно, игнорируя предупреждения, плотность очень низкая.
- B1 - печатать можно, игнорируя предупреждения, плотность очень низкая.
* **Сторонние проекты**
- D110 - печатает без проблем с нужной плотностью.
- B1 - аналогично с D110.