This post is designed for people who want to share a simple USB printer, such as this receipt printer, over the network.
Usually, you just connect up the printer to the computer like this:
But if you are sending the print jobs from a central server, you would instead follow these steps, and hook up a Raspberry Pi near the printer to pass on the print-outs for you:
This post will show you a very fuss-free way to do this. Because of its simplicity, if you have multiple computers printing (read: you need a server that can spool), or need two-way communication with the printer, then this setup will not be sufficient for your use case.
One-off setup
If your printer is /dev/usb/lp0, then the command to run is:
nohup nc -klp 9100 > /dev/usb/lp0 2> /dev/null&
There is quite a lot going on in this command, so I’m going to break it down into parts and explain what each one does.
- nohup
- Lets the command keep running after you log-out.
- nc -klp 9100
- Listens on port 9100 (-lp), and returns to listening after each connection (-k)
- > /dev/usb/lp0
- Redirects any incoming data to the printer device
- 2> /dev/null
- Suppresses errors by sending them to /dev/null
- &
- Runs the command in the background so that you can keep using the terminal.
Run every boot
Simply schedule the command in cron as a @reboot task.
crontab -e
And add the line:
@reboot nohup nc -klp 9100 > /dev/usb/lp0 2> /dev/null&
Note that if you reboot the printer, you will also need to reboot the raspberry pi to get it to reconnect without logging in!
Send some tests
From a computer somewhere else on the network, send a test print-out:
echo "Hello world" | nc 10.x.x.x 9100
If the target printer is a thermal receipt printer, then you could also use escpos-php to send it more elaborate commands:
<?php
$fp = fsockopen("10.x.x.x", 9100);
/* Print a "Hello world" receipt" */
$printer = new Escpos($fp);
$printer -> text("Hello World!\n");
$printer -> cut();
fclose($fp);