Chapter 21: Mobile Raptag Application
RFID Inventory Management
The Raptag mobile application enables rapid inventory counting using RFID technology. Associates can scan entire racks of merchandise in seconds, dramatically reducing inventory count time and improving accuracy.
Technology Stack
| Component | Technology | Rationale |
|---|---|---|
| Framework | .NET MAUI | Cross-platform, native RFID SDK access |
| RFID SDK | Zebra RFID SDK | Enterprise-grade, widely deployed |
| Local Database | SQLite | Offline-capable, lightweight |
| Sync | REST API + Background Service | Reliable batch uploads |
| Tag Printing | Zebra ZPL | Industry standard label format |
Architecture Overview
┌─────────────────────────────────────────────────────────────────────┐
│ RAPTAG MOBILE APPLICATION │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐│
│ │ UI LAYER ││
│ │ Login │ Session │ Scanning │ Summary │ Sync ││
│ └─────────────────────────────────────────────────────────────────┘│
│ │ │
│ ┌─────────────────────────────────────────────────────────────────┐│
│ │ VIEW MODELS ││
│ │ LoginVM │ SessionVM │ ScanVM │ SummaryVM │ SyncVM ││
│ └─────────────────────────────────────────────────────────────────┘│
│ │ │
│ ┌───────────────┬───────────────┬───────────────┬─────────────────┐│
│ │ RFID Service │ Sync Service │ Print Service │ Session Service ││
│ │ (Zebra SDK) │ (HTTP/Queue) │ (ZPL/BT) │ (State Mgmt) ││
│ └───────────────┴───────────────┴───────────────┴─────────────────┘│
│ │ │
│ ┌─────────────────────────────────────────────────────────────────┐│
│ │ LOCAL SQLITE DATABASE ││
│ │ - Sessions - Tags ││
│ │ - Scan Records - Product Cache ││
│ │ - Sync Queue - Settings ││
│ └─────────────────────────────────────────────────────────────────┘│
│ │
└─────────────────────────────────────────────────────────────────────┘
│
┌────────▼────────┐
│ Central API │
│ (When Online) │
└─────────────────┘
Network Architecture: How Raptag Connects
Important: Raptag connects directly to the Central Cloud API - NOT to the POS Client.
┌─────────────────────────────────────────────────────────────────────────────────────┐
│ RAPTAG NETWORK ARCHITECTURE │
└─────────────────────────────────────────────────────────────────────────────────────┘
CORRECT UNDERSTANDING:
┌─────────────────────────────────────────────────────────────────┐
│ CENTRAL CLOUD API │
│ (Multi-Tenant SaaS) │
│ │
│ api.pos-platform.com │
│ └── /api/v1/inventory/* │
│ └── /api/v1/rfid/* │
│ └── /api/v1/auth/* │
└─────────────────────────────────────────────────────────────────┘
│ │
┌──────────┴──────────┐ ┌──────────┴──────────┐
│ │ │ │
▼ ▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Raptag │ │ POS │ │ Admin │
│ Mobile │ │ Client │ │ Portal │
│ │ │ │ │ │
│ (RFID) │ │ (Sales) │ │ (Web) │
└──────────┘ └──────────┘ └──────────┘
│ │
WiFi/LTE LAN/WiFi
│ │
Store Floor Register
COMMON MISCONCEPTION (WRONG):
╔═══════════════════════════════╗
║ Raptag → POS Client → Cloud ║ ← WRONG!
╚═══════════════════════════════╝
Raptag does NOT connect through POS Client.
They are SIBLINGS, not parent-child.
Why Direct Cloud Connection?
| Benefit | Explanation |
|---|---|
| Independence | Raptag works even if POS Client is down |
| Mobility | Can scan anywhere with WiFi (backroom, dock, sales floor) |
| Simplicity | No complex local networking between devices |
| Consistency | Same API endpoints as all other clients |
| Scalability | Multiple Raptag devices don’t overload single POS |
Connection Flow
STEP 1: DEVICE REGISTRATION
┌──────────────────────────────────────────────────────────────────────────────┐
│ │
│ 1. Admin logs into Admin Portal │
│ 2. Navigate to Settings → RFID → Devices → Add Device │
│ 3. Portal generates QR code with: │
│ • Tenant ID │
│ • API endpoint URL │
│ • Registration token │
│ 4. Scan QR code with Raptag app │
│ 5. Device registered to tenant │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
STEP 2: DAILY OPERATION
┌──────────────────────────────────────────────────────────────────────────────┐
│ │
│ 1. Associate enters PIN on Raptag │
│ → POST /api/v1/auth/pin-login │
│ ← JWT token returned │
│ │
│ 2. Raptag syncs product catalog (if stale) │
│ → GET /api/v1/products?since=2025-01-28 │
│ ← Updated products cached locally │
│ │
│ 3. Associate creates scan session │
│ → POST /api/v1/rfid/sessions │
│ ← Session ID returned │
│ │
│ 4. Scans are stored locally during session │
│ (Offline-capable - no API calls during scan) │
│ │
│ 5. Session completed and submitted │
│ → POST /api/v1/rfid/sessions/{id}/complete │
│ Body: { "tagReads": [...], "items": [...] } │
│ ← Confirmation returned │
│ │
│ 6. Cloud updates inventory records │
│ → Inventory adjustments broadcast to POS Clients via SignalR │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
Offline Mode
When WiFi is unavailable:
OFFLINE OPERATION:
┌────────────────────────────────────────────────────────────────────────────┐
│ │
│ Raptag App Local SQLite │
│ │ │ │
│ │ 1. PIN login │ │
│ ├───────────────────────────────────►│ Validate against cached users │
│ │ │ │
│ │ 2. Start session │ │
│ ├───────────────────────────────────►│ Create local session record │
│ │ │ │
│ │ 3. Scan tags │ │
│ ├───────────────────────────────────►│ Store in tag_reads table │
│ │ │ │
│ │ 4. Complete session │ │
│ ├───────────────────────────────────►│ Add to sync_queue │
│ │ │ │
│ │ ─── WiFi Restored ─── │
│ │ │ │
│ │ 5. Background sync │ │
│ │◄───────────────────────────────────┤ Flush sync_queue to Cloud │
│ │ │ │
└────────────────────────────────────────────────────────────────────────────┘
No network? No problem. Sessions queue and sync when WiFi returns.
RFID Configuration (Admin Portal)
RFID settings are configured in the Admin Portal (not a separate system):
ADMIN PORTAL → Settings → RFID / Raptag
┌─────────────────────────────────────────────────────────────────────────────┐
│ RFID SETTINGS │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ DEVICES [+ Add] │
│ ┌─────────────────────────────────────────────────────────────────────────┐
│ │ Device Name │ Model │ Location │ Last Seen │ Status │
│ ├──────────────────┼───────────┼──────────┼──────────────┼──────────────┤
│ │ Handheld-GM-01 │ MC3390R │ GM │ 2 min ago │ ● Online │
│ │ Handheld-GM-02 │ MC3390R │ GM │ 15 min ago │ ○ Idle │
│ │ Sled-HM-01 │ RFD40 │ HM │ 3 hours ago │ ○ Offline │
│ └─────────────────────────────────────────────────────────────────────────┘
│ │
│ TAG MAPPINGS │
│ ┌─────────────────────────────────────────────────────────────────────────┐
│ │ EPC mappings are auto-generated when tags are printed. │
│ │ Use "Import Mappings" for pre-encoded tags from vendor. │
│ │ │
│ │ Total Mappings: 8,432 [Import Mappings] [Export Mappings] │
│ └─────────────────────────────────────────────────────────────────────────┘
│ │
│ SCAN SETTINGS │
│ ┌─────────────────────────────────────────────────────────────────────────┐
│ │ │
│ │ Default Power Level: [25 dBm ▼] │
│ │ Read Timeout: [5 seconds ▼] │
│ │ Duplicate Filter: [✓] Skip if read within 3 seconds │
│ │ Unknown Tag Handling: [● Flag for review ○ Ignore] │
│ │ │
│ └─────────────────────────────────────────────────────────────────────────┘
│ │
│ VARIANCE THRESHOLDS │
│ ┌─────────────────────────────────────────────────────────────────────────┐
│ │ │
│ │ Auto-approve if variance ≤ [2% ▼] │
│ │ Require recount if variance > [5% ▼] │
│ │ │
│ └─────────────────────────────────────────────────────────────────────────┘
│ │
└─────────────────────────────────────────────────────────────────────────────┘
Screen Specifications
Screen 1: Login
Purpose: Authenticate user and select operational context.
Route: /login
╔════════════════════════════════════════════════════════════════════╗
║ ║
║ ║
║ ┌──────────────────────────┐ ║
║ │ │ ║
║ │ ████████████████ │ ║
║ │ ██ RAPTAG ██ │ ║
║ │ ████████████████ │ ║
║ │ │ ║
║ └──────────────────────────┘ ║
║ ║
║ RFID Inventory System ║
║ ║
║ ║
║ ┌────────────────────────────────────────────────────────────┐ ║
║ │ │ ║
║ │ Employee PIN │ ║
║ │ ┌────────────────────────────────────────────────────┐ │ ║
║ │ │ ● ● ● ● ○ ○ │ │ ║
║ │ └────────────────────────────────────────────────────┘ │ ║
║ │ │ ║
║ │ ┌───────┐ ┌───────┐ ┌───────┐ │ ║
║ │ │ 1 │ │ 2 │ │ 3 │ │ ║
║ │ └───────┘ └───────┘ └───────┘ │ ║
║ │ ┌───────┐ ┌───────┐ ┌───────┐ │ ║
║ │ │ 4 │ │ 5 │ │ 6 │ │ ║
║ │ └───────┘ └───────┘ └───────┘ │ ║
║ │ ┌───────┐ ┌───────┐ ┌───────┐ │ ║
║ │ │ 7 │ │ 8 │ │ 9 │ │ ║
║ │ └───────┘ └───────┘ └───────┘ │ ║
║ │ ┌───────┐ ┌───────┐ ┌───────┐ │ ║
║ │ │ CLR │ │ 0 │ │ GO │ │ ║
║ │ └───────┘ └───────┘ └───────┘ │ ║
║ │ │ ║
║ └────────────────────────────────────────────────────────────┘ ║
║ ║
║ ║
║ ──────────────────────────────────────────────────────────────── ║
║ Reader: MC3390R | Battery: 85% | ● Offline ║
╚════════════════════════════════════════════════════════════════════╝
Components:
| Component | Specification |
|---|---|
| Logo | Raptag brand, centered |
| PIN Display | 6 digits with masked/filled indicators |
| Numpad | Large touch targets (64x64px min) |
| Clear (CLR) | Reset PIN entry |
| Go | Submit PIN for validation |
| Status Bar | Reader model, battery, connection |
Behavior:
- PIN validated against local cache (for offline)
- Sync user list on startup when online
- Auto-login from last session option
- Lock screen after 5 minutes of inactivity
Screen 2: Session Start
Purpose: Configure a new inventory counting session.
Route: /session/new
╔════════════════════════════════════════════════════════════════════╗
║ NEW INVENTORY SESSION [< Back] ║
╠════════════════════════════════════════════════════════════════════╣
║ ║
║ Welcome, Sarah Miller ║
║ Today: December 29, 2024 ║
║ ║
║ ────────────────────────────────────────────────────────────── ║
║ ║
║ LOCATION * ║
║ ┌────────────────────────────────────────────────────────────┐ ║
║ │ GM - Greenbrier Mall ▼ │ ║
║ └────────────────────────────────────────────────────────────┘ ║
║ ║
║ COUNT TYPE * ║
║ ┌────────────────────────────────────────────────────────────┐ ║
║ │ ○ Full Store Count │ ║
║ │ Complete inventory of entire location │ ║
║ │ │ ║
║ │ ● Zone Count │ ║
║ │ Count specific area/department │ ║
║ │ │ ║
║ │ ○ Spot Check │ ║
║ │ Quick verification of selected items │ ║
║ │ │ ║
║ │ ○ Receiving │ ║
║ │ Verify incoming shipment │ ║
║ └────────────────────────────────────────────────────────────┘ ║
║ ║
║ ZONE (Required for Zone Count) ║
║ ┌────────────────────────────────────────────────────────────┐ ║
║ │ Section A - Men's Tops ▼ │ ║
║ └────────────────────────────────────────────────────────────┘ ║
║ ║
║ NOTES (Optional) ║
║ ┌────────────────────────────────────────────────────────────┐ ║
║ │ Pre-inventory count for Q4 audit │ ║
║ │ │ ║
║ └────────────────────────────────────────────────────────────┘ ║
║ ║
║ ┌────────────────────────────────────────────────────────────┐ ║
║ │ │ ║
║ │ START SESSION │ ║
║ │ │ ║
║ └────────────────────────────────────────────────────────────┘ ║
║ ║
║ ──────────────────────────────────────────────────────────────── ║
║ Reader: Ready | Battery: 85% | ● Online ║
╚════════════════════════════════════════════════════════════════════╝
Count Types:
| Type | Use Case | Expected Items |
|---|---|---|
| Full Store | Annual inventory | 2,000-10,000+ |
| Zone Count | Section audits | 200-1,000 |
| Spot Check | Discrepancy verification | 10-50 |
| Receiving | Shipment verification | 50-500 |
Zones (Configurable per location):
- Section A - Men’s Tops
- Section B - Men’s Bottoms
- Section C - Women’s Tops
- Section D - Women’s Bottoms
- Section E - Accessories
- Backroom
- Display Window
Screen 3: Scanning (Main Interface)
Purpose: The primary RFID scanning interface during an active session.
Route: /session/scan
╔════════════════════════════════════════════════════════════════════╗
║ SCANNING - Zone Count [Pause] [End] ║
╠════════════════════════════════════════════════════════════════════╣
║ ║
║ Location: GM - Greenbrier Mall Zone: Section A - Men's Tops ║
║ Started: 2:45 PM Duration: 00:12:34 ║
║ ║
║ ┌────────────────────────────────────────────────────────────────╢
║ │ ║
║ │ LIVE SCAN ║
║ │ ║
║ │ ┌──────────────────────────────────────────┐ ║
║ │ │ │ ║
║ │ │ ████ SCANNING ████ │ ║
║ │ │ │ ║
║ │ │ Tags Read: 847 │ ║
║ │ │ Unique Items: 312 │ ║
║ │ │ Read Rate: 42/sec │ ║
║ │ │ │ ║
║ │ └──────────────────────────────────────────┘ ║
║ │ ║
║ │ [HOLD TRIGGER TO SCAN] ║
║ │ ║
║ └────────────────────────────────────────────────────────────────╢
║ ║
║ RECENT SCANS ║
║ ┌────────────────────────────────────────────────────────────────╢
║ │ ║
║ │ ✓ NXJ1078-NAV-M Galaxy V-Neck (M, Navy) x3 ║
║ │ ✓ NXJ1078-NAV-L Galaxy V-Neck (L, Navy) x2 ║
║ │ ✓ NXP0892-KHK-32 Slim Fit Chinos (32, Khaki) x1 ║
║ │ ! UNKNOWN TAG E280116060000... x1 ║
║ │ ✓ NXA0234-BLK-M Leather Belt (M, Black) x4 ║
║ │ ║
║ │ [View All 312 Items] ║
║ │ ║
║ └────────────────────────────────────────────────────────────────╢
║ ║
║ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ║
║ │ [MANUAL ADD] │ │ [FIND ITEM] │ │ [SETTINGS] │ ║
║ └─────────────────┘ └─────────────────┘ └─────────────────┘ ║
║ ║
║ ──────────────────────────────────────────────────────────────── ║
║ Reader: Scanning | Battery: 82% | Signal: Strong ║
╚════════════════════════════════════════════════════════════════════╝
Scanning States:
IDLE STATE SCANNING STATE
┌────────────────────────┐ ┌────────────────────────┐
│ │ │ │
│ ○ ○ ○ ○ ○ ○ ○ ○ │ │ ████████████████ │
│ │ │ ████ ACTIVE ████ │
│ Ready to Scan │ │ ████████████████ │
│ │ │ │
│ Tags: 0 │ │ Tags: 847 │
│ │ │ Rate: 42/sec │
│ │ │ │
└────────────────────────┘ └────────────────────────┘
PAUSED STATE COMPLETED STATE
┌────────────────────────┐ ┌────────────────────────┐
│ │ │ │
│ ║ ║ PAUSED ║ ║ │ │ ✓ COMPLETE ✓ │
│ │ │ │
│ Session paused │ │ Session ended │
│ Tap to resume │ │ │
│ │ │ Total: 847 tags │
│ Tags: 312 │ │ 312 unique items │
│ │ │ │
└────────────────────────┘ └────────────────────────┘
Reader Signal Strength:
| Level | Icon | Read Rate |
|---|---|---|
| Strong | 4 bars | 40+ tags/sec |
| Good | 3 bars | 20-40 tags/sec |
| Fair | 2 bars | 10-20 tags/sec |
| Weak | 1 bar | < 10 tags/sec |
| None | X | No connection |
Quick Actions:
| Action | Purpose |
|---|---|
| Manual Add | Barcode scan for untagged items |
| Find Item | Locate specific SKU using reader |
| Settings | Adjust power, beep, vibration |
Screen 4: Session Summary
Purpose: Review results and submit completed count session.
Route: /session/summary
╔════════════════════════════════════════════════════════════════════╗
║ SESSION SUMMARY [< Back] ║
╠════════════════════════════════════════════════════════════════════╣
║ ║
║ ┌────────────────────────────────────────────────────────────────╢
║ │ SESSION #GM-2024-1229-001 ║
║ │ Zone Count - Section A (Men's Tops) ║
║ │ Location: GM - Greenbrier Mall ║
║ │ Operator: Sarah Miller ║
║ │ Date: December 29, 2024 ║
║ │ Duration: 00:23:45 ║
║ └────────────────────────────────────────────────────────────────╢
║ ║
║ SCAN RESULTS ║
║ ┌─────────────────────────────────────────────────────────────┐ ║
║ │ │ ║
║ │ ┌─────────────────────┐ ┌─────────────────────┐ │ ║
║ │ │ TOTAL TAGS │ │ UNIQUE ITEMS │ │ ║
║ │ │ 847 │ │ 312 │ │ ║
║ │ └─────────────────────┘ └─────────────────────┘ │ ║
║ │ │ ║
║ │ ┌─────────────────────┐ ┌─────────────────────┐ │ ║
║ │ │ EXPECTED │ │ VARIANCE │ │ ║
║ │ │ 305 │ │ +7 (2.3%) │ │ ║
║ │ └─────────────────────┘ └─────────────────────┘ │ ║
║ │ │ ║
║ └─────────────────────────────────────────────────────────────┘ ║
║ ║
║ DISCREPANCIES View All ║
║ ┌─────────────────────────────────────────────────────────────┐ ║
║ │ │ ║
║ │ ▲ OVER (5 items) │ ║
║ │ NXJ1078-NAV-M Expected: 12 Counted: 15 (+3) │ ║
║ │ NXP0892-KHK-32 Expected: 8 Counted: 10 (+2) │ ║
║ │ │ ║
║ │ ▼ SHORT (3 items) │ ║
║ │ NXJ2156-WHT-L Expected: 6 Counted: 4 (-2) │ ║
║ │ NXA0234-BRN-M Expected: 5 Counted: 4 (-1) │ ║
║ │ │ ║
║ │ ? UNKNOWN (2 tags) │ ║
║ │ E280116060000207523456789 │ ║
║ │ E280116060000207523456790 │ ║
║ │ │ ║
║ └─────────────────────────────────────────────────────────────┘ ║
║ ║
║ ┌─────────────────────┐ ┌─────────────────────────────────────┐ ║
║ │ │ │ │ ║
║ │ [RECOUNT SECTION] │ │ SUBMIT SESSION │ ║
║ │ │ │ │ ║
║ └─────────────────────┘ └─────────────────────────────────────┘ ║
║ ║
║ ──────────────────────────────────────────────────────────────── ║
║ Reader: Idle | Battery: 78% | ● Online ║
╚════════════════════════════════════════════════════════════════════╝
Variance Thresholds (Configurable):
| Variance | Color | Action |
|---|---|---|
| 0% | Green | Auto-approve |
| 1-2% | Yellow | Review recommended |
| 3-5% | Orange | Manager review required |
| > 5% | Red | Recount required |
Screen 5: Sync Status
Purpose: Monitor data synchronization with central server.
Route: /sync
╔════════════════════════════════════════════════════════════════════╗
║ SYNC STATUS [< Menu] ║
╠════════════════════════════════════════════════════════════════════╣
║ ║
║ CONNECTION ║
║ ┌────────────────────────────────────────────────────────────────╢
║ │ ║
║ │ ● Connected to Central Server ║
║ │ Server: api.nexuspos.com ║
║ │ Latency: 45ms ║
║ │ Last Sync: 2 minutes ago ║
║ │ ║
║ └────────────────────────────────────────────────────────────────╢
║ ║
║ PENDING UPLOADS ║
║ ┌────────────────────────────────────────────────────────────────╢
║ │ ║
║ │ ┌─────────────────────────────────────────────────────────┐║
║ │ │ Session #GM-2024-1229-001 Uploading │║
║ │ │ 312 items, 847 tag reads │║
║ │ │ Progress: ████████████░░░░░░░░ 62% │║
║ │ └─────────────────────────────────────────────────────────┘║
║ │ ║
║ │ ┌─────────────────────────────────────────────────────────┐║
║ │ │ Session #GM-2024-1228-003 Pending │║
║ │ │ 156 items, 423 tag reads │║
║ │ │ Waiting... │║
║ │ └─────────────────────────────────────────────────────────┘║
║ │ ║
║ └────────────────────────────────────────────────────────────────╢
║ ║
║ RECENT SYNCS ║
║ ┌────────────────────────────────────────────────────────────────╢
║ │ ║
║ │ ✓ Product Catalog Updated 10 min ago 1,245 items ║
║ │ ✓ Tag Mappings Updated 10 min ago 8,432 tags ║
║ │ ✓ User List Updated 1 hour ago 24 users ║
║ │ ✓ Location Config Updated 1 hour ago 5 locations ║
║ │ ║
║ └────────────────────────────────────────────────────────────────╢
║ ║
║ ┌─────────────────────────────────────────────────────────────┐ ║
║ │ │ ║
║ │ [SYNC NOW] │ ║
║ │ │ ║
║ └─────────────────────────────────────────────────────────────┘ ║
║ ║
║ Storage: 245 MB used of 2 GB | Last Full Sync: 12/29 9:00 AM ║
║ ║
║ ──────────────────────────────────────────────────────────────── ║
║ Reader: Idle | Battery: 78% | ● Online ║
╚════════════════════════════════════════════════════════════════════╝
Zebra RFID Reader Integration
Supported Devices
| Model | Form Factor | Range | Use Case |
|---|---|---|---|
| MC3390R | Handheld | 20 ft | Store counts |
| RFD40 | Sled | 12 ft | Attaches to phone |
| FX9600 | Fixed | 30 ft | Dock door receiving |
SDK Integration
public interface IRfidService
{
event EventHandler<TagReadEventArgs> TagRead;
event EventHandler<BatteryEventArgs> BatteryChanged;
event EventHandler<ReaderEventArgs> ReaderConnected;
event EventHandler<ReaderEventArgs> ReaderDisconnected;
Task<bool> ConnectAsync();
Task DisconnectAsync();
Task StartInventoryAsync();
Task StopInventoryAsync();
Task<ReaderStatus> GetStatusAsync();
Task SetPowerLevelAsync(int dbm);
}
public class ZebraRfidService : IRfidService
{
private readonly RFIDReader _reader;
private readonly EventHandler _eventHandler;
public async Task<bool> ConnectAsync()
{
var readers = RFIDReader.GetAvailableReaders();
if (readers.Count == 0) return false;
_reader = readers[0];
_reader.Events.TagReadEvent += OnTagRead;
_reader.Events.ReaderAppearEvent += OnReaderAppear;
_reader.Events.ReaderDisappearEvent += OnReaderDisappear;
_reader.Events.BatteryEvent += OnBatteryChanged;
return await _reader.ConnectAsync();
}
public async Task StartInventoryAsync()
{
var config = new InventoryConfig
{
MemoryBank = MEMORY_BANK.MEMORY_BANK_EPC,
ReportUnique = true,
StopTrigger = new StopTrigger
{
StopTriggerType = STOP_TRIGGER_TYPE.STOP_TRIGGER_TYPE_TAG_OBSERVATION
}
};
await _reader.Inventory.PerformAsync(config);
}
private void OnTagRead(object sender, TagDataEventArgs e)
{
foreach (var tag in e.ReadEventData.TagData)
{
var epc = tag.TagID;
var rssi = tag.PeakRSSI;
TagRead?.Invoke(this, new TagReadEventArgs(epc, rssi));
}
}
}
Power Level Settings
| Power (dBm) | Range | Battery Impact | Use Case |
|---|---|---|---|
| 30 (Max) | 20+ ft | High | Full store |
| 25 | 15 ft | Medium | Zone count |
| 20 | 10 ft | Low | Spot check |
| 15 | 5 ft | Minimal | Single rack |
Tag Printing Workflow
Encoding New Tags
╔════════════════════════════════════════════════════════════════════╗
║ PRINT RFID TAGS [< Back] ║
╠════════════════════════════════════════════════════════════════════╣
║ ║
║ PRODUCT ║
║ ┌────────────────────────────────────────────────────────────────╢
║ │ NXJ1078-NAV-M ║
║ │ Galaxy V-Neck Tee - Navy, Medium ║
║ │ Price: $29.00 ║
║ │ Current Stock: 15 (GM) ║
║ └────────────────────────────────────────────────────────────────╢
║ ║
║ PRINT SETTINGS ║
║ ┌────────────────────────────────────────────────────────────────╢
║ │ ║
║ │ Quantity: [ 5 ] tags ║
║ │ ║
║ │ Tag Type: ○ Hang Tag (Apparel) ║
║ │ ● Price Tag (Standard) ║
║ │ ○ Label (Adhesive) ║
║ │ ║
║ │ Printer: [Zebra ZD621R ▼] ║
║ │ ║
║ └────────────────────────────────────────────────────────────────╢
║ ║
║ TAG PREVIEW ║
║ ┌────────────────────────────────────────────────────────────────╢
║ │ ┌─────────────────────────┐ ║
║ │ │ NEXUS CLOTHING │ ║
║ │ │ │ ║
║ │ │ Galaxy V-Neck Tee │ ║
║ │ │ Navy / Medium │ ║
║ │ │ │ ║
║ │ │ $29.00 │ ║
║ │ │ │ ║
║ │ │ ||||||||||||||||||| │ <- Barcode ║
║ │ │ NXJ1078-NAV-M │ ║
║ │ │ │ ║
║ │ │ [RFID ENCODED] │ <- Chip indicator ║
║ │ └─────────────────────────┘ ║
║ │ ║
║ └────────────────────────────────────────────────────────────────╢
║ ║
║ ┌─────────────────────────────────────────────────────────────┐ ║
║ │ │ ║
║ │ [PRINT 5 TAGS] │ ║
║ │ │ ║
║ └─────────────────────────────────────────────────────────────┘ ║
║ ║
╚════════════════════════════════════════════════════════════════════╝
ZPL Template
^XA
^FO50,50^A0N,30,30^FDNexus Clothing^FS
^FO50,100^A0N,40,40^FD%PRODUCT_NAME%^FS
^FO50,150^A0N,25,25^FD%VARIANT%^FS
^FO50,200^A0N,50,50^FD$%PRICE%^FS
^FO50,280^BY2^BCN,80,Y,N,N^FD%SKU%^FS
^RFW,H,2,4,1^FD%EPC%^FS
^RFR,H,0,12,1^FN0^FS
^XZ
Template Variables:
| Variable | Source | Example |
|---|---|---|
| %PRODUCT_NAME% | Product.Name | Galaxy V-Neck Tee |
| %VARIANT% | Size/Color | Navy / Medium |
| %PRICE% | Product.Price | 29.00 |
| %SKU% | Product.SKU | NXJ1078-NAV-M |
| %EPC% | Generated | E28011606000020752345 |
Local Database Schema
-- Sessions
CREATE TABLE sessions (
id TEXT PRIMARY KEY,
location_code TEXT NOT NULL,
count_type TEXT NOT NULL,
zone TEXT,
operator_id TEXT NOT NULL,
started_at TEXT NOT NULL,
ended_at TEXT,
status TEXT DEFAULT 'active',
notes TEXT,
synced_at TEXT
);
-- Tag Reads (raw data)
CREATE TABLE tag_reads (
id INTEGER PRIMARY KEY AUTOINCREMENT,
session_id TEXT NOT NULL,
epc TEXT NOT NULL,
rssi INTEGER,
read_at TEXT NOT NULL,
FOREIGN KEY (session_id) REFERENCES sessions(id)
);
-- Session Items (aggregated)
CREATE TABLE session_items (
id INTEGER PRIMARY KEY AUTOINCREMENT,
session_id TEXT NOT NULL,
sku TEXT,
epc TEXT NOT NULL,
product_name TEXT,
quantity INTEGER DEFAULT 1,
expected_qty INTEGER,
status TEXT DEFAULT 'matched', -- matched, over, short, unknown
FOREIGN KEY (session_id) REFERENCES sessions(id)
);
-- Product Cache
CREATE TABLE products (
sku TEXT PRIMARY KEY,
name TEXT NOT NULL,
barcode TEXT,
price REAL,
category TEXT,
last_synced TEXT NOT NULL
);
-- Tag Mappings (SKU to EPC prefix)
CREATE TABLE tag_mappings (
epc_prefix TEXT PRIMARY KEY,
sku TEXT NOT NULL,
last_synced TEXT NOT NULL
);
-- Sync Queue
CREATE TABLE sync_queue (
id INTEGER PRIMARY KEY AUTOINCREMENT,
entity_type TEXT NOT NULL,
entity_id TEXT NOT NULL,
action TEXT NOT NULL,
payload TEXT NOT NULL,
retry_count INTEGER DEFAULT 0,
created_at TEXT NOT NULL,
status TEXT DEFAULT 'pending'
);
Offline Capabilities
| Feature | Offline Behavior |
|---|---|
| Login | Uses cached credentials |
| Session Start | Creates local session ID |
| Scanning | Full functionality |
| Product Lookup | Uses cached catalog |
| Session Summary | Calculates from local data |
| Submit | Queues for later sync |
| Sync Status | Shows pending items |
Sync Priority
| Priority | Data Type | Frequency |
|---|---|---|
| 1 (Critical) | Completed sessions | Immediate when online |
| 2 (High) | Tag reads | Background sync |
| 3 (Medium) | Product updates | Pull on app launch |
| 4 (Low) | User list | Daily refresh |
Summary
The Raptag mobile application provides:
- Fast Authentication: PIN-based login with offline support
- Flexible Counting: Multiple session types for different needs
- Real-time Scanning: Live tag counts with signal feedback
- Accuracy Tracking: Variance calculation and discrepancy flagging
- Reliable Sync: Queue-based upload with retry logic
- Tag Printing: Integrated label printing with encoding
Implementation complete. Ready for engineer review.