I just got a new printer - the cheapest B/W laser printer I could find - and I really wanted to have a network option for it, since I'd like to print from different laptops and computers around my house. However, the premium for a printer with an ethernet/wireless option, in this cheap printer category is around 50-70% of the printer value. Way too much. I'm going to hack my way out of this problem.
For this, we're going to use $20 TP-Link WR-703N devices, which are actually very small routers, and once flashed with OpenWrt, are capable of doing pretty much anything that you can think of with a Linux kernel, an ethernet port, a WiFi connection, and a USB port. This device is perfect as a wireless printer adapter.
First of all, we need to flash the device with OpenWrt. Simply follow these instructions which describe exactly which binary to download. Flashing it is easily done via the existing default web interface, which unfortunately is only in Chinese. But there are some good screenshots on the Xinchejian hackerspace wiki that you can follow. Caution: When flashing, make sure you're aware of the pitfalls of some of the recent firmwares, see the warnings section for details.
Note that some vendors on eBay are already selling WR703N devices with OpenWrt pre-flashed instead of the stock firmware, in which case you don't have to do any of the above.
Now that we have OpenWrt installed, it's time to configure it. By default, the wireless interface will be disabled, leaving on the ethernet port working. Upon connection, you'll be served a
192.168.1.X IP address via DHCP from the device (which will be on
192.168.1.1). For our setup, we'll assume we want to located the printer somewhere without having to pull any network cables to it, so we want a setup where the wireless adapter is used as the WAN interface, hooking up to an existing wireless network. We'll also want to create a subnet LAN on
192.168.2.1 to ensure we're not colliding with the existing LAN on
192.168.1.1 (assuming we're also running the same subnet on the existing home network.)
First, we need to open up the wireless configuration on
/etc/config/wireless and edit it to look like so:
config wifi-iface option device radio0 option network wan option mode sta option ssid MyNetworkName option encryption psk2 option key MyNetworkPassword
This configuration means we setup the
radio0 device to hook up as a station (
sta) to the WAN on the given network.
psk2 assumed WPA2-PSK encryption with the given password.
You also have to make sure you update the physical 802.11 channel on the line in the
radio0 config, where it says:
option channel 11
It must match your existing wireless channel.
Now we'll add the WAN interface itself in the
config interface 'wan' option ifname 'wlan0' option proto 'dhcp'
And since we're setting up a new LAN subnet, change the existing LAN interface on the following line to:
option ipaddr '192.168.2.1'
Last thing is to make sure we can remotely log into the device from the WAN, since hooking up ethernet just to manage it is a PITA. Open the
/etc/config/firewall config file and add this rule at the end:
config rule option name 'allow-ssh' option src 'wan' option target 'ACCEPT' option dest_port '22'
That's all the basic config we need. After
reboot, the device should show up on your LAN, and you'll be able to log into it to continue to the next steps.
We'll move on to installing the important stuff. The printer setup is based on the p910nd daemon, which will act as a proxy between the device and the printer. It's main advantage is that it is a non-spooling server (as opposed to, say, CUPS) which means it doesn't need to hold the printing jobs in memory while printing. Remember, WR703N are very limited devices.
In order to setup the printer we need to install both p910nd, as well as the USB kernel mods, but it's all done through the
opkg package manager:
opkg update opkg install p910nd kmod-usb-printer
After this part, if you connect the printer, you should see either the
/dev/lp0 device. Run
dmesg to see a successful USB connection, or errors if there were any.
Go on over to the
/etc/config/p910nd config and enable the printer, and make sure it's pointed to the right device. At this point you'll also have to open port 9100 on the firewall, in the exact same way we did for the SSH port previously. Make sure to restart the firewall after this addition, using
Now we can start and enable the p910nd daemon, to make it run now, as well as on each boot:
/etc/init.d/p910nd start /etc/init.d/p910dn enable
We're almost there. Now we just have to create a new printer device on our client machine, and let's assume you already have all the drivers installed.
These instructions vary by client OS, but generally speaking you need to create a new printer, under the device WAN IP (you can find it by
ssh-ing into the device and seeing what
ifconfig reports under the
wlan0 interface), if needed, define port 9100. The protocol selected should be
Try printing a test page. If all went well, you have just saved yourself some money, and learned how to create your own cheap wireless adapter for your printer.