Port-sniffing op een thermische mini-printer: een stap dichter bij console toegang

2 Januari 2025

Nieuwe thermische printer
Afgelopen kerstdagen ben ik een leuke draagbare thermische GuKKK-printer rijker geworden. De printer met modelnummer HT-TPDYJ-X5BS-FBA heeft een resolutie van 200 DPI, weegt nog geen 400 gram, heeft afmetingen (lxbxh) van 8,5×9,5×5 cm en een papierbreedte van 57 mm. De printer is voorzien van een interne LiPo-accu en communiceert via Bluetooth. Als thermische printer is deze monochroom en print deze uitsluitend op thermisch papier, zoals elektronische kassarollen. Het lijkt me een leuke uitdaging om deze printer direct aan te sturen vanuit een embedded processor (Raspberry Pico, ESP32 of Arduino) en daarmee zinvolle berichten of debugging-meldingen op papier vast te kunnen leggen.

Een kijkje onder de motorkap
Het duurde natuurlijk niet lang voordat de schroevendraaier me toegang gaf tot het hart van dit printertje. Met vier schroeven haal je de plaat eraf waarin de kassarol opgesloten ligt. Daarmee komt meteen de printplaat bloot te liggen. Op de printplaat zitten drie chips: een SA8833CS (printerdriver voor het aansturen van de stappenmotor die de kassarol en de printerkop beweegt), een TP4056 (standalone Li-Ion-batterijlader voor het gecontroleerd opladen en monitoren van de Li-Ion-accu) en een BP24245-56C4 (vermoedelijk een Bluetooth-MCU voor datatransmissie met de printerapp en de aansturing van de thermische printerkop en stappenmotor).

Testpunten op de printplaat
Aan de onderkant van de printplaat zitten 21 testpunten waarmee in de fabriek de verschillende functies getest kunnen worden: BAT+ en GND voor de Li-Ion accu, PRINTER-CLK/MOSI/STB voor de aansturing van de printerkop, PRN-ADC-TEMP en ADC-PAPER-DECT voor het monitoren van de temperatuur van de printer en de aanwezigheid van papier, MOTOR A/-A/B/-B voor de aansturing van de stappenmotor, en vooral ook interessant: DEBUG/PL-SW, de poort waarmee data van en naar de centrale MCU gestuurd kan worden. Aannemelijk is dat de DEBUG/PL-SW een soort poort is waarmee gemonitord kan worden wat de printer aan het doen is. Dat maakt me nieuwsgierig.

Het debuggen begint
Ik pak de oscilloscoop erbij en soldeer drie draden op de GND, de DEBUG/PL-SW en de PRINTER-MOSI-poort. Op de PRINTER-MOSI-poort verwacht ik datapunten die de printerkop aansturen en op de DEBUG/PL-SW-poort verwacht ik signalen waarmee ik kan valideren of er debug-data gecommuniceerd wordt. Na wat aanpassingen in de instellingen van de scope zie ik inderdaad bevestigd dat er tijdens het printen zowel data naar de printerkop gaat als dat er ook op de debugpoort datapulsen zichtbaar zijn. Debugpoorten zijn doorgaans een soort UART (Universal Asynchronous Receiver-Transmitter)-poorten die met een UART-interface uitgelezen kunnen worden. Standaard zit er op een Arduino Uno zo’n poort ingebouwd, dus met wat basisprogrammeercode zet ik snel een UART-echo-debugger in elkaar. Deze gaat me hopelijk inzicht geven in de data die aanwezig is op de DEBUG-poort tijdens het printen. Ik hoop dat er zinvolle meldingen komen, zoals “data ontvangen” en “printer klaar”.

Communicatieproblemen
Na het uploaden van mijn UART-debuggercode naar de Arduino Uno start ik vanuit de app op mijn iPhone een print van een afbeelding. Op de scope zie ik data en op de Arduino Uno krijg ik een hele serie data binnen. Het is echter niet duidelijk wat de baudrate is waarmee gecommuniceerd wordt. Hiervoor raadpleeg ik ChatGPT. Deze suggereert zowel 9600 als 115200 baud te proberen, evenals variaties in de pariteitsbit en stopbit. Ik probeer alle variaties, maar blijf steeds onduidelijke data ontvangen. Vanuit de Arduino-seriële UART-poort is niet altijd alles goed zichtbaar, dus ik probeer ook PuTTY als UART-console, maar ook hiermee blijk ik weinig succesvol zicht te krijgen op de data. ChatGPT suggereert ook een andere hexviewer (Tera Viewer) te gebruiken, en hiermee krijg ik vervolgens alleen Chinese tekens te zien.

Toekomstige plannen
Met deze Chinese tekens in gedachten besluit ik voorlopig mijn onderzoek naar het binnenwerk van deze GuKKK-thermische printer te laten voor wat het is en de printer voorlopig te gebruiken waarvoor hij bedoeld is: mobiel printen op locatie. Maar… ik sluit niet uit dat ik in de nabije toekomst deze printer nogmaals binnenstebuiten zal keren om de werking beter te begrijpen en deze direct aan te sluiten op een Raspberry Pico. Een andere optie waar ik over nadenk is het toepassen van CUPS op de Raspberry Pi, waarmee dit soort draadloze thermische printers vanuit Python aangestuurd kunnen worden. Mogelijkheden genoeg; de toekomst zal het leren.