From 6b627945d823704bff397d000a6b31f91a31300d Mon Sep 17 00:00:00 2001 From: MultiMote Date: Fri, 26 Jul 2024 07:56:18 +0300 Subject: [PATCH] niimbot-proto --- content/posts/niimbot-proto/index.md | 8 ++++---- .../posts/niimbot-proto/protocol_tasks.png | Bin 14552 -> 11904 bytes 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/posts/niimbot-proto/index.md b/content/posts/niimbot-proto/index.md index 228a728..cc1cd78 100644 --- a/content/posts/niimbot-proto/index.md +++ b/content/posts/niimbot-proto/index.md @@ -16,7 +16,7 @@ tags: categories: - reverse-engineering featured_image: miniature.jpg -lastmod: 2024-07-25T21:40:32+03:00 +lastmod: 2024-07-26T07:55:58+03:00 telegram_entry_id: "" type: default --- @@ -30,7 +30,7 @@ type: default Сейчас в моём владении два принтера D110 и B1. Вооружившись Wireshark и android телефоном, снял дампы обмена данными с принтером по bluetooth. Для этого нужно было включить опцию "Bluetooth HCI Snoop Log" в настройках разработчика, а потом на компьютере после печати запустить `adb bugreport `. -Изучив пакеты и сверившись с другими открытыми данными, получилась такая структура пакета: +Изучив пакеты и сверившись с другими открытыми источниками, получилась такая структура пакета: ![niimbot packet](packet.png) @@ -50,7 +50,7 @@ type: default ![proto files](proto_files.png) -### Протокол обмена данными варьируется даже в пределах ревизий одной модели +### Вероятно, протокол обмена данными может варьироваться даже в пределах ревизий одной модели Это можно увидеть в декомпилированном коде приложения: @@ -73,7 +73,7 @@ type: default **Метка есть, но от бумаги размером, который не поддерживается принтером**: -* **Niimbot Android**: +* **Niimbot Android** - D110 - печатать можно, игнорируя предупреждения, плотность очень низкая (подлость самого приложения). - B1 - аналогично с D110. * **Niimbot Windows** diff --git a/content/posts/niimbot-proto/protocol_tasks.png b/content/posts/niimbot-proto/protocol_tasks.png index 7afcf1d9b3ff9a878cf282a2a2ec0b9fd858811d..e50317c0e31f1b95ed454ccb6d30110b1efd7855 100644 GIT binary patch literal 11904 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 literal 14552 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