Add scanner-to-api design document
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
109
docs/plans/2026-05-07-scanner-to-api-design.md
Normal file
109
docs/plans/2026-05-07-scanner-to-api-design.md
Normal file
@@ -0,0 +1,109 @@
|
||||
# PAD Scanner to API - Design
|
||||
|
||||
## Goal
|
||||
|
||||
Build a Flutter app on the D500 PAD scanner device that captures scanned barcodes and sends the data to a configurable HTTP endpoint via POST request. This is a proof-of-concept to validate the end-to-end data pipeline.
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
D500 Scanner Hardware
|
||||
│
|
||||
▼
|
||||
Device Scan Service (system broadcast)
|
||||
action: com.android.server.scannerservice.broadcast
|
||||
key: scannerdata
|
||||
│
|
||||
▼
|
||||
Flutter App
|
||||
BroadcastReceiver (Android native)
|
||||
│
|
||||
▼
|
||||
EventChannel → Dart stream
|
||||
│
|
||||
▼
|
||||
HTTP POST to user-configured URL
|
||||
│
|
||||
▼
|
||||
User's backend (Postman / custom server)
|
||||
```
|
||||
|
||||
## App Pages
|
||||
|
||||
### Main Page (Scan Records)
|
||||
|
||||
- Real-time status indicator (waiting for scan / sending / sent / failed)
|
||||
- List of scanned barcode records, each showing:
|
||||
- Barcode content
|
||||
- Barcode type (CODE128, QR, etc.)
|
||||
- Timestamp
|
||||
- Send status (pending / success / failed)
|
||||
- AppBar with settings gear icon
|
||||
|
||||
### Settings Page
|
||||
|
||||
- URL input field (e.g. `http://192.168.1.100:8000/scan`)
|
||||
- Save button
|
||||
- Test connection button (sends a test request)
|
||||
|
||||
## HTTP Request Format
|
||||
|
||||
```
|
||||
POST {user-configured-url}
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"barcode": "scanned content",
|
||||
"code_type": "CODE128",
|
||||
"timestamp": "2026-05-07T10:30:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
Expected response: any 2xx status code = success.
|
||||
|
||||
## Technical Implementation
|
||||
|
||||
### Scanner Data Capture
|
||||
|
||||
- Register an Android `BroadcastReceiver` in `MainActivity.kt` to listen for `com.android.server.scannerservice.broadcast`
|
||||
- Forward scanned data to Flutter via `EventChannel` as a stream
|
||||
- BroadcastReceiver registration: dynamic (in code), not static (in manifest) - register on resume, unregister on pause
|
||||
|
||||
### HTTP Client
|
||||
|
||||
- Dart `http` package for POST requests
|
||||
- Async fire-and-forget on each scan result
|
||||
- Store failed requests in local list for retry display
|
||||
|
||||
### URL Persistence
|
||||
|
||||
- `shared_preferences` package to save/load the configured endpoint URL
|
||||
- Default value: empty (user must configure before scanning)
|
||||
|
||||
### Dependencies
|
||||
|
||||
```yaml
|
||||
dependencies:
|
||||
http: ^1.2.0
|
||||
shared_preferences: ^2.2.0
|
||||
```
|
||||
|
||||
## File Changes
|
||||
|
||||
| File | Action |
|
||||
|------|--------|
|
||||
| `lib/main.dart` | Rewrite - app entry with routing |
|
||||
| `lib/pages/scan_page.dart` | New - main scan records page |
|
||||
| `lib/pages/settings_page.dart` | New - URL configuration page |
|
||||
| `lib/services/scanner_service.dart` | New - EventChannel wrapper for scanner |
|
||||
| `lib/services/api_service.dart` | New - HTTP POST client |
|
||||
| `lib/models/scan_record.dart` | New - scan record data model |
|
||||
| `android/app/src/main/kotlin/.../MainActivity.kt` | Modify - add BroadcastReceiver + EventChannel |
|
||||
| `pubspec.yaml` | Modify - add dependencies |
|
||||
|
||||
## Out of Scope
|
||||
|
||||
- FastAPI backend implementation (user handles separately)
|
||||
- Database persistence in app
|
||||
- Authentication / encryption
|
||||
- Offline queue / retry mechanism
|
||||
Reference in New Issue
Block a user