TL;DR: I made a Python printing client for a Bluetooth thermal printer from Walmart so I could use it from my PC! And learned a lot about reverse engineering.
The thermal printer we are talking about today is Core Innovation’s CTP-500’s thermal printer. I first ran into it in the electronics aisle at my local Walmart, but you can find it on Amazon etc. It comes with a few thermal paper rolls and a few thermal sticker rolls, and you can buy refills for “regular” rolls as well as metallic sticker rolls. I hmm and aaaah’d about it for a few days before deciding to buy one. If you’ve been reading me for some time, you know I’m a sucker for thermal printer projects!
The vanilla experience
The first thing I did when the thermal printer came in is try the basic experience out of the box, as Core Innovation Products intended. The experience was…OK? Just what you would expect from a relatively small brand! It does the job, but I didn’t find it amazing. The files access permissions felt a little sketchy, and the interface didn’t really click for me. But the biggest problem was that I wanted to use the thermal printer with my desktop computer. Out of the box, it looked like it wouldn’t be an option.

There’s probably a few reasons why you can’t use this thermal printer on a PC or Mac right away, most likely on the software side, but my favorite? There actually is a CTP-500 device in the Windows Bluetooth devices database…And it has nothing to do with our thermal printer, since it’s a medical scanner! The thermal printer will connect for a bit, but that’s it.
So after giving the vanilla experience a try, I felt good working on getting the printer to talk to my PC! And it all starts with the first step to every project: looking things up!
Gathering intel

Mini thermal printers have been super popular for some time. Adafruit used to sell some really hackable ones! And cat-themed and hamster-themed thermal printers have been around for a while, with plenty of hacks from very talented people. In no particular order I want to thank onezeronull, MaikelChan, rbaron and WerWolv!
So there’s plenty to read, and here’s what I learned:
- These thermal printers feature a few ESC/POS commands (a standard shared by many commercial thermal printers) but that’s it!
- Images or text, all are turned into bitmap graphics for printing: each line of the resulting image is then turned into printing instructions for the printer, possibly with some form of shorthand compression
- Some thermal printers have a data integrity checking system required for printing, but not this one – or at least I was able to sidestep it!
PASSION DON’T PAY THE BILLS (YET)
Gimme some money.
Figuring out Bluetooth

Early in this project, I popped open the printer to look at the board. I hoped I could solder a couple wires and get a USB connection. I was looking for potentially interesting test pads, and I did find them! To the right of the printer board’s USB port, the DM and DP pads seemed like they could be great candidates to rig a quick and dirty wired connection.
But I had just gotten this thermal printer and I didn’t want to risk destroying it just yet! I decided I would try that out on another thermal printer if I ever found a really cheap one of the same model in the meantime, chose to turn back to Bluetooth hacking! Of which I knew nothing about on a technical level: it was time to learn hard, and learn fast!
I fired up this tutorial from the Hacking Modern Life and followed the instructions to get a copy of the communications between my phone and printer. Combing over the Bluetooth logs, I figured out basic commands for the printer to move paper forward, get the printer’s serial number or its internal state data!
I don’t know how to read ASCII and hex codes super well, but I could spot an important pattern just in the logs: the printer expected data to start with a message that says “here comes a print”, the actual printing data, and a final message that says “we’re done printing”. Once I knew that, I figured everything else would be about data manipulation and packaging. Not easy, but definitely not impossible!
First code lines

At that point, I had roped a few friends from SecKC into the thermal printer craze (hi bitflip, hi Tsathoggualware, hi Reid!). bitflip found code from voidsshadows on Github, who had reverse-engineered most of the messaging system for the CTP-500 already, written essential functions in Python and even made a Web interface and a Cloudflare Worker setup for it. Bitflip shared a stripped down version of the main Python functions to try locally in a command line tool. It worked great!
Building upon Bitflip’s code, I added the functions I had found on my end and tested until I had a clear idea of how everything worked. We had successfully connected our little printers to our PCs! I could have stopped there…But it wouldn’t be very fun would it?
It’s GUI time!

I had been looking for a reason to learn how to graphical interfaces for a while. This was the perfect excuse! So I opened up a few tkinter tutorials, made some coffee and got to work.
First off, I separated the command to establish a Bluetooth from sending prints to the printer. This lets us turn the Bluetooth connection on and off as needed and speed up the time it takes to send and finish a print. Once that was done, I blocked a rough template for the GUI and:
- Added a Connect/Disconnect feature and button
- Added a text area (with an option to browse text files)
- Added an image browsing and image preview area
- And of course a Print button!
And with this last feature, I called it good!
[Sample pictures carrousel here]
You can find the code for the current app on Github. Just make sure you have the required libraries (tkinter and Pillow, plus a bunch of default libraries) and put in your thermal printer’s Bluetooth Device Address in the mac_address variable before starting the app. Enjoy!
Prepping dithered pictures
These thermal printers won’t get you high fidelity prints, but they will definitely have character! If you are going to print pictures that aren’t solid black and white, your best bet is dithered pictures. These can be a little complicated to make, so here’s a shortcut.

My favorite way to make dithered pictures so far is Doodad’s Dither Me This. It’s an online tool I first found out about when prepping graphics for laser engraving at the Black & Veatch Makerspace, and it’s super easy to use (and it looks really fun too). If you use Dither Me This, support a cool developer, send some money Nathaniel’s way!
Future improvements?
This app is super, super rough. There is a lot of room for improvement in almost every direction! In a perfect world where I have time to sit down and take care of it, here’s my to-do list:
- A themed GUI using
ttk - Text justification and rotation and font selection
- In-app picture dithering, picture justification and rotation,
- A decent print preview system
This was my first dive into reverse engineering Bluetooth communications: I learned plenty, and the printer is even more useful to me now than it was out of the box. For all this project taught me, that was $20 very well spent!