Cetak Jaringan Epson TM-T82: Troubleshooting Port 9100

Itu port cetak mentah, konvensi yang diperkenalkan HP lewat JetDirect dan diikuti hampir semua printer jaringan. Tidak ada protokol di atasnya: Anda membuka koneksi TCP, menulis byte ESC/POS, lalu menutup koneksi sebagai tanda akhir pekerjaan. Tidak ada autentikasi dan, pada sebagian besar firmware, tidak ada antrean.
Biasanya soket setengah terbuka. Kalau printer tercabut atau sempat dimatikan sementara proses Anda masih memegang koneksi, penulisan masuk ke buffer kirim dan berhasil selama beberapa menit sebelum koneksinya timeout. Buka satu koneksi per struk, setel timeout koneksi dan tulis secara eksplisit, dan aktifkan keepalive agar kernel menyelidiki lawan bicaranya.
Tidak secara bersamaan. Port cetak mentah melayani satu sesi pada satu waktu, sehingga klien kedua ditolak atau dibiarkan menunggu. Dalam praktik, penyebab paling umum hang yang muncul sesekali adalah antrean cetak terlupakan di mesin lain yang menahan sesi tersebut — daftar koneksi established ke port 9100 di seluruh toko sebelum menyalahkan aplikasi Anda.
Tidak. Pembaruan sewa setelah listrik padam bisa memindahkan printer ke alamat baru dan semua kasir gagal serentak, dengan gejala yang tidak bisa dibedakan dari printer mati. Pesan alamatnya di router atau setel statis, lalu tulis alamat itu pada label yang ditempel di printer.
Antrekan struk di basis data dengan batasan unik pada id pembayaran. Batasan tunggal itu membuat percobaan ulang bersifat idempoten, yang membuat percobaan ulang agresif menjadi aman, sehingga toko bisa terus berjualan melewati gangguan jaringan dan menerima semua struknya setelah itu. Pasang alarm pada umur pekerjaan tercetak tertua, bukan pada kedalaman antrean.

Ringkasan Utama
Printer TM berjaringan mendengarkan di TCP port 9100 dan hanya menerima satu sesi cetak mentah pada satu waktu. Sebagian besar kegagalan di lapangan adalah klien kedua yang menahan sesi itu, soket setengah terbuka setelah listrik padam, atau sewa DHCP yang memindahkan alamat printer — semuanya bisa didiagnosis di bawah satu menit dengan netcat dan ss.
Memindahkan printer struk ke jaringan memecahkan masalah nyata: satu printer, beberapa kasir, tanpa kabel melintang di meja. Ia juga mengganti kabel yang bisa Anda lihat dengan sekumpulan mode kegagalan yang tidak bisa Anda lihat, dan saat pertama kali toko menelepon mengatakan pencetakan berhenti, tidak satu pun naluri debugging web yang biasa terpakai.
Ini urutan troubleshooting yang kini saya pakai, dari lapisan yang paling sering gagal ke yang paling jarang, ditambah desain antrean yang membuat kegagalan itu bisa dilewati alih-alih memalukan.
Printer TM berjaringan membuka port cetak mentah di TCP 9100 — konvensi yang sama yang dimulai HP dengan JetDirect dan kini diikuti hampir semua printer jaringan. Tidak ada protokol di atasnya: Anda membuka koneksi TCP, menulis byte ESC/POS, printer mencetaknya, dan menutup koneksi menandakan akhir pekerjaan. Kesederhanaan itu adalah daya tariknya sekaligus jebakannya.
Jebakannya, port mentah tidak punya sesi, tidak punya autentikasi, dan pada sebagian besar firmware tidak punya antrean. Printer melayani satu koneksi; klien kedua yang mencoba mencetak pada saat yang sama entah ditolak atau dibiarkan menunggu, dan aplikasi Anda melihat koneksi yang menggantung, bukan error yang menjelaskan dirinya.

