Post
Xprinter Xpn160ii Driver Here
"""
XPrinter XPN160II Driver (ESC/POS compatible)
Author: Generated solution
"""
import usb.core
import usb.util
import serial
import serial.tools.list_ports
from PIL import Image
import time
class XPN160II:
def init(self, vendor_id=0x0416, product_id=0x5011, port=None):
"""
vendor_id, product_id: typical for XPrinter (may vary)
port: if None, auto-detect USB; if 'COM3' or '/dev/ttyUSB0' use serial
"""
self.device = None
if port is None:
self._connect_usb(vendor_id, product_id)
else:
self._connect_serial(port) xprinter xpn160ii driver
def _connect_usb(self, vid, pid):
self.device = usb.core.find(idVendor=vid, idProduct=pid)
if self.device is None:
raise RuntimeError("XPN160II not found via USB")
# Detach kernel driver if needed (Linux)
if self.device.is_kernel_driver_active(0):
self.device.detach_kernel_driver(0)
self.device.set_configuration()
self.usb_mode = True
def _connect_serial(self, port):
self.ser = serial.Serial(port, baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=1)
self.usb_mode = False
def _write(self, data):
if self.usb_mode:
self.device.write(0x01, data, 1000)
else:
self.ser.write(data)
# ---------- ESC/POS commands ----------
def init(self):
"""Initialize printer"""
self._write(b'\x1B\x40')
def set_align(self, align='left'):
"""Align: left, center, right"""
if align == 'left':
self._write(b'\x1B\x61\x00')
elif align == 'center':
self._write(b'\x1B\x61\x01')
elif align == 'right':
self._write(b'\x1B\x61\x02')
def set_bold(self, enable=True):
self._write(b'\x1B\x45' + bytes([1 if enable else 0]))
def set_font_size(self, width=1, height=1):
"""width, height: 1-8"""
w = max(0, min(7, width - 1))
h = max(0, min(7, height - 1))
self._write(b'\x1D\x21' + bytes([(w << 4) | h]))
def text(self, content):
self._write(content.encode('cp437', errors='replace'))
def textline(self, content):
self.text(content + '\n')
def barcode(self, code, type='CODE128'):
"""Print barcode (type: CODE128, CODE39, EAN13, etc.)"""
if type == 'CODE128':
self._write(b'\x1D\x6B\x49' + bytes([len(code)]) + code.encode() + b'\x00')
elif type == 'CODE39':
self._write(b'\x1D\x6B\x04' + code.encode() + b'\x00')
else:
raise ValueError("Unsupported barcode type")
def qr_code(self, data, size=6):
"""Print QR code"""
self._write(b'\x1D\x28\x6B\x03\x00\x31\x43' + bytes([size]))
pl = len(data) + 3
plh = pl & 0xFF
pll = (pl >> 8) & 0xFF
self._write(b'\x1D\x28\x6B' + bytes([plh, pll, 0x31, 0x50, 0x30]) + data.encode('cp437'))
self._write(b'\x1D\x28\x6B\x03\x00\x31\x51\x30')
def image(self, img_path, width=384):
"""Print bitmap image (dither to monochrome)"""
img = Image.open(img_path).convert('1') # 1-bit monochrome
# Scale to printer width (384px typical for 58/80mm)
img = img.resize((width, int(img.height * width / img.width)))
pixels = img.load()
bytes_per_line = (width + 7) // 8
bitmap = bytearray()
for y in range(img.height):
for xb in range(bytes_per_line):
byte = 0
for bit in range(8):
x = xb * 8 + bit
if x < width and pixels[x, y] == 0:
byte |= (1 << (7 - bit))
bitmap.append(byte)
# ESC/POS raster command
header = b'\x1D\x76\x30\x00' + bytes([bytes_per_line & 0xFF, (bytes_per_line >> 8) & 0xFF]) + bytes([img.height & 0xFF, (img.height >> 8) & 0xFF])
self._write(header + bytes(bitmap))
def cut(self, full=True):
"""Cut paper"""
if full:
self._write(b'\x1D\x56\x41\x00')
else:
self._write(b'\x1D\x56\x42\x00')
def feed(self, lines=3):
"""Feed paper n lines"""
self._write(b'\x1B\x64' + bytes([lines]))
def close(self):
if hasattr(self, 'ser') and self.ser:
self.ser.close()
elif self.device:
usb.util.dispose_resources(self.device)
This is where many users get confused.
Commentary: Where drivers abstract away device idiosyncrasies, developers win fewer support tickets; where they don’t, integrators write workarounds and pray. This is where many users get confused