Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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

ComponentTechnologyRationale
Framework.NET MAUICross-platform, native RFID SDK access
RFID SDKZebra RFID SDKEnterprise-grade, widely deployed
Local DatabaseSQLiteOffline-capable, lightweight
SyncREST API + Background ServiceReliable batch uploads
Tag PrintingZebra ZPLIndustry 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?

BenefitExplanation
IndependenceRaptag works even if POS Client is down
MobilityCan scan anywhere with WiFi (backroom, dock, sales floor)
SimplicityNo complex local networking between devices
ConsistencySame API endpoints as all other clients
ScalabilityMultiple 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:

ComponentSpecification
LogoRaptag brand, centered
PIN Display6 digits with masked/filled indicators
NumpadLarge touch targets (64x64px min)
Clear (CLR)Reset PIN entry
GoSubmit PIN for validation
Status BarReader 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:

TypeUse CaseExpected Items
Full StoreAnnual inventory2,000-10,000+
Zone CountSection audits200-1,000
Spot CheckDiscrepancy verification10-50
ReceivingShipment verification50-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:

LevelIconRead Rate
Strong4 bars40+ tags/sec
Good3 bars20-40 tags/sec
Fair2 bars10-20 tags/sec
Weak1 bar< 10 tags/sec
NoneXNo connection

Quick Actions:

ActionPurpose
Manual AddBarcode scan for untagged items
Find ItemLocate specific SKU using reader
SettingsAdjust 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):

VarianceColorAction
0%GreenAuto-approve
1-2%YellowReview recommended
3-5%OrangeManager review required
> 5%RedRecount 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

ModelForm FactorRangeUse Case
MC3390RHandheld20 ftStore counts
RFD40Sled12 ftAttaches to phone
FX9600Fixed30 ftDock 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)RangeBattery ImpactUse Case
30 (Max)20+ ftHighFull store
2515 ftMediumZone count
2010 ftLowSpot check
155 ftMinimalSingle 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:

VariableSourceExample
%PRODUCT_NAME%Product.NameGalaxy V-Neck Tee
%VARIANT%Size/ColorNavy / Medium
%PRICE%Product.Price29.00
%SKU%Product.SKUNXJ1078-NAV-M
%EPC%GeneratedE28011606000020752345

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

FeatureOffline Behavior
LoginUses cached credentials
Session StartCreates local session ID
ScanningFull functionality
Product LookupUses cached catalog
Session SummaryCalculates from local data
SubmitQueues for later sync
Sync StatusShows pending items

Sync Priority

PriorityData TypeFrequency
1 (Critical)Completed sessionsImmediate when online
2 (High)Tag readsBackground sync
3 (Medium)Product updatesPull on app launch
4 (Low)User listDaily refresh

Summary

The Raptag mobile application provides:

  1. Fast Authentication: PIN-based login with offline support
  2. Flexible Counting: Multiple session types for different needs
  3. Real-time Scanning: Live tag counts with signal feedback
  4. Accuracy Tracking: Variance calculation and discrepancy flagging
  5. Reliable Sync: Queue-based upload with retry logic
  6. Tag Printing: Integrated label printing with encoding

Implementation complete. Ready for engineer review.