Sebelum menyentuh aplikasi, buktikan lapisan mana yang rusak. Setiap pemeriksaan berikut hanya butuh beberapa detik dan menyingkirkan satu kategori penyebab utuh.
# Is the print port even open? Three seconds of truth.
nc -vz -w 3 192.168.1.50 9100
# Print a line without any application in the way.
printf 'NETWORK TEST\n\n\n\n\x1dVB\x00' | nc -w 5 192.168.1.50 9100
# Who else is holding the single print session open?
ss -tnp | grep ':9100'
# Is the printer answering ARP, i.e. is it on this subnet at all?
arp -n | grep 192.168.1.50Dalam pengalaman saya, pemeriksaan keempat menemukan masalah lebih sering daripada tiga lainnya digabung. Toko mengakumulasi konfigurasi cetak: kasir cadangan, laptop yang disiapkan saat masa uji coba, antrean Windows yang mencoba ulang selamanya. Salah satunya saja bisa menahan sesi yang dibutuhkan POS Anda.
Jangan pernah membiarkan printer struk jaringan memakai DHCP. Pembaruan sewa setelah listrik padam memindahkan printer ke alamat baru, semua kasir gagal serentak, dan gejalanya tidak bisa dibedakan dari printer mati. Pesan alamatnya di router atau setel statis, lalu tulis alamat itu di label yang ditempel pada printer.
Kegagalan paling membingungkan adalah ketika kode Anda melaporkan sukses dan kertas tidak bergerak. Ini terjadi saat printer menghilang — tercabut, dimatikan, switch di-reboot — sementara proses Anda masih memegang koneksi TCP. Tidak ada yang memberi tahu sistem operasi, jadi penulisan masuk ke buffer kirim dan kembali dengan gembira sampai koneksinya akhirnya timeout, beberapa menit kemudian.
// A half-open socket is the classic ghost failure: the printer was
// unplugged, the switch never told us, and write() happily succeeds
// into a dead connection. Bound every stage.
const CONNECT_TIMEOUT_MS = 3000;
const WRITE_TIMEOUT_MS = 8000;
const KEEPALIVE_DELAY_MS = 1000;
socket.setNoDelay(true); // receipts are small; do not Nagle them
socket.setKeepAlive(true, KEEPALIVE_DELAY_MS);
socket.setTimeout(WRITE_TIMEOUT_MS);
// Never reuse a socket across receipts. One job, one connection,
// one close — the close is what tells the printer the job ended.Dua kebiasaan menghapusnya. Buka koneksi per struk alih-alih menahan satu koneksi tetap terbuka, sehingga koneksi mati dibuang dalam satu transaksi, bukan bertahan sepanjang hari. Dan setel timeout serta keepalive secara eksplisit pada soket, agar kernel menyelidiki lawan bicaranya alih-alih memercayai tautan yang sudah tidak ada.
Ketika toko menelepon, urutan ini sampai ke penyebab dalam sekitar lima menit tanpa perlu datang ke lokasi.
Menuliskan urutan ini ke dalam runbook dukungan lebih berjasa bagi keandalan cetak kami daripada perubahan kode mana pun, karena ia menghentikan refleks merestart perangkat lunak POS sebagai respons pertama terhadap gangguan jaringan.

Mengingat jaringan pasti kadang gagal, tujuan desainnya bukan mencegah kegagalan melainkan memastikan cetak yang gagal tidak pernah menghilangkan penjualan dan tidak pernah mencetak dua kali. Itu masalah basis data, bukan masalah pencetakan, dan skema di bawah adalah seluruh idenya.
-- The print queue that makes a timeout survivable.
create table print_jobs (
id uuid primary key,
payment_id uuid not null unique, -- one receipt per payment, ever
printer_host text not null,
payload bytea not null,
attempts int not null default 0,
state text not null default 'queued',
last_error text,
created_at timestamptz not null default now(),
printed_at timestamptz
);
-- The unique constraint on payment_id is the whole idempotency story:
-- a retried API call cannot enqueue a second receipt, and a worker
-- crash between "sent" and "printed_at" leaves a row a human can see.Batasan unik pada pengenal pembayaran adalah bagian yang menanggung beban. Ia membuat percobaan ulang aman, yang pada gilirannya membuat percobaan ulang agresif aman, dan itulah yang memungkinkan toko terus berjualan melewati gangguan jaringan dua menit lalu menerima semua struknya setelah itu.
Ekspos kedalaman antrean dan umur pekerjaan tercetak tertua sebagai metrik kesehatan, lalu pasang alarm pada umurnya, bukan kedalamannya. Toko dengan dua belas struk mengantre saat tutup itu wajar; toko dengan satu struk yang sudah mengantre enam menit berarti punya printer yang offline tanpa disadari siapa pun.
Cetak jaringan tidak otomatis pilihan yang lebih baik. Ada tiga situasi di mana saya masih sengaja memakai USB atau serial.
Port 9100 adalah antarmuka yang indah karena sederhana dengan satu aturan keras — satu sesi pada satu waktu — dan sebagian besar insiden cetak jaringan adalah aturan itu dilanggar oleh sesuatu yang tak seorang pun ingat pernah memasangnya. Diagnosis dari jaringan ke atas, bukan dari aplikasi ke bawah, pakai koneksi per struk dengan timeout sungguhan, dan taruh antrean idempoten di belakangnya agar kasus terburuknya adalah penundaan, bukan struk yang hilang.