Files
pad_scanner/docs/plans/2026-05-07-scanner-to-api-design.md
Misaka b10e4b10d1 Add scanner-to-api design document
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-07 19:42:54 +08:00

110 lines
2.8 KiB
Markdown

# 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