Aakvatech Limited - Android POS Printing to USB Thermal Printers

A Windows PC connected to the thermal printer by USB can act as a network print server so your tablet can print over WiFi

 · 9 min read

Printing from an Android Tablet to a USB Thermal Printer via Windows

Thermal printers are common in POS, billing, restaurant, retail, and ERPNext environments. Many Android POS apps expect a printer to be available as a network device using an IP address and TCP port 9100. This works well when the printer has Ethernet or Wi-Fi, but it becomes more complicated when the thermal printer is connected to a Windows PC through USB.

In this setup, the Android tablet cannot print directly to the USB printer. The Windows PC must act as a bridge between the Android app and the USB thermal printer.

The final working architecture is:

Android tablet / POS app
   ↓ TCP 9100 over Wi-Fi
Windows PC running a raw print bridge
   ↓ Windows RAW spooler
USB thermal printer

Why this matters

In many POS and ERPNext implementations, especially in restaurants, retail counters, and billing environments, Android tablets are used as lightweight billing or order-taking devices.

The Android app may ask for printer settings such as:

Printer Type: Network / Ethernet / TCP
IP Address: 192.168.1.75
Port: 9100
Protocol: RAW / ESC-POS

This assumes the printer behaves like a network thermal printer.

However, a USB printer connected to Windows does not automatically behave like a network printer on port 9100. Windows printer sharing exposes the printer differently, usually as:

\\WINDOWS-PC-NAME\PrinterShareName

Many Android POS apps cannot use this Windows share path. They expect direct TCP communication.

Therefore, the Windows PC must be configured to behave like a basic network print server.

Understanding TCP port 9100

TCP port 9100 is commonly used for direct network printing. It is often associated with:

  • HP JetDirect
  • AppSocket
  • RAW printing
  • Port 9100 printing

In this model, the printer or print server listens on TCP port 9100. A client sends printer-ready data directly to that port.

Example:

Printer IP Address: 192.168.1.50
Port: 9100
Protocol: RAW / JetDirect / AppSocket

For thermal printers, the data sent to port 9100 is usually ESC/POS data. This may include visible text plus hidden printer control commands for alignment, bold text, feed, cut, buzzer, or drawer kick.

In a normal network printer setup, the printer itself listens on port 9100.

In a USB printer setup, the Windows PC must listen on port 9100 and forward the received bytes to the USB printer.

Why Windows printer sharing is not enough

Windows printer sharing is useful when another Windows computer prints to a shared printer. But many Android POS and web apps do not use SMB printer sharing.

A Windows shared printer is normally accessed like this:

\\WINDOWS-PC-NAME\PrinterShareName

But the Android POS app expects this:

192.168.1.75:9100

These are different printing models.

The Android app is not looking for a Windows shared printer. It is looking for a TCP RAW/AppSocket printer.

That is why a bridge is required.

QZ Tray versus TCP 9100 printing

QZ Tray is a useful print bridge for browser-based printing. It works especially well when a web app can integrate with the QZ Tray JavaScript API.

Typical QZ Tray flow:

Browser / web app
   ↓ WebSocket
QZ Tray on Windows
   ↓
USB printer

QZ Tray usually communicates through WebSocket ports such as 8181 or 8182.

However, QZ Tray is not the same thing as a TCP port 9100 raw print server.

If the Android app only supports:

IP address + TCP port 9100

then QZ Tray alone is not the correct fit unless the app can be customized to use QZ Tray.

For apps that require TCP 9100, use a raw print bridge.

Text format versus raw format in POS printing

In POS systems, there is often confusion around text format and raw format.

A cashier bill is usually customer-facing and accounting-facing. It may include:

  • Company name
  • Address
  • Tax details
  • Invoice number
  • Item names
  • Quantity
  • Rate
  • Discount
  • Tax
  • Total amount
  • Payment details

Because the bill is customer-facing, it normally needs a clean, consistent, readable layout.

A KOT or BOT is different.

KOT means Kitchen Order Ticket. BOT means Bar Order Ticket.

These are internal operational slips used by kitchen or bar staff. They usually include:

  • Table number
  • Waiter name
  • Ordered items
  • Quantity
  • Special instructions
  • Preparation notes

Example:

Table 5
2x Chicken Burger
1x Fresh Juice
No onions

Both the cashier bill and KOT/BOT contain text. The difference is not “text versus non-text.”

The better distinction is:

