Subscriber Tracking & Virtual Drive Test
OmniLCS provides two periodic location monitoring features: Subscriber Tracking for single-UE continuous monitoring, and Virtual Drive Test for multi-UE campaigns with combined GPS positioning and signal quality measurements.
Architecture
Subscriber Tracking
Subscriber Tracking periodically locates a single UE using a selected positioning method. Results are persisted in Mnesia and available via the web UI and REST API.
Web UI
Navigate to Subscriber Tracking in the sidebar. Enter an IMSI, polling interval (minimum 5 seconds), and select a positioning method (Cell, E-CID, GNSS, OTDOA). Click Start Watching.
Active watches are displayed in a table showing IMSI, method, interval, fix count, device status (Online/Offline/Error), last fix time, and last result. Click a row to view the fix history. Use the Export CSV or Export KML buttons to download data.
REST API
| Method | Path | Description |
|---|---|---|
GET | /api/tracking | List active tracking sessions |
POST | /api/tracking | Start tracking. Body: {"imsi": "...", "method": "gnss", "interval": 30} |
GET | /api/tracking/:imsi | Get tracking history for an IMSI |
DELETE | /api/tracking/:imsi | Stop tracking an IMSI |
GET | /api/tracking/:imsi/export/csv | Download CSV export |
GET | /api/tracking/:imsi/export/kml | Download KML export |
Device Status
The tracking session handles device online/offline transitions:
| Status | Condition | Behavior |
|---|---|---|
| Online | Engine.locate succeeds | Fix stored with coordinates |
| Offline | No connected MME or UE unreachable | Error recorded, session continues polling |
| Error | Locate failed for other reasons | Error recorded, session continues polling |
The session never stops on errors. It continues polling at the configured interval until explicitly cancelled.
Virtual Drive Test
Virtual Drive Test runs multi-IMSI campaigns that combine GNSS positioning (for GPS coordinates) with E-CID measurements (for RSRP, RSRQ, serving cell, PCI, EARFCN). This is the signal quality measurement equivalent of a physical drive test.
How It Works
On each tick, the campaign:
- For each IMSI in the campaign (up to 4 concurrent):
- Sends an LPP GNSS Request to the UE via the MME for GPS coordinates
- Sends an LPP E-CID Request to the UE for signal measurements
- Merges the results into a single measurement record
- Stores each measurement in Mnesia
- Logs to InfluxDB (if configured)
- Broadcasts results to the web UI via PubSub
Web UI
Navigate to Virtual Drive Test in the sidebar.
- Enter a Campaign Name (e.g., "CBD Coverage Test")
- Enter IMSIs (one per line or comma-separated)
- Set the Interval (minimum 10 seconds)
- Click Start Campaign
The campaigns table shows name, UE count, interval, tick count, and last tick time. Click a campaign row to view measurements. The measurement table shows per-fix data:
| Column | Description |
|---|---|
| Time | Fix timestamp |
| IMSI | Target UE |
| Lat/Lon | GPS coordinates from GNSS |
| PCI | Physical Cell ID from E-CID |
| RSRP | Reference Signal Received Power (UE-reported) |
| RSRQ | Reference Signal Received Quality (UE-reported) |
| GNSS | GNSS status (ok/error) |
| ECID | E-CID status (ok/error) |
RSRP values are color-coded: green (strong), yellow (medium), red (weak).
REST API
| Method | Path | Description |
|---|---|---|
GET | /api/drive_test | List active campaigns |
POST | /api/drive_test | Start campaign. Body: {"name": "...", "imsis": ["..."], "interval": 30} |
GET | /api/drive_test/:id | Get campaign measurements. Query: ?limit=200&imsi=filter |
DELETE | /api/drive_test/:id | Stop a campaign |
GET | /api/drive_test/:id/export/csv | Download CSV with all measurements |
GET | /api/drive_test/:id/export/kml | Download KML with signal-quality color coding |
Example API Usage
Start a campaign:
curl -sk -X POST https://omnilcs:8445/api/drive_test \
-H "Content-Type: application/json" \
-d '{
"name": "CBD Coverage Test",
"imsis": ["001010000000001", "001010000000002"],
"interval": 30
}'
Get measurements:
curl -sk https://omnilcs:8445/api/drive_test/<campaign_id>?limit=100
Export KML:
curl -sk https://omnilcs:8445/api/drive_test/<campaign_id>/export/kml -o coverage.kml
E-CID Measurements
The E-CID method requests RSRP, RSRQ, and UE Rx/Tx timing difference directly from the UE via LPP (3GPP TS 36.355). This approach works regardless of eNB LPPa support since the UE performs the measurements locally.
Measurement Fields
| Field | Description | Source |
|---|---|---|
rsrp | Reference Signal Received Power | UE measurement (mapped value, ~-44 to -140 dBm) |
rsrq | Reference Signal Received Quality | UE measurement (mapped value, ~-3 to -19.5 dB) |
pci | Physical Cell ID | Serving cell identifier |
earfcn | E-UTRAN Absolute Radio Frequency Channel Number | Serving cell frequency |
cell_global_id | Cell Global Identity (PLMN + Cell ID) | Serving cell |
ue_rx_tx_time_diff | UE Rx-Tx time difference | Propagation delay estimate |
API Response Example
{
"status": "ok",
"method": "ecid",
"imsi": "001010000000001",
"ecid_measurements": {
"measurements": [
{
"pci": 373,
"earfcn": 1825,
"cell_global_id": {
"cell_id": 4000,
"plmn": {"mcc": "001", "mnc": "01"}
},
"rsrp": 40,
"rsrq": 25,
"ue_rx_tx_time_diff": 19
}
]
}
}
Export Formats
CSV
Comma-separated values with header row. Includes all measurement columns: IMSI, timestamp, coordinates, signal measurements, and status fields. Suitable for import into spreadsheet tools or analysis scripts.
KML
Google Earth / Google Maps compatible. Each fix becomes a Placemark with:
- Coordinates (lat/lon/alt)
- Timestamp
- Description with IMSI, RSRP, RSRQ, PCI
- Color-coded icons by RSRP signal strength (green/yellow/red)
- Per-IMSI track LineString connecting all fixes
Open in Google Earth, Google Maps, QGIS, or any KML-compatible GIS tool.
InfluxDB Integration
Both Subscriber Tracking and Virtual Drive Test log measurements to InfluxDB when the InfluxDB connection is configured in runtime.exs.
Measurements Written
| InfluxDB Measurement | Source | Fields |
|---|---|---|
subscriber_tracking | Tracking sessions | latitude, longitude, altitude, device_status |
drive_test | Drive test campaigns | latitude, longitude, altitude, rsrp, rsrq, serving_pci, uncertainty |
Tags
| Tag | Description |
|---|---|
imsi | Target UE IMSI |
method | Positioning method used |
campaign_id | Drive test campaign identifier (drive test only) |
Persistence
All tracking and drive test data is stored in Mnesia disc_copies tables, surviving application restarts.
| Mnesia Table | Key | Content |
|---|---|---|
:mnesia_tracking_history | {imsi, monotonic_time} | Individual tracking fixes |
:mnesia_tracking_config | imsi | Active tracking session configuration |
:mnesia_drive_test_measurements | {campaign_id, imsi, monotonic_time} | Drive test measurements |
:mnesia_drive_test_config | campaign_id | Active campaign configuration |
History is automatically trimmed to 1,000 entries per IMSI (tracking) or 10,000 entries per campaign (drive test).