mmote.ru/content/posts/niimbot-proto/index.md
MultiMote 14cf65bbf0
All checks were successful
Build and deploy mmote.ru / Build-And-Deploy (push) Successful in 34s
niimbot-proto: черновик
2024-07-25 21:06:25 +03:00

40 lines
2.2 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:04:37+03:00
telegram_entry_id: ""
type: default
---
После того, как поигрались с [niimprint](/niimbot-d110-pc), захотелось чего-то большего. У меня появилась идея написать полноценный веб-интерфейс для печати, в котором можно будет и рисовать этикетки, и печатать. Для этого я решил изучить протокол принтеров.
<!--more-->
Вооружившись 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`.