ScanSnap Wi-Fi Protocols

Summary. ScanSnap scanners talk to their host software over Wi-Fi using an unencrypted, proprietary protocol: UDP for discovery and notifications, a TCP control channel for registration, and a TCP channel that tunnels SCSI commands for status and scanning. The models share this skeleton but differ in the frame magic, the registration and what else the control channel carries. Each model has its own write-up; this page lists them and what they have in common.

This is an independent interoperability project and is not affiliated with or endorsed by PFU or Fujitsu. See the disclaimer.

Contents

Write-ups per model

ModelWrite-upCodeStatus
ScanSnap iX1500iX1500 protocolsrc/scansnap/adapters/ix1500/tested live
ScanSnap iX500iX500 protocolsrc/scansnap/adapters/ix500/tested live (firmware 0U00)

Each write-up is the single source of truth for its model, including its own list of open questions. Which other ScanSnap models exist and why they are not supported is in the model list. Code shared by both models (framing, SCSI tunnel, discovery probes, UDP notifications) lives in src/scansnap/adapters/scansnap_wifi/ (ADR 0007).

What the models share

Where they differ

iX1500iX500
Frame magicssNRVENS
Discovery reply144 B, serial at 132132 B, serial only in the name
Registration body352 B, no secret96 B, with the encoded Wi-Fi password
Pairingon the touch panelover USB with ScanSnap Home; the client reuses the paired host ID
JSON calls (0x41), users, profilesyesno
Scan buttonUDP datagram from the touch panelUDP notification 0x01 to the registered host
C2 status length0x30 B0x20 B
Gray scansgray D4 block (JPEG still has three channels)always color, converted on the host

Details and evidence are in the write-ups.

Sources and conventions

Every write-up lists its own sources. Raw captures and test logs are not published, because they may contain private data (scanned documents, device and network identifiers); the write-ups refer to them only as private sources, never by file name.

Conventions in all write-ups: offsets are byte offsets from the start of the frame or body; integers are big-endian unless marked little-endian. Anything not confirmed by observation is marked UNVERIFIED in the write-up and # UNVERIFIED: in the code.

View this page on GitHub