Cashier bill = rendered or formatted document
KOT/BOT = raw printer command stream

Raw printing allows the system to control printer-specific behavior such as:

  • Bold text
  • Large text
  • Text alignment
  • Paper cutting
  • Printer buzzer
  • Fast printing
  • Direct network or USB printer communication

A KOT/BOT may look like normal text to the kitchen staff, but internally it can include ESC/POS printer commands.

Example: paper cut command

A paper cut command may be documented as:

GS V 0

This is human-readable notation.

The actual bytes sent to the printer may be:

1D 56 00

To the printer, those bytes do not mean “print GS V 0.” They mean “cut the paper.”

If the command is sent as ordinary text, the printer may literally print:

GS V 0

If the command is sent as raw bytes, the printer performs the cut operation.

This is why raw printing is important for receipt printers and kitchen printers.

Final solution

The working solution is to run a TCP RAW bridge on the Windows PC.

The bridge listens on port 9100, receives data from the Android tablet, and forwards the bytes to the Windows printer using RAW spooler mode.

Final architecture:

Android tablet
   ↓
TCP 9100
   ↓
Windows PC PowerShell bridge
   ↓
Windows RAW spooler
   ↓
USB thermal printer

Example Windows PC IP:

192.168.1.75

Example printer endpoint configured in the Android app:

IP Address: 192.168.1.75
Port: 9100
Protocol: RAW / ESC-POS

Setup steps

Step 1: Install and test the printer on Windows

First, make sure the USB printer works locally on the Windows PC.

  1. Connect the thermal printer to the Windows PC via USB.
  2. Install the correct Windows printer driver.
  3. Go to:
Settings → Bluetooth & devices → Printers & scanners
  1. Print a Windows test page.
  2. Confirm the printer works before configuring network printing.

Step 2: Check the printer name

Use PowerShell:

Get-Printer | Select-Object Name

Copy the exact printer name.

A simple printer name is recommended, for example:

ThermalPrinter

Avoid spaces and special characters where possible.

Step 3: Confirm direct RAW printing works

Before building the bridge, confirm that Windows can send RAW data to the printer.

If direct RAW printing works, it proves:

Windows printer driver accepts RAW data
USB thermal printer can print RAW data
Printer is not offline
Printer queue/spooler works
Printer name is correct

This test is important because if Windows cannot print RAW data locally, a TCP bridge will not solve the issue.

Step 4: Run the PowerShell TCP bridge

Create a PowerShell script that:

  1. Listens on TCP port 9100.
  2. Accepts incoming print data.
  3. Sends the received bytes to the Windows printer using RAW mode.

Run it manually for testing:

cd C:\PrinterBridge
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\tcp-printer-bridge.ps1 -PrinterName "ThermalPrinter" -Port 9100

Replace ThermalPrinter with the exact printer name from Windows.

Step 5: Open Windows Firewall for port 9100

Create an inbound firewall rule:

New-NetFirewallRule `
  -DisplayName "TCP RAW Printer Bridge 9100" `
  -Direction Inbound `
  -Protocol TCP `
  -LocalPort 9100 `
  -Action Allow `
  -Profile Private

The Windows network profile should be set to Private, not Public.

Step 6: Give the Windows PC a stable IP address

The Android app needs a fixed destination.

Example:

Windows PC IP: 192.168.1.75
Printer Port: 9100

The best approach is to create a DHCP reservation in the router so the Windows PC keeps the same IP address.

Step 7: Configure the Android app

In the Android POS, APK, or web app printer settings, use:

Printer Type: Network / Ethernet / TCP
IP Address: 192.168.1.75
Port: 9100
Protocol: RAW / ESC-POS

The Android tablet will now treat the Windows PC like a network thermal printer.

Testing the setup

Test locally from Windows

With the PowerShell bridge running, test locally:

$client = New-Object System.Net.Sockets.TcpClient
$client.Connect("127.0.0.1", 9100)

$stream = $client.GetStream()
$data = [System.Text.Encoding]::ASCII.GetBytes("POWERSHELL BRIDGE TEST`nLocal print OK`n`n`n")
$stream.Write($data, 0, $data.Length)

Start-Sleep -Milliseconds 500

$stream.Close()
$client.Close()

Expected print:

POWERSHELL BRIDGE TEST
Local print OK

Test from another Windows device

From another Windows device on the same network:

Test-NetConnection 192.168.1.75 -Port 9100

Expected result:

TcpTestSucceeded: True

