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

4.5 KiB
Raw Blame History

title description date draft tags categories featured_image lastmod telegram_entry_id type
Изучаем протокол принтеров Niimbot Изучаем протокол принтеров Niimbot и печатаем этикетки, отправляя пакеты 2024-06-29T21:10:28+03:00 false
bluetooth
niimbot
термопечать
Niimbot B1
Niimbot B110
реверс-инжиниринг
javascript
typescript
web
reverse-engineering
miniature.jpg 2024-07-25T21:34:50+03:00 default

После того, как поигрались с niimprint, захотелось чего-то большего. У меня появилась идея написать полноценный веб-интерфейс для печати, в котором можно будет и рисовать этикетки, и печатать. Для этого я решил изучить протокол принтеров.

Структура пакета

Сейчас в моём владении два принтера D110 и B1. Вооружившись Wireshark и android телефоном, снял дампы обмена данными с принтером по bluetooth. Для этого нужно было включить опцию "Bluetooth HCI Snoop Log" в настройках разработчика, а потом на компьютере после печати запустить adb bugreport <filename>.

Изучив пакеты и сверившись с другими открытыми данными, получилась такая структура пакета:

niimbot packet

  • Prefix префикс 0x03, присутствующий только при одной команде - Connect.
  • Head всегда 2 байта 0x55 0x55.
  • Command ID команды (пакета).
  • Data length количество байтов данных, идущих далее.
  • Data непосредственно данные в количестве Data length.
  • Checksum вычисляется с помощью XOR всех байтов от Command до последнего байта Data.
  • Tail всегда 2 байта 0xAA 0xAA.

Важно знать

Протокол обмена данным варьируется между разными моделями

В основном это касается набора пакетов при непосредственно печати.

Протокол обмена данными варьируется даже в пределах ревизий одной модели

Это можно увидеть в декомпилированном коде приложения:

Принтер искусственно занижает плотность печати при использовании неправильной или отсутствующей RFID метке

Вот тут довольно интересно. Принтеры и приложения ведут себя по разному.

Метки нет вообще:

  • Niimbot Android
    • Этикетку создать невозможно в принципе.
  • Niimbot Windows
    • D110 - не поддерживается, хоть и может печатать по usb.
    • B1 - печатать можно, игнорируя предупреждения, плотность очень низкая.
  • Сторонние проекты
    • D110 - печатает без проблем с нужной плотностью.
    • B1 - печатает с низкой плотностью.

Метка есть, но от бумаги размером, который не поддерживается принтером:

  • Niimbot Android:
    • D110 - печатать можно, игнорируя предупреждения, плотность очень низкая (подлость самого приложения).
    • B1 - аналогично с D110.
  • Niimbot Windows
    • D110 - печатать можно, игнорируя предупреждения, плотность очень низкая.
    • B1 - печатать можно, игнорируя предупреждения, плотность очень низкая.
  • Сторонние проекты
    • D110 - печатает без проблем с нужной плотностью.
    • B1 - аналогично с D110.