Printing from Android/IoS with p910nd?

I've recently successfully configured a TCP/IP printer using p910nd for network printing. It works perfectly on windows, and although the old dell printer I used only has Windows drivers, it printed reasonably well with a generic CUPS driver on Linux.

I was wondering if the same is possible on Android, and at a stretch, iOS? I've tried to look into it, and couldn't find any solution. I understand it's probably a stretch to get an iOS device to work with it, but I was thinking there must be a way to do this on Android.

On an Android device, I tried manually adding the printer's IP and Port Number, but it just goes into a loop of searching for it, clearly not getting any response. I tried enabling bidirectional mode in Luci, but it didn't seem to change anything.

This depends on the page description language your Dell uses.
https://docs.freebsd.org/en/books/handbook/printing/#printing-pdls
Most applications generate postscript print jobs and if your Dell is postscript capable, it should handle it.

If the Dell is not Postscript capable, the print job will need to be filtered - essentially translated into a data stream that the printer understands.
https://docs.freebsd.org/en/books/handbook/printing/#printing-lpd-filters

A work around is to "share" the printer on your Windows box. The Windows box will filter the print job and send it on to the printer.

There may be Linux/BSD drivers for your printer if uses PCL. If you provide the Model number of the printer, I'll check and point you to them.

There is an alternative way to provide a router print server with cups. You have build the cups packages youself:
https://openwrt.org/docs/guide-user/services/print_server/cups.server
Filtering would be done by the router rather than your Windows box - you could print without the Window box being powered on.

A little sleuthing, forum search suggests that your Dell is a 1710 without the NIC port.
If it is a 1710n, there would be an easier way to set it up.

According to:
Dell 1710 Printer specs
It supports Postscript and PCL.
If the printer is setup for Postscript, you can just send the print job "raw" to the printers network address/port.

p910nd is a lightweight server; clients must handle the printer driver and spooling. This is fine for windows and linux machines, but Android printing requires the server to handle the printer driver and spooling.

You would need to install a cups server to make it work with Android. OpenWrt doesn't have the packages for cups in the repositories anymore because most routers don't have the required ram or storage to run it. So you would have to compile cups for your router yourself assuming that your router has the necessary memory.

1 Like

Another approach is to install cups on android.:
https://play.google.com/store/apps/details?id=io.github.benoitduffez.cupsprint&hl=en_US&gl=US. F-Droid has an older version.
On android, I would probably use the "raw" driver.

As far as iOS, it depends on the vintage. Apple bought cups in 2018 and devices after that used cups printing. For full functionality on your iOS device, you can point your cups configuration to the ppd linked below:
OpenPrinting - Dell Postscrpt
Selecting "raw" will work but you will not have all the paper handling smarts.
http://hints.macworld.com/article.php?story=20020831065441401

I struggled with Android because of my very old HP Deskjet 3050 printer.

Finally with Zeroconf (https://openwrt.org/docs/guide-user/services/print_server/p910nd.server#with_zeroconf) and NokoPrint from Google Play I was able to print from my mobile.

Hope this helps.

1 Like

Thanks for all the replies so far, I'm glad it seems that I'll be able to achieve this.

It may be that I'm tired and my reading comprehension isn't up to the task, but I'm not seeing how to get over the final hurdle of actually sending the print job from the android interface. The CUPS printing app just directs me towards the same settings app system of adding by IP, which goes into an internal loop.

The IP should be the router IP w port 9100

https://openwrt.org/docs/guide-user/services/print_server/p910ndprinterserver
https://openwrt.org/_media/media/docs/howto/p910nd_07.png?w=600&tok=a2feda

Mhm, I specified the port with IP:9100

According to the OpenWrt wiki; Port 9100 is the default p910nd port. Port 9100 is also HP's JetDirect port and usually reserved for network printers.

How your MS computer, iOS and Andoid OS specify the destination port can vary. In the old BSD lpr print system it's 9100@ipv4 address, eg 9100@192.168.1.3. In cups it's specified 192.168.1.3:9100.

On thing you can try is to ping the printer:port to see if it's active - should be if you can print to it from your work station. What address did you specify on your Windows Work station?

Another way to test is to netcat(nc) directly to the printer and bypass the spooler:
https://docs.freebsd.org/en/books/handbook/printing/#printing-direct

For cups, you can manually specify the printer address in the config files. My phone is running GrapheneOS and I can edit some of the files. I've been meaning to set up printing but it is a low priority from a phone. My interim work around is to send the print job as an attachment to myself and print from my workstation.

Setting up print sharing/ letting my family members know how to do this might be the most sensible option, here, honestly!
But yes, I can definitely print from any Windows/Linux workstation. I specified 192.168.2.1:9100 in these cases.

I also tried specifying with the BSD syntax as you described, which unfortunately didn't work either.

There are a number of things to try.
First, printing can be done over a number of different network protocols

ipp://
ipps://
http://
https://
socket://

Cups - Using Network printers

My Brother HL-5450DN has a 10/100 ethernet port that I configured to a static IP 192.168.1.3. My cups configuration, which worked the 1st time so I did not try other protocols, was socket://192.168.1.3:9100.

In the OpenWrt p910nd documentation, a Unix socket is an option.

socket://192.168.1.1:9100

Another option; both your Linux and Windows computers can share a printer. The downside is they have to be booted up. It can get more complicated with Samba printer sharing.

With the p910nd server on the router (Default OpenWrt IP is 192.168.1.1) but you specified 192.168.2.1

You can install the package avahi-nodbus-daemon to advertise the p910nd printer service on your network. After you install the package, create an xml file /etc/avahi/services/printer.service with a description of the printer. Here's the one I use for my printer. You will need to change it to match yours:

<?xml version="1.0" ?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">HP DeskJet 6540 on %h</name>
<service>
<type>_pdl-datastream._tcp</type>
<port>9100</port>
<txt-record>usb_MFG=HP</txt-record>
<txt-record>usb_MDL=Deskjet 6540</txt-record>
<txt-record>usb_CMD=MLC,PCL,PML,DW-PCL,DESKJET,DYN</txt-record>
<txt-record>pdl=application/x-pcl,application/vnd.hp-PCL</txt-record>
<txt-record>note=Computer Room</txt-record>
<txt-record>ty=HP Deskjet 6540</txt-record>
<txt-record>product=(HP Deskjet 6540)</txt-record>
<txt-record>kind=document,envelope,photo,postcard</txt-record>
<txt-record>Color=T</txt-record>
<txt-record>Duplex=F</txt-record>
<txt-record>PaperMax=legal-A4</txt-record>
<txt-record>Staple=F</txt-record>
</service>
</service-group>

The values for usb_MFG, usb_MDL, usb_CMD, and pdl can be discovered by connecting the printer to a linux box with cups installed and see what cups detects. This won't get your printer to work on Android, however, because the client still must have its own driver for the printer. Like I said, Android needs print servers to handle the driver, and p910nd doesn't do that.

In this particular case it does not need a driver.

Terminology in this area is inconsistent; some people speak of drivers when they mean PDL's. The printer in this thread is postscript capable (*.ps) and does not need a driver or more correctly a PDL.

https://docs.freebsd.org/en/books/handbook/printing/#printing-pdls

Most printing applications in browsers, pdf viewers and office suites generate the print job as postscript. If the printer is postscript capable it will process the job. Essentially the postscript PDL is embedded in the printer itself.

If the Printer is PCL5e, postscript gets filtered by the host computer and converted into a PCL5e data stream that the PCL5e printer will understand. A PCL5e printer will not print anything useful out of a postscript file without it being filtered first.