Skip to main content

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

MethodPathDescription
GET/api/trackingList active tracking sessions
POST/api/trackingStart tracking. Body: {"imsi": "...", "method": "gnss", "interval": 30}
GET/api/tracking/:imsiGet tracking history for an IMSI
DELETE/api/tracking/:imsiStop tracking an IMSI
GET/api/tracking/:imsi/export/csvDownload CSV export
GET/api/tracking/:imsi/export/kmlDownload KML export

Device Status

The tracking session handles device online/offline transitions:

StatusConditionBehavior
OnlineEngine.locate succeedsFix stored with coordinates
OfflineNo connected MME or UE unreachableError recorded, session continues polling
ErrorLocate failed for other reasonsError 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:

  1. 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
  2. Stores each measurement in Mnesia
  3. Logs to InfluxDB (if configured)
  4. Broadcasts results to the web UI via PubSub

Web UI

Navigate to Virtual Drive Test in the sidebar.

  1. Enter a Campaign Name (e.g., "CBD Coverage Test")
  2. Enter IMSIs (one per line or comma-separated)
  3. Set the Interval (minimum 10 seconds)
  4. 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:

ColumnDescription
TimeFix timestamp
IMSITarget UE
Lat/LonGPS coordinates from GNSS
PCIPhysical Cell ID from E-CID
RSRPReference Signal Received Power (UE-reported)
RSRQReference Signal Received Quality (UE-reported)
GNSSGNSS status (ok/error)
ECIDE-CID status (ok/error)

RSRP values are color-coded: green (strong), yellow (medium), red (weak).

REST API

MethodPathDescription
GET/api/drive_testList active campaigns
POST/api/drive_testStart campaign. Body: {"name": "...", "imsis": ["..."], "interval": 30}
GET/api/drive_test/:idGet campaign measurements. Query: ?limit=200&imsi=filter
DELETE/api/drive_test/:idStop a campaign
GET/api/drive_test/:id/export/csvDownload CSV with all measurements
GET/api/drive_test/:id/export/kmlDownload 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

FieldDescriptionSource
rsrpReference Signal Received PowerUE measurement (mapped value, ~-44 to -140 dBm)
rsrqReference Signal Received QualityUE measurement (mapped value, ~-3 to -19.5 dB)
pciPhysical Cell IDServing cell identifier
earfcnE-UTRAN Absolute Radio Frequency Channel NumberServing cell frequency
cell_global_idCell Global Identity (PLMN + Cell ID)Serving cell
ue_rx_tx_time_diffUE Rx-Tx time differencePropagation 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 MeasurementSourceFields
subscriber_trackingTracking sessionslatitude, longitude, altitude, device_status
drive_testDrive test campaignslatitude, longitude, altitude, rsrp, rsrq, serving_pci, uncertainty

Tags

TagDescription
imsiTarget UE IMSI
methodPositioning method used
campaign_idDrive test campaign identifier (drive test only)

Persistence

All tracking and drive test data is stored in Mnesia disc_copies tables, surviving application restarts.

Mnesia TableKeyContent
:mnesia_tracking_history{imsi, monotonic_time}Individual tracking fixes
:mnesia_tracking_configimsiActive tracking session configuration
:mnesia_drive_test_measurements{campaign_id, imsi, monotonic_time}Drive test measurements
:mnesia_drive_test_configcampaign_idActive campaign configuration

History is automatically trimmed to 1,000 entries per IMSI (tracking) or 10,000 entries per campaign (drive test).