michael@slashetc:~$

Raspberry Pi Scanner Server

It's come time that we (my fiancé and I) required the use of a color printer. My B/W Laser wasn't going to cut it this year for her class room printings. So we went out an picked up an Epson WP-3620 on sale at BestBuy. It's an All-In-One like most [read: ALL] consumer printers you'll find on the market today, this one even came with an Ethernet port (a requirement on my network :) ). The printer portion of the printer setup just fine as one would expect - but network scanning has been an issue. Not because I have it setup as a wired printer, but because my quest for the perfect network I have ALL network peripherals / IoT devices on a separate VLANs (if you question why, here's an example, and another, and another). However by doing this and making my network more secure, the secret sauce Epson uses to make network scanning ... well ... work ... is defeated. I assume it uses some form of NetBIOS as the port is listening and Wireshark shows lots of NB packets during the setup, but I cannot seem to get it to work properly without it being on the same subnet as my production rigs (maybe WiFi direct would work - but I disabled that). SANE straight will not connect to it via the network, however USB works fine and is officially supported.

So to make scanning work (and please my future wife) I did what I do best, engineer a solution.

Putting my RPi Model B to good use (It's not really up to much these days). Let's run Raspbian Lite and SANE, then wait for scanner requests on the network. This How-to should work on any Linux computer with a USB and Ethernet port.

Prerequisites

I'll assume you know how to install an OS on a Raspberry Pi - that's been done to death already - so I won't go into detail here

But here's a few links to get you started if this is your first foray into Linux:

Also as a side note, I use vim as my preferred editor. Replace vim with which ever text editor of your choosing; e.g. nano.

Installing Required Packages

Other than the basics included in Raspbian Lite, we need sane-utils; that's it!! sane-utils contains the saned. (On Archlinux the package is called simply “sane”)

pi@scan:~ $ sudo apt-get install sane-utils

This will take a bit to install if you're on an old Pi like mine - go grab a cup of coffee if that's your thing.

Scanner Setup

Configure /etc/default/saned so it will start automatically (RUN=yes):

pi@scan:~ $ sudo vim /etc/default/saned

# Defaults for the saned initscript, from sane-utils

# To enable under systemd please read README.Debian
# Set to yes to start saned under SysV
RUN=yes

# Set to the user saned should run as
RUN_AS_USER=saned

Now run scanimage -L, you should see your scanner. If not google your scanner model and linux sane for more information.

In my case for the Epson WP-3620 Scanner (Printer), add usb 0x4b8 0x8b8 to /etc/sane.d/epson2.conf so it looks like below (use lsusb to obtain the USB productID and deviceID as yours could be different).

# epson2.conf
#
# here are some examples for how to configure the EPSON2 backend

# SCSI
scsi EPSON
# for the GT-6500:
#scsi "EPSON SC"

# Parallel port
#pio 0x278
#pio 0x378
#pio 0x3BC

# USB
usb

# For libusb support for unknown scanners use the following command
# usb <product ID> <device ID>
# e.g.:
# usb 0x4b8 0x110

usb 0x4b8 0x8b8

# Network
#
# net 192.168.1.123
net autodiscovery

Now scanimage will have some output:

pi@scan:~ $ sudo su -s /bin/sh saned
$ scanimage -L
device `epson2:libusb:001:004' is a Epson PID 08B8 flatbed scanner
$ exit

Note: I did have a bit of trouble above, because this is an all-in-one printer/scanner, the device group is lp rather than saned or scanner. Simply run the following to add the group lp to saned.

usermod -a -G lp saned
groups saned

Scanner Service Setup

Next we'll setup saned.socket to listen on port 6566 to accept scan requests over the network. Start by checking /etc/services to ensure

pi@scan:~ $ cat /etc/services | grep sane
sane-port	6566/tcp	sane saned	# SANE network scanner daemon

If you don't see sane-port listed append the output above to /etc/services.

Now edit /etc/sane.d/saned.conf to allow connections from your network; such as 192.168.1.0/24 - under scan-client.somedomain.firm.

pi@scan:~ $ sudo vim /etc/sane.d/saned.conf
# saned.conf
# Configuration for the saned daemon

## Daemon options
# Port range for the data connection. Choose a range inside [1024 - 65535].
# Avoid specifying too large a range, for performance reasons.
#
# ONLY use this if your saned server is sitting behind a firewall. If your
# firewall is a Linux machine, we strongly recommend using the
# Netfilter nf_conntrack_sane connection tracking module instead.
#
# data_portrange = 10000 - 10100


## Access list
# A list of host names, IP addresses or IP subnets (CIDR notation) that
# are permitted to use local SANE devices. IPv6 addresses must be enclosed
# in brackets, and should always be specified in their compressed form.
#
# The hostname matching is not case-sensitive.

#scan-client.somedomain.firm
192.168.1.0/24
#192.168.0.1/29
#[2001:db8:185e::42:12]
#[2001:db8:185e::42:12]/64

# NOTE: /etc/inetd.conf (or /etc/xinetd.conf) and
# /etc/services must also be properly configured to start
# the saned daemon as documented in saned(8), services(4)
# and inetd.conf(4) (or xinetd.conf(5)).

Please adjust the subnet specification 192.168.1.0/24 to your network architecture. You can also explicitly specify single IPs. If you do not edit this file, SaneTwain will hang when contacting your Raspberry Pi scanner server.

The latest Raspbian images now have systemd, enable and restart the saned.socket unit.

pi@scan:~ $ sudo systemctl enable saned.socket
pi@scan:~ $ sudo systemctl restart saned.socket

Now you can reboot the Raspberry Pi (sudo reboot).

From a remote machine run the following to test the connection:

mford@reaper:~$ telnet scan 6566
Trying 10.13.37.94...
Connected to scan.
Escape character is '^]'.

If you receive "Connected to [Hostname|IpAddr]" then the configuration is a success!!!

You should now have a networked scan server. Next up is configuring clients. But I'll save that for the next blog post.

Cheers!!