Test from Android

Use a TCP client or ESC/POS test app.

Example settings:

Host: 192.168.1.75
Port: 9100
Protocol: TCP
Mode: Text

Send:

ANDROID TEST
Hello from tablet



The blank lines help feed the paper.

If the app supports HEX mode, test ESC/POS initialize and cut commands:

1B 40 41 4E 44 52 4F 49 44 20 45 53 43 2F 50 4F 53 20 54 45 53 54 0A 48 65 6C 6C 6F 20 66 72 6F 6D 20 74 61 62 6C 65 74 0A 0A 0A 1D 56 00

This sends:

Initialize printer
Print test text
Feed paper
Cut paper

Troubleshooting

Port 9100 works locally but not from Android

Check:

  • Android tablet and Windows PC are on the same network.
  • Android is not connected to guest Wi-Fi.
  • Windows network profile is Private.
  • Firewall allows inbound TCP 9100.
  • The PowerShell bridge is running.
  • The Windows PC IP address has not changed.

Bridge receives data but nothing prints

Check:

  • Printer is powered on.
  • Printer is not offline or paused.
  • Printer queue is not stuck.
  • Correct printer name is used.
  • Direct RAW printing still works.
  • The Android app is sending ESC/POS or plain raw text, not PDF or HTML.

Check print jobs:

Get-PrintJob -PrinterName "ThermalPrinter"

Clear stuck jobs:

Get-PrintJob -PrinterName "ThermalPrinter" | Remove-PrintJob

Restart the spooler:

net stop spooler
net start spooler

Another program is already using port 9100

Check port usage:

netstat -ano | findstr :9100

Only one program can listen on port 9100 at a time. Stop any old raw print server before starting the PowerShell bridge.

Security considerations

TCP port 9100 should be accessible only from trusted networks such as a LAN or VPN.

Do not expose port 9100 to the public internet.

If exposed to untrusted networks, unauthorized users may be able to:

  • Send unwanted print jobs
  • Waste paper
  • Abuse printer resources
  • Interact directly with the printer or bridge

Recommended controls:

Allow TCP 9100 only on Private network profile
Restrict access to trusted local devices
Avoid router port forwarding
Avoid guest Wi-Fi access
Use LAN or VPN for remote access

Operational checklist

For daily use, the Windows PC must remain:

  • Powered on
  • Connected to the same network
  • Not asleep
  • Connected to the USB thermal printer
  • Running the PowerShell bridge
  • Allowed through Windows Firewall

If the PC sleeps or the bridge stops, Android printing will stop.

Best long-term recommendation

The Windows bridge approach is useful for testing, small deployments, and situations where the USB printer must be reused.

For production POS or billing environments, the most reliable option is a native network thermal printer with Ethernet or Wi-Fi.

That setup removes the Windows PC dependency:

Android tablet
   ↓ TCP 9100
Network ESC/POS thermal printer

Use the Windows bridge when needed, but for critical daily operations, prefer a LAN or Wi-Fi ESC/POS printer.

Final recommendation

For Android POS apps that require IP address and port 9100, a USB thermal printer connected to Windows needs a raw TCP print bridge.

The recommended working setup is:

Android tablet
   ↓
TCP 9100
   ↓
Windows PC running PowerShell TCP RAW bridge
   ↓
USB thermal printer

Configure the Android app with:

IP Address: Windows PC static IP
Port: 9100
Protocol: RAW / ESC-POS

This makes the Windows PC behave like a basic network thermal printer while continuing to use the existing USB thermal printer.

Reference articles and discussions

  • User-provided troubleshooting notes and consolidated discussion about Android tablet printing to a USB thermal printer through a Windows TCP 9100 bridge.
  • User-provided notes on TCP port 9100, RAW/AppSocket printing, ESC/POS printing, and security considerations.
  • User-provided notes on the difference between text format and raw format in POS, cashier bill, KOT, and BOT printing.
  • No external reference articles or discussions were used.

Aakvatech Limited is a Frappe Gold Partner and ERPNext implementation company headquartered in Dar es Salaam, Tanzania, operating across East Africa and the UAE.

This article was co-created using AI to accelerate drafting, with final insights curated and validated by the author. Any customer, personal, or sensitive data referenced during drafting has been anonymized or masked where applicable. All contributors, reference URLs, tools, and materials used to assist this content curation are credited in the Reference section.


No comments yet.

Add a comment
Ctrl+Enter to add comment