Wonder-Shipped Reader Provisioning
How readers provisioned by Wonder arrive ready to plug in and work.
What "Wonder-Shipped" Means
Wonder-Shipped = Reader is configured at Wonder's bench before shipping to customer. Hardware arrives with:
- CAP installed (Titan Agent)
- Identity provisioned (
/cust/rw_dir/contains ca.crt, client.crt, client.key, titan.json) - MQTT configured to reach
mqtt.titanrfid.com:8883with TLS - Reader row created in customer's Titan Cloud account
- Titan Cloud knows which customer owns this reader (device binding)
Customer experience: Unbox, plug into PoE, reader appears online in hub within 60 seconds.
Bench Provisioning Process
What Wonder's Technician Does
- Receive reader (Impinj R700, new or returned hardware)
- Power reader on bench (PoE or AC adapter)
- Access reader web UI at
https://<bench-lan-ip>/(reader on bench network) - Run provisioning tool:
readerprov provision \-reader 192.0.2.10 \-tenant acme-corp \-name "Goods In 3"
What readerprov provision Does
In this order (atomic transaction - all or nothing):
- Read serial from reader via
GET /api/v1/system(e.g.370-12-34-5678-9012) - Check tenant exists in Titan Cloud database (fail if not found)
- Issue client certificate:
- CN (Common Name) = serial number
- Validity: 10 years
- Signed by Titan Cloud CA
- Create reader row in customer's account:
- Reader ID (Titan internal UUID for the
readersrow; not the cert CN) - Name: "Goods In 3"
- Serial: 370-12-34-5678-9012
- Tenant: acme-corp
- Reader ID (Titan internal UUID for the
- Create device binding in
devicestable:- Identity: serial number
- Tenant: acme-corp
- Reader: (FK to reader row above)
- Provisioned: at_bench
- Install CAP (if not already present):
- Upload
titan-agent-0.1.6.0.upgx - Set Persistent Data = rw_dir
- Upload
- Write identity files to
/cust/rw_dir/via reader REST API:POST /api/v1/files/cust/rw_dir/ca.crt(Titan CA)POST /api/v1/files/cust/rw_dir/client.crt(reader's cert)POST /api/v1/files/cust/rw_dir/client.key(private key, mode 0600)POST /api/v1/files/cust/rw_dir/titan.json(REST credentials)
- Configure MQTT via
PUT /api/v1/mqtt:- Broker:
mqtt.titanrfid.com:8883 - TLS: enabled
- Client ID:
370-12-34-5678-9012 - Topics:
titan/v1/370-12-34-5678-9012/{events,status}
- Broker:
- Start reader with
titan-defaultpreset:POST /api/v1/profiles/inventory/presets/titan-default/start
- Verify connection:
- Poll
GET /api/v1/statusuntilmqttBrokerConnectionStatus: connected - Poll
GET /api/v1/statusuntilmqttTlsAuthentication: server - Timeout: 60 seconds
- Poll
- Audit log provisioning event:
- Serial, tenant, timestamp, technician, outcome
Rollback on Failure
If any step fails, tool undoes all changes (newest first):
- Restore previous MQTT config
- Restore previous preset
- Delete identity files
- Delete device binding
- Delete reader row
- Discard DB transaction
Reader left unchanged if provisioning fails. No half-configured state.
What Gets Verified
Before boxing:
- Reader shows "connected" in own web UI status
- Hub UI shows reader online (tag reads flowing)
- Start/Stop buttons work (CAP subscribed to commands)
- Identity files persisted in rw_dir (survive CAP restart)
Security Model
Physical Access Required
Provisioning requires:
- Reader on bench (technician's LAN)
- Reader admin credentials (default: root + password from label)
- Access to Titan Cloud database (tenant lookup, reader creation)
Cannot be done remotely. No internet exposure during provisioning. Credentials written over local REST API (HTTPS on bench LAN).
No Shared Secrets
Each reader gets:
- Unique client certificate (CN is the reader serial number, the device identity for MQTT)
- Unique private key (2048-bit RSA or ECDSA P-256)
- Unique REST password (32-byte random)
No shared MQTT username/password. Certificate is the identity.
Audit Trail
Every provisioning logged:
- Serial number
- Tenant (customer)
- Timestamp
- Technician (who ran
readerprov) - Outcome (success, or reason for failure)
Queryable in hub UI → Audit Log, or via API: GET /api/v1/audit?resource=device
Customer Receives Reader
Shipping
Reader is powered off, boxed, shipped to customer address. No changes made to reader after provisioning.
Packing Note
Included in box:
- Reader hardware (R700)
- Serial number label (physical label on reader)
- Quick start: "Plug into PoE. Reader will appear at hub.titanrfid.com within 60 seconds."
No credentials in packing note. Identity is already on reader.
First Boot
Customer plugs reader into PoE:
- Reader powers on
- Stock firmware starts, reads MQTT config (already set to Titan Cloud)
- CAP starts, reads identity from
/cust/rw_dir/ - Reader connects to
mqtt.titanrfid.com:8883with client cert - Broker authenticates (cert CN matches reader serial; ACL allows topics for that identity)
- CAP subscribes to
titan/v1/370-12-34-5678-9012/commands - Stock firmware publishes first status update to
titan/v1/370-12-34-5678-9012/status - Titan ingest resolves serial → device → tenant → reader
- Hub UI shows reader Online
Time to online: ~60 seconds from plug-in.
Advantages of Wonder-Shipped
vs BYO (bring-your-own):
| Aspect | Wonder-Shipped | BYO (Designed, Not Built) |
|---|---|---|
| Customer Setup | Plug in (1 step) | Install CAP, claim, bootstrap (3 steps) |
| Network Exposure | None (bench LAN only) | Bootstrap endpoint on internet |
| Attack Surface | Minimal | Larger (token handling, pull API) |
| Support Burden | Low (works on arrival) | Higher (customer-side install errors) |
| Hardware Control | Required (Wonder must touch hardware) | Not required (customer owns hardware) |
| Time to Online | 60 seconds (plug in) | 5-10 minutes (install + claim + pull) |
Security: Wonder-Shipped is stronger. No internet exposure during provisioning; physical access required; credentials never transit internet.
Trade-off: Requires Wonder to control hardware flow (buy readers, provision at bench, ship to customer). Cannot be used for customer-owned hardware already on-site.
Re-Provisioning (Returned Readers)
Scenario: Reader returned from Customer A, now going to Customer B.
Process:
- Release reader from Customer A's account (operator console; customer requests via support or Wonder):
- Operator releases the device so it unassigns the tenant only (clears device binding;
tenant_id = NULL) - Reader row in Customer A's account marked
released
- Operator releases the device so it unassigns the tenant only (clears device binding;
- Revoke the old client certificate (recommended before re-provisioning):
- Contact support or Wonder to revoke the old certificate on the broker
- Without revocation on the broker, the old cert can still connect to MQTT until support revokes it
- Factory reset reader (config-image mode
default- keeps CAP):- Wipes MQTT config, presets, settings
- Keeps CAP installed
- Keeps
/cust/rw_dir/- old identity still present (will be overwritten)
- Re-provision for Customer B:
- Run
readerprov provision -reader <ip> -tenant customer-b -name "Receiving" - Issues new cert (same reader serial as CN, new keys)
- Overwrites identity files in
/cust/rw_dir/ - Creates device binding to Customer B
- If you completed step 2, the old cert cannot reconnect even if Customer A still has the old credentials
- Run
No cross-contamination: New cert issued for Customer B. If support or Wonder has revoked the old certificate on the broker, Customer A's credentials cannot reconnect. Customer B cannot see Customer A's data (separate tenant).
Factory Reset and Identity
Config-Image Modes
R700 config-image setting controls what survives factory reset:
| Mode | CAP | Identity (/cust/rw_dir/) | When to Use |
|---|---|---|---|
| default | Kept | Kept | Reset config, keep identity (most common) |
| removecap | Wiped | Wiped | Full wipe, return to stock (rare) |
Physical Default Restore button: Uses whatever config-image mode is set (default = default = keeps CAP + identity).
When Identity Survives
- Config reset via web UI (Settings → Reset to defaults) - if mode =
default - Physical Default Restore button - if mode =
default - CAP upgrade (identity in rw_dir, marked Persistent)
- Reader reboot
When Identity Is Wiped
- Config-image mode set to
removecap+ factory reset - Manual delete via REST API:
DELETE /api/v1/files/cust/rw_dir/*
If wiped: Reader must be re-provisioned (new claim, new identity).
What Customer Cannot Change
Reader identity is immutable once provisioned (unless re-provisioned by Wonder):
- Cannot change serial number (hardware property)
- Cannot change client cert (requires CA signing key, which customer doesn't have)
- Cannot move reader to different tenant (requires device binding change, which is Titan DB write)
Customer CAN:
- Rename reader in hub UI (cosmetic only, does not change identity)
- Map antennas to zones
- Configure RF settings (power, session, etc.)
- Start/Stop reader
- Factory reset (if mode =
default, identity survives)
Troubleshooting Wonder-Shipped Readers
Reader Offline After Arrival
Check:
- Powered? (PoE or AC - needs 802.3at or 802.3bt)
- Network? (Reader reachable on LAN; firewall allows outbound 8883/tcp)
- CAP running? (Reader web UI → Apps → Titan Agent → Status)
- Identity present? (SSH or REST API:
ls /cust/rw_dir/- should have 4 files) - MQTT config? (Reader web UI → Status → mqttBrokerConnectionStatus)
Common causes:
- No PoE power (reader not supported by switch PoE budget)
- Firewall blocks outbound 8883/tcp (reader cannot reach mqtt.titanrfid.com)
- CAP crashed (check CAP log)
- Identity wiped (customer did
removecapfactory reset)
Start/Stop Doesn't Work
Check:
- CAP running? (Web UI → Apps → Status = Running)
- CAP subscribed? (CAP log →
Subscribed to titan/v1/.../commands) - Commands reaching reader? (Hub audit log → command published)
- Acks sent? (CAP log →
Published ack: {...})
Fix: Usually CAP restart. If persist, re-provision identity.
Reader Shows Wrong Customer
Cannot happen if provisioned correctly. Device binding is set at bench, immutable.
If it happens: Provisioning error. Contact Wonder support with serial number.
Next Steps
- BYO Overview - Alternative: customer-owned hardware (claim-and-pull, designed but not built)
- CAP Install - Manual CAP installation (for lab/dev)
- CAP Identity - Understanding rw_dir files
- Factory Reset - Safely resetting reader