После того, как поигрались с [niimprint](/niimbot-d110-pc), захотелось чего-то большего. У меня появилась идея написать полноценный веб-интерфейс для печати, в котором можно будет и рисовать этикетки, и печатать. Для этого я решил изучить протокол принтеров.
Вооружившись 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**.
В основном это касается набора пакетов при непосредственно печати. Изучив код приложения, можно сделать вывод, что есть пять вариаций протокола + вариации для самих моделей.