Ambulance Sensor Networks
What an ambulance measures, how the data moves from chassis, cabin and medical devices to the cloud, how a call changes the signals, and which faults and thresholds a simulator should reproduce. All patient vitals in this report are synthetic generator parameters, never real patient data.
1 Overview and operating context
An ambulance is a road vehicle with three data domains: the chassis (engine, speed, battery, tyres), the vehicle-mounted emergency and cabin equipment (lights, siren, doors, cot, oxygen, patient-compartment climate, drug fridge), and the clinical devices (monitor/defibrillator, ventilator, infusion pump) that feed an electronic patient care record (ePCR). A telematics unit or mobile data terminal (MDT) carries position and status to the dispatch system (CAD) over cellular.
Unlike a bus or truck, an ambulance is idle for much of its day and then switches abruptly into high-rate operation on dispatch. Utilisation is 20-45% busy in a typical urban system, and a 12-hour shift sees about 1.5-3 calls in rural areas and 6-10 in busy urban ones. Call volume peaks 10:00-20:00 with Friday and Saturday night spikes. Planning figures for the ambulance telemetry stream: one publish every 5-30 s (1 s on dispatch), 0.5-3 kB per publish, 1-15 records/s bursty, 3-30 MB per day and 100-600 MB per month.
Data provenance: values come from the research notes, where they are tagged either as confirmed from a cited source or as domain-knowledge estimates. In this report, items without a source tag are tunable defaults from the research, and anything the report author derived is labelled "inference".
Synthetic patient data only. Every vital-sign value, phenotype and patient event in this report is a parameter for generating synthetic telemetry. None of it is, or derives from, real patient data, and the simulator must not emit identifiable patient information.
2 Sensor inventory
2.1 Vehicle CAN, J1939 and OBD-II
Heavy chassis use J1939 on CAN at 250 kbit/s. Light chassis (for example Ford Transit, E-450, Sprinter) use OBD-II over ISO 15765 at 500 kbit/s. Signal and PGN names are source-confirmed; scaling factors are domain-knowledge defaults to verify against the DBC or J1939DA.
| Signal | PGN / SPN | Unit | Typical range | Rate | Scaling | Source |
|---|---|---|---|---|---|---|
| Engine speed | EEC1 PGN 61444 / SPN 190 | rpm | idle 650-800; running 1500-3500 | 10-100 ms | 0.125 rpm/bit | Vehicle CAN |
| Vehicle speed | CCVS1 PGN 65265 / SPN 84 | km/h | 0-130 | 100 ms | 1/256 km/h/bit | Vehicle CAN |
| Coolant temperature | ET1 PGN 65262 / SPN 110 | degC | -40..210; normal 85-100 | 1 s | 1 degC/bit, offset -40 | Vehicle CAN |
| Engine oil temperature | SPN 175 | degC | 90-120 | 1 s | 0.03125 degC/bit, offset -273 | Vehicle CAN |
| Oil pressure | PGN 65263 / SPN 100 | kPa | idle 100-170; running 250-450 | 500 ms | 4 kPa/bit | Vehicle CAN |
| Accelerator pedal | SPN 91 | % | 0-100 | 50 ms | 0.4 %/bit | Vehicle CAN |
| Fuel level | SPN 96 | % | 0-100 (tank 80-150 L) | 1 s | 0.4 %/bit | Vehicle CAN |
| Fuel rate | SPN 183 | L/h | idle 1.5-3; emergency 20-45 | 100 ms | 0.05 L/h/bit | Vehicle CAN |
| Battery voltage | - | V | 12 V system: 11.8-12.8 engine off, 13.5-14.6 charging; 24 V system: 24-29 | 1 s | - | Vehicle CAN |
| Fault codes (DTC) | DM1 PGN 65226 (SPN + FMI) | code | - | event; 1 s while active | - | Vehicle CAN |
| Tyre pressure (TPMS) | - | kPa | 380-620 (55-90 psi) | 60 s | - | Vehicle CAN / BLE |
| Brake switch, ABS/ESC active, seatbelt, parking brake, gear, odometer, ambient temperature | - | flag / km / degC | - | event or 1 s | - | Vehicle CAN |
OBD-II polling by a telematics dongle (ISO 15765-4) runs at 1-10 Hz over 5-20 PIDs: 0x0C RPM (1/4 rpm per bit), 0x0D speed (km/h), 0x05 coolant (A-40 degC), 0x11 throttle %, 0x2F fuel level %, 0x42 module voltage.
2.2 GNSS position
| Signal | Unit | Typical range | Sample / report rate | Source |
|---|---|---|---|---|
| Position, speed, heading | deg, km/h, deg | per vehicle | GNSS 1-5 Hz (10 Hz for dash use); logged at 1 Hz idle, 1 Hz emergency, or on change (heading change of 10 deg or more, or 30 s idle) | GNSS (NMEA 0183 / UBX) |
| Position report to CAD (AVL) | lat/lon | - | 1-10 s during dispatch, 30-60 s idle; CAD AVL update 5-30 s | Telematics / MDT |
2.3 Cabin, vehicle equipment and cold chain
| Signal | Unit / type | Typical range or values | Sample / report rate | Source |
|---|---|---|---|---|
| Emergency lights | enum | OFF, WARN-FRONT, WARN-ALL, SCENE (flood); light-bar draw 15-60 A (LED 8-25 A) | event plus 1 Hz heartbeat | Cabin |
| Siren | enum | OFF, WAIL, YELP, PHASER, AIR HORN, MANUAL; about 120 dB(A) at 3 m | event | Cabin |
| Patient-compartment and cab doors | open/closed | rear door open during loading about 30-120 s | event | Cabin |
| Stretcher / cot | locked state, load kg, battery % | 0-250 kg load (some cots rated 318 kg); battery 0-100% | event; 1 Hz | Cabin |
| Cabin temperature | degC | target 18-26; range 5-40 | 10-60 s | Cabin |
| House battery / inverter / shore power | V, A, flag | house battery 12-14.6 V; 120/230 V inverter; 12/24 V DC-DC | 1 s class | Cabin |
| Crew seatbelt, panic button, door locks | bool | - | event | Cabin |
| Drug fridge (2-8 degC items) | degC | target 2-8 | 1-5 min (loggers 5-15 min) | Cold chain |
| Ambient drug box | degC | 15-25 (controlled room temperature 20-25, excursions 15-30) | 5 min | Cold chain |
| Fridge door ajar | binary | - | event | Cold chain |
| Parked cab ambient | degC | summer 35-60 when parked; winter below 0 | - | Cold chain |
2.4 Oxygen
| Signal | Unit | Values | Sample rate | Source |
|---|---|---|---|---|
| Main cylinder pressure (M) | bar / psi | full 2000-2200 psi (138-152 bar); D/E cylinders 2000 psi | 1 per 10 s to 1 per min | Oxygen |
| Low and reserve thresholds | psi | low alarm 500 psi (35 bar); reserve 200 psi (14 bar) | - | Oxygen |
| Vehicle piped outlet | bar | 4 bar (55 psi) | - | Oxygen |
| Flow / consumption | L/min | 2-15 L/min for cannula up to non-rebreather; non-rebreather 15; ventilator 6-12; M cylinder holds about 3450 L | - | Oxygen |
2.5 Medical devices and vitals
These are generator parameters for synthetic patients only. Default alarm limits marked "Mindray" are from the cited bedside monitor checklist; the rest are domain-knowledge defaults.
| Parameter | Unit | Normal adult | Range in EMS patients | Default alarm limits | Sample rate |
|---|---|---|---|---|---|
| Heart rate | bpm | 60-100 | 30-220 (VT/SVT 150-250) | high 130, low 40 (Mindray); alternative 150/50 | HR 1 Hz; ECG 250-500 Hz |
| ECG | mV | - | rhythm classes NSR, AF, VT, VF, asystole, STEMI | - | 12-lead snapshot 10 s at 500 Hz on event; 3/5-lead HR and ST at 1 Hz |
| SpO2 | % | 95-100 | 70-100 | low 87-90 (87 Mindray), high 100 | 1 Hz (pleth 50-125 Hz) |
| Pulse rate (pleth) | bpm | 60-100 | - | high 140, low 50 (Mindray) | 1 Hz |
| NIBP systolic / diastolic / MAP | mmHg | 90-140 / 60-90 / 70-105 | shock below 90 systolic; crisis above 180/120 | systolic 90-180 | on demand or auto-cycle 1, 2, 3, 5, 10, 15, 30 min; cuff cycle 30-60 s |
| Respiratory rate | breaths/min | 12-20 | 4-50 | low 8, high 30 | 1 Hz |
| EtCO2 | mmHg | 35-45 | 0-100; during CPR 10-20; ROSC jump above 40 | high 55 (Mindray); low 20-30; apnea on absent waveform for 20 s | 1 Hz (waveform 20-50 Hz) |
| Temperature | degC | 36.1-37.2 | 30-41 | - | 1 per min |
| Glucose (point of care) | mg/dL | 70-140 | 20-600 | - | per event |
| Defibrillator | J | - | biphasic 120-200 J adult, 2-4 J/kg paediatric; impedance 25-180 ohm (typical 50-100); charge time 3-10 s | CPR targets: rate 100-120/min, depth 5-6 cm, compression fraction above 60-80%, pauses under 10 s | shock events; CPR feedback 1-10 Hz |
| Ventilator | Vt mL, RR, PEEP cmH2O, FiO2 % | Vt 6-8 mL/kg (350-550); RR 10-20; PEEP 5 | PEEP up to 5-10 | airway pressure high 40 | 1 Hz |
| Infusion pump | mL/h | 1-999 | - | occlusion alarm | 1 per min |
| Shock index (derived) | HR/SBP | 0.5-0.7 | above 1.0 indicates shock | - | derived |
3 Networks and messaging standards
| Layer | Technology | Rate or cadence | Notes |
|---|---|---|---|
| Vehicle bus | CAN 2.0B at 250 kbit/s (J1939) or 500 kbit/s (OBD-II, ISO 15765) | 10-1000 ms per PGN | Classic CAN carries 8 bytes per frame; larger J1939 messages use transport protocol sessions (BAM or RTS/CTS) |
| OBD-II dongle | PIDs via ISO 15765-4; ISO-TP framing | 1-10 Hz, 5-20 PIDs | ISO-TP single frame up to 7 bytes; first frame carries length up to 4095 bytes |
| GNSS | NMEA 0183 / UBX | 1-5 Hz | NMEA 0183 time appears only in RMC and ZDA sentences |
| Telematics / MDT | LTE Cat-M or 4G; MQTT, HTTPS, AVL | 1-10 s dispatch, 30-60 s idle | Binary AVL records about 40-120 B, up to 255 per packet |
| Medical device to ePCR | Bluetooth LE, Wi-Fi, vendor protocols (Zoll, Philips, Stryker/LIFEPAK LIFENET) | trends 1 Hz to 1 per min | Gateway-to-hospital via HL7 v2, FHIR |
| Cellular | 4G/5G, FirstNet-like priority and pre-emption | see section 3.2 | Ambulance coverage is mostly urban; alarms prioritised; reconnect bursts after outages |
3.1 Messaging standards
| Standard | Use | Example mapping |
|---|---|---|
| HL7 v2.x ORU^R01 | Observation results; one OBX segment per vital | OBX|1|NM|8867-4^Heart rate^LN||78|/min (LOINC); device-to-gateway uses MDC codes such as 147842^MDC_ECG_HEART_RATE |
| HL7 FHIR R4 | Observation (vital-signs profile), Patient, Encounter, Device; Bundle (transaction) per transport; Subscription or MQTT for delivery | LOINC 8867-4 heart rate; 59408-5 SpO2 pulse oximetry; 85354-9 blood-pressure panel (8480-6 systolic, 8462-4 diastolic); 9279-1 respiratory rate; 8310-5 body temperature |
| IEEE 11073-10101 nomenclature | Device terminology | MDC_ECG_HEART_RATE (147842), MDC_PULS_OXIM_SAT_O2 (150456), MDC_PRESS_BLD_NONINV_SYS (150021); partition-code values need checking against the standard |
| IEEE 11073-20601 (PHD), 11073-10201/10207 (SDC) | BLE/USB personal health device connectivity; service-oriented device connectivity | - |
| NEMSIS v3.5 | US EMS data standard for the ePCR (XML) | eVitals elements: .06 systolic BP, .10 heart rate, .12 SpO2, .14 respiratory rate, .16 EtCO2 |
| IHE PCD | Device-to-EHR profile | - |
| Message frequency | One charted vitals set about every 5 min; continuous 1 Hz device-to-gateway stream; 12-lead pushed as PDF or XML on event for hospital pre-alert | - |
The research flags LOINC and MDC codes it could not confirm (an EtCO2 LOINC code and the EtCO2 MDC code). The codes in the table above are the ones the research treats as well known or as nomenclature examples; do not rely on any code without a terminology lookup.
3.2 Cellular behaviour
| Item | Value |
|---|---|
| 4G LTE round-trip time | 30-60 ms good; 80-200 ms at cell edge; 5G NSA 20-40 ms; 5G SA 10-25 ms |
| Throughput | 4G 5-50 Mbps; 5G 50-500 Mbps; uplink 2-20 Mbps; video telemedicine needs at least 1-2 Mbps up |
| Priority service | FirstNet-like: QCI 65/66/69/70, priority and pre-emption (ARP), Band 14 (700 MHz); fewer congestion events |
| Handover | every 0.5-3 km in urban areas; interruption 30-100 ms; failed handover or radio link failure 0.5-2% with reconnect in 1-5 s; 5G to 4G inter-RAT 100-500 ms |
| Dead zones | rural 5-25% of route in remote areas; tunnels and parking structures; dropouts 10-120 s; store-and-forward queues; MQTT QoS 1 |
| Signal strength | RSRP -70 dBm (excellent) to -110 dBm (poor); RSRQ -5 to -18 dB; SINR 25 to -3 dB |
| Payload sizes | telematics position 0.5-1 KB per message at 1 per 1-5 s in dispatch; a 12-lead ECG about 50-300 KB |
3.3 Bridge-layer facts relevant to ambulances
- Telematics boxes (CAN-to-MQTT/TCP, for example Teltonika, CalAmp, Geotab, Samsara) record at 1-10 s and batch every 30-300 s over 4G Cat-1/Cat-4 or LTE-M.
- Time batching: 10 s live, 60 s typical, 300 s economy; flush on ignition-off or at 70-80% buffer fill. Deadband filtering removes 60-90% of samples (speed 1 km/h, coolant 1 degC, fuel 0.5%, GPS 10-50 m or 15-30 deg heading). Report by exception with a 30-300 s heartbeat; tiered rates run 1 Hz when running and one report per 600 s when parked.
- MQTT QoS 0 drops on any link loss; QoS 1 gives duplicates (0.1-2% on lossy cellular, 5-15% of in-flight messages around reconnects) and can be overtaken by newer messages; QoS 2 doubles round trips and is rare on cellular. Use keepalive of 60 s or less because cellular NAT timeouts are 30-300 s; reconnect backoff is 1-60 s with jitter. The cloud dedupe key is (device_id, boot_id, seq).
- LTE-M: round trip 100-300 ms, up to about 1 Mbps, with power-saving wake delays of seconds to minutes.
- The bridge research gives a one-line ambulance coverage pattern: mostly urban, alarms prioritised, reconnect bursts. Tunnels cause 30 s to 10 min of total loss with GNSS also lost and data buffered.
- Store-and-forward: RAM ring plus flash; FIFO drop-oldest is silent loss; keep a priority lane for alarms and DTCs; replay at 1-10 times real time interleaves with live data and causes out-of-order arrival; after 6-72 h offline at 1 Hz, records are dropped and a sequence gap is visible.
- J1939 multi-frame messages (DM1 with more than one DTC, VIN): BAM has no retry, so one lost frame drops the whole message; 0.5-3% of multi-frame messages fail.
- Typical J1939 rates: EEC1 20 ms, CCVS 100 ms, ET1 1 s, DM1 1 s while a fault is active.
4 Mission profiles
CAD timestamps for a call: call received, call answered, location verified, dispatched, en route (turnout), on scene, patient contact, depart scene, arrive hospital, transfer of care, clear, return or available. CAD status codes: Available, Dispatched, En route, On scene, Transporting, At hospital, Clear, Out of service. Status changes are either manual (crew button on the MDT) or automatic (geofence arrival, speed).
| Phase | Typical duration | Telemetry signature |
|---|---|---|
| Idle at station (posted) | 0-60+ min | Speed 0; cabin about 20 degC; siren off; engine off about 70% of the time, otherwise idling at 650-800 rpm in 10-40 min stretches (20-40% of daily engine-on time is idle); idle fuel 1.5-3 L/h; shore power sometimes connected; GNSS 1 Hz or 30 s idle logging; position every 30-60 s |
| Dispatch / turnout | 60 s target (NFPA 1710); actual 45-90 s | Engine start, lights and siren on, position reports rise to 1-10 s |
| Emergency run (priority 1) | 4 min travel target; typical 4-12 min urban, 8-20 min rural | Siren on in 60-90% of priority 1 responses; average 50-70 km/h (urban 40-75 average, peaks 90-110; highway 100-140); fuel rate 20-45 L/h; harsh driving events increase |
| On scene | 8-25 min (median about 12-15) | Engine idling or off; scene lighting; patient-compartment door open about 30-120 s during loading; 1 Hz vitals begin |
| Transport to hospital | 8-25 min | Lights and siren in about 20-30% of transports; smoother driving with deceleration under 0.2 g ("transport mode"); continuous vitals; oxygen flow active; motion artifact |
| Hospital handover | 10-45 min (target 15-30 min offload) | Vehicle stationary at hospital; vitals streaming then stopped at transfer of care; pre-alert 12-lead sent on event |
| Return / posting | 5-20 min | Normal driving without siren |
| Dwell and restock | 5-15 min | Doors open, cabin and fridge door events |
Inference: the research gives duration ranges per phase but no formal state machine; a generator would chain these phases as a state machine with the listed ranges as dwell-time distributions.
5 Faults and anomaly signatures
| Scenario | Signature | Frequency |
|---|---|---|
| GPS multipath / urban canyon | Position jumps of 10-50 m, HDOP above 3; tunnel dropout 5-60 s | 2-5% of fixes |
| Oxygen low | Cylinder under 500 psi alarm; fast drop (leak) above 100 psi/min | about 1-2% of shifts |
| Door open while moving | Patient-compartment door open with speed above 5 km/h | rare |
| Stretcher unlocked while moving | Cot lock off with speed above 5 km/h | rare |
| Drug fridge excursion | Door openings of 10-20 s each; parked in sun gives +4-8 K in 1 h; below 2 or above 8 degC for 10-30 min | 1-2% of shifts |
| Battery undervoltage | Engine-off monitor or inverter load drains 12 V system below 11.5 V | 0.5-1% |
| Engine overheating / DTC (for example P0128 coolant thermostat) | Coolant above normal 85-100 degC, DM1 active | 1 per 10-20 vehicle-months |
| Crash / rollover | Acceleration spike above 4-6 g or roll angle above 60 deg | very rare (about 1 crash per 1-2 million km) |
| Monitor lead-off / SpO2 dropout | Motion artifact in 5-15% of moving time; lead-off 1-3 per transport; NIBP retries 5-10% in motion; SpO2 "---" for 3-10 s | frequent |
| Patient deterioration (synthetic) | HR up 30%, SpO2 down 8-10 points over 5 min | 5-15% of transports |
| Cellular outage | Dead-zone dropouts of 10-120 s; store-and-forward | rural 5-25% of route |
| Sensor stuck, duplicates, out-of-order timestamps | Flatline with valid timestamp; repeated values; reordered records | 0.1-1% |
| AVL gaps | Missing dispatch position updates | 1-3% |
5.1 Bridge and gateway failures that also apply
| Failure | Signature | Rate |
|---|---|---|
| CAN bus-off | All signals vanish for 0.1-5 s until recovery or power cycle | 0.05-0.5 episodes per vehicle per day; 1% of devices chronic |
| Dropped frames | Gaps in cyclic PGNs | 0.01-0.5% |
| Duplicate frames | Identical timestamp and value | 0.1-1% |
| Transport protocol session failure | DM1 or VIN missing | 0.5-3% of multi-frame messages |
| Encoding errors / sentinels | 0xFF and 0xFFFF not-available, 0xFE error values, impossible magnitudes, NaN | 0.1-1% of records |
| Frozen value | Flatline with valid timestamp | 0.1-1% of signals |
| Timestamp skew | Future timestamps or 1970 epoch; 0.5-2% of devices offset above 5 s | 0.5-2% of devices |
| Firmware / schema mismatch | Unknown IDs, shifted signals | 2-10% of fleet for 1-4 weeks after rollout |
| Reconnect storm | Burst replay and duplicates | event-based |
6 Events, alerts and thresholds
6.1 Driver behaviour events
| Event | Detection threshold | Emergency-run frequency |
|---|---|---|
| Harsh braking | Longitudinal acceleration below -0.30 g light, below -0.45 g severe | 1-4 per 10 km in emergency mode vs 0.5-1 normal |
| Harsh acceleration | Above +0.30 g | 1-3 per 10 km |
| Harsh cornering | Lateral above 0.35 g or yaw rate above 15 deg/s at speed | 1-5 per 10 km |
| Speeding | Normal: more than 10 km/h over the limit; emergency exemption typically +20-30 km/h (varies by jurisdiction) | - |
| Red-light run | Speed at intersection above 15 km/h during red; slow-and-proceed 10-15 km/h | - |
| Seatbelt unfastened while moving | Speed above 10 km/h | 1-5% of trips |
| Rollover / crash | Acceleration above 4-6 g or roll above 60 deg | about 1 per 1-2 million km |
| Idle | Engine on, speed under 2 km/h, longer than 5 min | - |
6.2 Equipment alarms and thresholds
| Signal | Alarm threshold |
|---|---|
| Patient-compartment door open while moving | Alarm when speed above 5 km/h |
| Cot unlocked while moving | Alarm when speed above 5 km/h |
| Oxygen cylinder | Low alarm 500 psi (35 bar); reserve 200 psi (14 bar) |
| Cabin temperature | Alarm above 30 or below 15 degC |
| Drug fridge | Excursion below 2 or above 8 degC for more than 10-30 min; critical above 15 degC |
| Ambient drug box | Above 30 degC for 30 min, or below 5 degC (freezing) |
| Fridge door | Alarm when ajar more than 60 s |
| 12 V battery | Low alarm below 11.5 V, high above 15 V |
| Tyre pressure | Low alarm at 20% below nominal |
| Monitor battery | Technical alarm at 10-20% (about 20 min remaining) |
Clinical alarm priorities follow IEC 60601-1-8: high (red; for example asystole, VF, SpO2 below 85), medium (yellow) and low (cyan). Technical alarms include lead-off, low battery and cuff leak. Vital-sign limits are in section 2.5.
6.3 Response-time KPIs
| Standard | Target | Source status |
|---|---|---|
| NFPA 1710 first-arriving EMS | 60 s turnout plus 240 s travel, 6:00 total at the 90th percentile (call processing 60 s listed separately; whether it is included in the 6:00 is unclear in the research) | Quoted by agency documents |
| NFPA 1710 ALS arrival | 60 s turnout plus 480 s travel, 9:00 at 90% or more | Quoted by DC FEMS |
| DC FEMS KPI | First EMT arrives within 5 min for high priority calls | Agency page |
| UK ambulance response standards | Cat 1 mean 7 min, 90th percentile 15 min; Cat 2 mean 18 min, 90th 40 min; Cat 3 90th 2 h; Cat 4 90th 3 h | Domain knowledge; verify against NHS England |
| US typical median response | Urban 7-8 min; rural 14+ min | Domain knowledge (NEMSIS) |
| Hospital offload | 10-45 min typical; target 15-30 min or less | Domain knowledge |
Priority classes: P1 (life-threatening), P2, P3 (non-emergent), with some systems using P4 or determinant codes such as MPDS 10-D-1.
7 Generator guidance for the simulator
The parameter sets below are the research values arranged for generation. Where a distribution shape or a formula is stated, it is an inference (marked) because the research gives ranges and not distributions.
Chassis and engine
- Idle: engine_rpm ~ uniform(650, 800); fuel_rate 1.5-3 L/h; coolant 85-100 degC; oil pressure 100-170 kPa; oil temperature 90-120 degC.
- Running: engine_rpm 1500-3500; oil pressure 250-450 kPa; emergency fuel rate 20-45 L/h.
- Battery: 11.8-12.8 V engine off; 13.5-14.6 V charging. Undervoltage episode (0.5-1% of shifts) drives the 12 V reading below 11.5 V.
- Raw encoding (J1939): rpm raw = round(rpm / 0.125); speed raw = round(km/h * 256); coolant raw = degC + 40; oil pressure raw = round(kPa / 4); fuel rate raw = round(L/h / 0.05); pedal and fuel level raw = round(percent / 0.4).
- Inference: draw per-trip peak speed from the stated ranges (urban peaks 90-110 km/h, highway 100-140), and average speed 50-70 km/h for priority 1 runs.
Mission state machine
- States: station_idle, turnout, emergency_run, on_scene, transport, handover, return, restock.
- Dwell times (minutes unless noted): turnout 45-90 s; emergency_run 4-12 urban or 8-20 rural; on_scene 8-25 (median 12-15); transport 8-25; handover 10-45; return 5-20; restock 5-15; station_idle 0-60+.
- Per-state signal effects: siren on in 60-90% of priority 1 runs and about 20-30% of transports; engine off 70% of station idle time; 1 Hz vitals from on_scene start; driving smoothness (decel under 0.2 g) when a patient is on board.
- Calls per 12 h shift: rural 1.5-3, busy urban 6-10. Arrival intensity is higher 10:00-20:00 and on Friday and Saturday nights (inference: scale the rate by a time-of-day multiplier).
Synthetic patient phenotypes (not real patient data)
- Stable, about 70% of transports: HR 70-95, SpO2 96-99, SBP 110-140.
- Unstable, 15-20%: HR 110-140, SpO2 88-93, SBP 85-100.
- Critical or arrest, under 5%: VF or asystole, EtCO2 10-20 under CPR, optional ROSC transition with EtCO2 above 40.
- Deterioration trigger in 5-15% of transports: over 5 minutes HR rises 30% and SpO2 falls 8-10 points.
- Artifacts while moving: motion artifact 5-15% of time; lead-off 1-3 per transport; NIBP retry 5-10%; SpO2 dropout of 3-10 s.
- Derived values: shock index = HR / SBP; MAP in mmHg is related to systolic and diastolic (inference: MAP is approximately diastolic + (systolic - diastolic) / 3).
- Output mapping: HL7 ORU^R01 OBX rows or FHIR Observation resources using the codes in section 3.1.
Oxygen and cold chain
- Oxygen use: cylinder_psi falls with flow; M cylinder holds about 3450 L at 2000-2200 psi. Inference: litres remaining is approximately 3450 times (psi / 2200); minutes remaining equals litres remaining divided by flow in L/min.
- Typical flow 2-15 L/min (non-rebreather 15, ventilator 6-12). Leak fault: drop above 100 psi/min (1-2% of shifts).
- Drug fridge: setpoint 2-8 degC; 10-20 s door openings; parked-in-sun heating of +4-8 K per hour; excursion in 1-2% of shifts; alarm after 10-30 min out of range.
Per-tenant variant knobs
- Urban BLS (basic life support): inference-based preset. Use the urban end of the research ranges: 6-10 calls per 12 h shift, urban response 4-12 min, urban median 7-8 min, short transports, no advanced devices (omit or sparse EtCO2, ventilator, infusion pump).
- ALS (advanced life support): add the full device set (12-lead ECG, EtCO2, defibrillator CPR metrics, ventilator, infusion pump); 12-lead pre-alert events push 50-300 KB to the hospital; keep the urban call rate.
- Rural or critical-care transport: 1.5-3 calls per shift, rural travel 8-20 min, transports at the longer end (up to 25 min or more as an inference), dead zones on 5-25% of the route, higher store-and-forward buffering, more oxygen consumed per call; the critical-care variant adds ventilator and infusion pump streams.
- Siren policy: knob for siren share, default 60-90% of priority 1 runs and 20-30% of transports.
- Reporting policy (from bridge research): ambulance 1 Hz position always, engine every 5 s, one publish per 5-30 s (1 s on dispatch), 0.5-3 kB per publish.
- Units and naming: tenants differ in signal sets, units (km/h vs mph, degC vs degF), key naming (camel vs snake), time format (epoch ms vs ISO-8601) and missing-value style (null vs sentinel).
- Topic pattern:
t/{tenantId}/v1/{vehicleClass}/{deviceId}/{telemetry|event|status|cmd|ack}. Retention for ambulance and medical audit data is 6-10 years in the research.
Imperfection layer
- Apply the faults in section 5 with the listed frequencies; emit ground-truth labels for each injected imperfection (per the bridge research pipeline).
- Per-vehicle latent traits: clock drift ppm (20-50 ppm crystals give 1.7-4.3 s per day; 100 ppm gives 8.6 s per day), firmware version, buffer size, link type, chronic-fault flag.
- Cellular state machine: up, degraded, down per link, with outage durations 10-120 s in dead zones and 30 s to 10 min in tunnels; replay after reconnect at 1-10 times real time with duplicates.
- Envelope fields per record: received_at, boot_id, seq, batch_id, fw_version, schema_version, tenant.
8 How the Sense simulator implements this
Source and status. This section restates the simulator document AMBULANCE_POINTS.md (verification dated 13 Oct 2026) and the Sense documents layout-v1.md and BUILD.md (checked against the code on 12 Oct 2026). Everything below was built and run in the simulator and fed through Sense's own protocol handler; none of it is a field measurement. All patient vital signs are synthetic generator values, never real or identifiable patient data. The Sense side is the working copy of Sense, which at the time of writing carries uncommitted changes; the released listener build of 12 Oct 2026 (20:50) is older than part of them, and the places where that matters are marked.
8.1 Scenario codes (tenant subvariant)
The Fleet tenant's variant ambulance selects the vehicle kind and its subvariant selects the scenario. The three presets of this report are mapped onto the platform's codes: urban BLS is bls, ALS is als, and rural or critical-care transport is critical-care. A tenant with another subvariant runs no ambulance; the simulator's own selector is used only when the tenant has no subvariant.
| Code | Stands for | Chassis and wire | Mission mix and equipment |
|---|---|---|---|
| bls | Basic life support van | Light van (3.6 t, 100 kW, 70 L), 12 V, OBD-II on CAN | Base Old Airport Road; 6-10 calls in 12 h (rate x1.5 from 10:00 to 20:00, x0.5 at night, x1.4 on weekend nights); priority 1/2/3 = 30/45/25%; scenes in Bengaluru 2-12 km away; patients stable 85%, unstable 15%; basic monitor (pulse, SpO2, blood pressure every 10 min, respiration rate); no ECG, EtCO2, ventilator or pumps; tyre pressures as Wialon params |
| als | Advanced life support van | Light van (4.3 t, 120 kW, 75 L), 12 V, OBD-II with more values | Base Whitefield; 6-10 calls; priority 1/2/3 = 55/35/10%; patients stable 72%, unstable 24%, critical (cardiac arrest) 4%; full monitor and defibrillator: ECG rhythm (sinus, atrial fibrillation 10%, STEMI 5%, VF or asystole in arrests), lead-off, EtCO2, temperature, blood pressure every 5 min, CPR rate, depth and fraction, shocks of 150-200 J, ventilator and infusion pumps, 12-lead pre-alert at handover |
| critical-care | Critical-care transport | Heavy chassis (7.2 t, 190 kW, 120 L), 24 V system with J1939 | Base Hebbal; 1.5-3 calls in 12 h; priority 1/2/3 = 20/70/10%; the "scene" is a referring facility 12-32 km away on rural roads (80-110 km/h, dead cells on 12% of the route), the destination a hospital; patients stable 40%, unstable 52%, critical 8%; 80% ventilated, infusion pumps, blood pressure every 3 min |
Mission phases are the same in all scenarios: station idle (engine off 70% of the time), turnout 45-90 s (siren in 60-90% of priority-1 runs and 15% of priority 2), emergency run, on scene (lognormal, median 12.5 / 14 / 22 min; 8% of calls are treated in place), transport (urban 32-55 km/h, siren on 20-30% of transports, twice as often with an unstable patient), hospital handover (median 20 / 25 min, transfer of care at three quarters of the dwell), return, restock 5-15 min, station idle again. The Wialon param trip_state numbers them: 0 station, 1 dispatched or on the run, 2 on scene, 3 transporting, 4 at hospital, 5 returning, 6 restock. In 75% of the ambulances a call is already running at the start.
8.2 Protocols emitted and the one-vehicle-per-tenant model
One Fleet tenant is one ambulance with its own Bhairava Sense. The slot (0-23), the three UDP ports (49001+5s, 49002+5s, 49003+5s) and the source address (127.0.(1+s).20) come from the one allocator shared with buses and trucks, so the three kinds never share ports; the tenant card shows the Ports text to enter into that tenant's Sense. Identity depends only on the tenant (FNV-1a of tenant:<id>): id AMB-BLS, AMB-ALS or AMB-CCT plus 4 hex digits, IMEI starting 3520966 with a valid Luhn digit, VIN (Tata Winger, Mercedes Sprinter or Tata 1610 heads, valid check digit), driver card and J1939 identity number. With three vehicle tenants at once (bus, truck, ambulance) on three Sense listeners, none heard another tenant's address, port or IMEI.
| Equipment | Protocol on the wire | Default port | Sense device name |
|---|---|---|---|
| GNSS receiver (engine on) | NMEA 0183 $GNGGA and $GNRMC, 1 Hz | 10110 | talker GN at <source ip> |
| Engine bus through a CAN-to-Ethernet gateway (one datagram a second, engine on) | OBD-II for bls and als (requests on 7DF, answers on 7E8); SAE J1939 for critical-care | 20001 | control unit 7E8 on CAN gateway <source ip>, or unit <SA> on CAN gateway <source ip> (SA 0 engine, 11 brakes, 23 cluster, 33 body) |
| Telematics unit (also carries cabin, fridge, oxygen and medical-device values) | Wialon IPS 1.1 text, login line then data lines | 20332 | tracker <imei> |
Wialon input bits: 0 ignition, 1 siren, 2 emergency lights, 3 rear (patient) door; the iButton field carries the driver card in hex. Cadence (+-10% jitter, and at once on dispatch, siren, door, alarm, shock, NIBP, fault and link events): station 60 s with the engine off and 30 s with it on; turnout and run 5 s (als 2 s); on scene 10 s, with a patient 10 s (als 4 s); transport 10 s, with a patient 5 s (als 2 s); handover as on scene; return 15 s; restock 30 s. NMEA and CAN are sent once a second while the engine is on, CAN slow groups every 5 s and the VIN every 600 s. The patient vitals are not HL7 or FHIR messages: they are Wialon params, because Sense reads HL7 v2 only over TCP and the simulator sends UDP only.
8.3 Signals actually emitted
NMEA is as for buses: GGA latitude, longitude, fix quality, satellites and altitude; RMC status, latitude, longitude, speed (knots) and course. Sense makes one reading per OBD-II or J1939 signal and per Wialon param, named as in the tables.
| Scenarios | PID | Sense point (unit) | Rate |
|---|---|---|---|
| both | 0C, 0D, 04, 11 | Engine speed (rpm), Vehicle speed (km/h), Engine load (%), Throttle position (%) | 1 s |
| both | 05, 2F, 42, 46 | Coolant temperature (degC), Fuel level (%), Control module voltage (V), Ambient air temperature (degC) | 5 s |
| als | 0F, 5C, 33, 0B, 1F, 5E | Intake air temperature, Engine oil temperature (degC), Barometric pressure (kPa), Intake manifold pressure (kPa), Run time since engine start (s), Fuel rate (L/h) | 5 s |
| both | service 03 | Event "Stored fault code P0128" (thermostat stuck open, coolant under 72 degC), P0217 (coolant over 102 degC), P0562 (system voltage under 11.5 V); otherwise "no stored fault codes" | 5 s |
| both | service 09 PID 02 | Presence "vehicle identification number" with the VIN | at start and every 600 s |
critical-care sends J1939: EEC1 (61444), EEC2 (61443), CCVS (65265) and LFE (65266) every second; ET1 (65262), EFL/P1 (65263), DD (65276, Fuel level), VEP1 (65271), AMB (65269), HOURS (65253), LFC (65257), VD (65248), VDHR (65217), AT1T1I (65110, DEF), TIRE1 (65268, six wheels in turn) and B1 (65274) every 5 s; DM1 (65226) and the address claim (60928) at engine start. Points and units are those of the truck report, without the tachograph group, Cruise control set speed and Cargo ambient temperature. DM1 codes: SPN 110 FMI 16 (coolant over 102 degC), SPN 168 FMI 1 (battery under 11.5 V), SPN 110 FMI 17 (thermostat stuck open), SPN 1761 FMI 18 (DEF under 10%).
| Group | Params (unit) |
|---|---|
| Common, all scenarios | ign; seq; boot_id; pwr_ext (V); odometer (km); hdop; gps_sats; gsm_lvl, gsm_rsrp (dBm), gsm_rsrq (dB), gsm_sinr (dB), net_type; link_down_s (s); driver_card; trip_state (0-6); priority (1-3, 0 at the station); call_no; siren (0 off, 1 wail, 2 yelp, 3 phaser); lights (0 off, 1 warn-front, 2 warn-all, 3 scene); lightbar_a (A); rear_door, cab_door, cot_lock; cot_kg (patient and cot load, kg); cot_batt (%); seatbelt (0 unfastened above 10 km/h); door_alarm (rear door open above 5 km/h); cot_alarm (cot unlocked above 5 km/h); cabin_temp (degC); house_v (V); inverter; shore; fridge_temp (drug fridge degC, set 4.2-5.8); fridge_alarm (outside 2-8 degC for 10-20 min); fridge_door; drug_box_t (degC); o2_bar (cylinder pressure bar, full 145-152); o2_flow (L/min); o2_swaps; o2_low (under 34.5 bar = 500 psi); fuel_l (L); harsh; panic; patient (monitor attached, 0/1); monitor_batt (%); plus Latitude, Longitude, Speed, Heading, Altitude |
| bls and als only | tpms_1 to tpms_4 (kPa) |
| Synthetic patient, all scenarios (present while patient = 1) | hr (bpm; left out while leads are off or in arrest); spo2 (%; left out during a 3-10 s dropout and in arrest); spo2_ok; nibp_sys, nibp_dia, nibp_map (mmHg, renewed every cuff cycle); nibp_age_s (s); resp_rate (per min); vital_alarm (0 none, 1 low, 2 medium, 3 high priority of the monitor); shock_index (HR / systolic) |
| Synthetic patient and devices, als and critical-care | lead_off; ecg_rhythm (0 sinus, 1 atrial fibrillation, 3 VF, 4 asystole, 5 STEMI); etco2 (mmHg); pt_temp (degC); ecg12_sent (count of 12-lead pre-alerts); cpr_on; shocks; while CPR runs cpr_rate (per min), cpr_depth (cm), cpr_frac (%); after a shock defib_j (J), defib_ohm (ohm); vent_on and, while ventilated, vent_vt (mL), vent_rr, vent_peep (cmH2O), vent_fio2 (%), vent_paw (cmH2O); pump1_mlh, pump2_mlh (mL/h); pump_occl |
8.4 What Sense can and cannot read yet
The state below follows AMBULANCE_POINTS.md section 8 (checked against the working copy of the Sense listener sources, read only) and Sense's BUILD.md.
- Read by the working copy of Sense, not by the released build of 12 Oct 2026: TIRE1 (65268) and B1 (65274); GGA HDOP and the RMC time; the Wialon record time; a Wialon unit name table that includes the vitals and device names of the table above (for example hr, spo2, nibp_*, etco2, o2_bar, fridge_temp, vent_*, pump*_mlh, defib_j). Names the table does not know, flags and states stay without a unit.
- No standard path for vitals and devices: Sense has an HL7 v2 reader but only for TCP (MLLP), so the synthetic vitals travel as Wialon params and not as HL7 ORU^R01 or FHIR Observations; the MDC and LOINC codes of this report are not used. ECG waveforms, 12-lead data (50-300 KB) and CAD status codes cannot be represented as readings; the 12-lead pre-alert is only a counter and the CAD state a number (trip_state).
- Body, cot, light bar, siren, door and oxygen signals have no J1939 or OBD-II group in Sense; they are carried as Wialon params. OBD-II has no PID for tyre pressure, odometer, seat belt, door or gear, so the vans send tpms_1 to tpms_4 as params; the readable PIDs of this report (0C, 0D, 05, 11, 2F, 42) are all read.
- Alarms (vital_alarm, fridge_alarm, o2_low, door_alarm, cot_alarm) arrive as ordinary readings; Sense does not apply the IEC 60601-1-8 priorities or this report's thresholds to them.
- Not read at all: string params and the iButton field of Wialon IPS; the native UDP form of Wialon IPS 2.0; Sense does not use seq or boot_id, so replays and duplicates count as new readings. The heavy-chassis J1939 groups 65270, 61445, 65272, 61441 and 65258, which the document lists as unread, are not sent by the ambulance.
- Vehicle profiles: the Fleet compatibility check chooses a profile by variant and subvariant (bls, als, critical-care); an empty or unknown subvariant uses the plain Ambulance profile.
8.5 Faults and the ground-truth file
Latent traits and the generic faults are those of the bus and truck work (clock ppm, chronic flag, frame loss, bus-off, J1939 or CAN not-available after engine start, spike, encoding error, stuck-at on fuel level, coolant and fridge temperature, drift, GNSS episodes and cold start, link outages with store-and-forward, reboot, TPMS leak, engine overtemperature, VIN transport abort); rates are those of Tables 5.1 and 5.2 of this report, scaled by --ambulance-faults. Specific to ambulances: oxygen leak (cylinder falls 7-12 bar a minute, 1.5% of shifts), drug fridge fault (compressor off 40-100 min, 1.5% of shifts), battery undervoltage (house battery drains 1.4 V an hour for 25-65 min, 0.75% of shifts), thermostat stuck open (coolant at 68 degC for 30-120 min), door open or cot unlocked while moving (0.0003 per 10 minutes of driving), seatbelt unfastened on 3% of trips, harsh braking (55% of traffic stops during the run, none with a patient on board), monitor artifacts (motion artifact 5-25 s in 5-15% of moving time, lead-off, SpO2 dropout, NIBP retry 7.5% in motion), patient deterioration in 10% of the patients, cardiac arrest in critical patients of als and critical-care (VF 55% or asystole, CPR 100-120 per min, shocks every 2 minutes in VF) and a rare panic button.
With --truth FILE the simulator writes JSON lines, each with t, utc, vehicle and type; first run and one vehicle line per ambulance (scenario, identity, calls per shift, siren share). Then the bus and truck labels that apply and, for ambulances: can_na, station, dispatch (call, priority, scene, hospital, transport), on_scene, transport, at_hospital, transfer_of_care, restock, lights_siren, harsh_brake, seatbelt_unfastened, patient (phenotype 0 stable, 1 unstable, 2 critical; rhythm; weight; deterioration; ventilated), deterioration, vital_alarm, defib_shock, rosc, ecg12_prealert, o2_swap, o2_leak, fridge_fault_start and fridge_fault_end, fridge_alarm, battery_undervoltage_start, thermostat_stuck_open, rear_door_open_moving, cot_unlocked_moving and panic_button. Not simulated: crash and rollover (acceleration over 4-6 g), red-light running, geofence status codes of the CAD, HL7 and FHIR messages, ECG waveforms, AVL gaps beyond the generic link outages, and schema or firmware mismatch.
8.6 Measured differences between the scenarios
Slow runs of 13 Oct 2026 (nothing faster than clock 2; 24 simulated minutes each, starting 13:00 IST), default fault rates, 36 ambulances per scenario over two sets. Speeds are from NMEA, fuel from OBD-II PID 5E or the J1939 fuel rate, cadence from the device time stamps of the Wialon records. Every datagram was identified by Sense's protocol handler as NMEA 0183, OBD-II or J1939, or Wialon IPS (none unknown or unreadable); with every fault at 1000 times the rate, 9 of 7,510 critical-care datagrams carrying only address-claim frames were not identified. The runs cover only what fell into a 24-minute window: no P0128, P0217, P0562 or SPN 168 occurred with frames intact, so those codes were checked by feeding the bytes the simulator writes to the same handler (one event each).
| Measure | bls | als | critical-care |
|---|---|---|---|
| Wire | OBD-II, 8 PIDs, Wialon | OBD-II, 14 PIDs, Wialon | J1939 (16 groups and DM1), Wialon |
| Travel to the scene (s, n) | 279-1,113, median 542 (16) | 304-999, median 506 (10) | 171-1,332, median 521 (9) |
| Time on scene (s) | 508-1,417, median 756 | 543-1,476, median 892 | 848-2,047, median 1,244 |
| Handover (s) | 605-2,377, median 1,339 | 754-2,314, median 1,153 | 771-2,517, median 1,888 |
| Speed on the run, mean / max (km/h) | 36.7 / 84 | 40.8 / 87 | 90.2 / 123 |
| Speed in transport, mean / max | 29.6 / 55 | 24.4 / 52 | 79.2 / 106 |
| Fuel on the run, mean / max (L/h; station 2.4) | - | 15.4 / 58 | 32.1 / 58 (transport 27.7) |
| Harsh braking per 10 km driven | 2.0 | 1.8 | 0.09 |
| Wialon cadence run / transport with patient / station (median s) | 4 / 4 / 55 (engine off) | 1 / 1 / 32 | 4 / 4 / 32 |
| Patients (n): stable / unstable / arrest | 15 / 1 / 0 | 5 / 5 / 1 | 3 / 6 / 0 (8 of 9 ventilated) |
| Heart rate mean (range) | 90 (64-130) | 89 (60-168) | 104 (68-166) |
| SpO2 mean (range) | 95.8 (84-100) | 95.7 (77-100) | 94.2 (83-100) |
| Systolic mean (range) | 120 (87-144) | 115 (77-147) | 113 (80-145) |
| EtCO2 mean (range) | - | 38.7 (8-49) | 36.3 (26-44) |
Other measured values: cabin temperature 22.5-32.7 degC (door open: ambient), drug fridge 4.2-7.9 degC (the 7.9 comes from the fridge fault), oxygen cylinder 93-152 bar, house battery 12.55-14.28 V (engine off / on). Priority-1 runs with siren: als 6 of 7 (knob 60-90%); transports with siren 12 of 32 over all sets (knob 20-30%, twice as often with an unstable patient). The Wialon cadence of als shows 1-2 s because the 2 s interval is jittered by +-10% and truncated to whole seconds. Over all sets: 43 calls started, 48 scenes, 32 transports, 14 transfers of care, 14 restocks, 20 12-lead pre-alerts, 2 defibrillator shocks.
- Travel to the scene is 4.7-18.6 min for the vans (this report: 4-12 min urban, 8-20 min rural, 22 min at most for critical-care legs).
- The mean speed on the run is below this report's 50-70 km/h for the van scenarios because the legs are short (2-12 km, a 600 m approach limit and an urban canyon limit of 38 km/h).
- The fuel rate of the vans on the run is below this report's 20-45 L/h on average and reaches 58 L/h at hard acceleration.
- Defibrillator shocks happened only in als, so defib_j and defib_ohm were seen only there; the sample sizes of patients per scenario are small (9 to 16).
9 Uncertainty and assumptions
Treat the numbers as tunable priors. The research file states that cited items came from search summaries and not full-page reads, and that most numeric values are domain-knowledge estimates rather than specification quotes. Bridge-layer rates are engineering estimates and should be used with wide jitter.
- LOINC and MDC codes marked uncertain in the research (EtCO2 codes in particular) must be looked up before use. Heart rate 8867-4, SpO2 2708-6 and the blood-pressure panel 85354-9 are described as well known. The FHIR mapping lists 59408-5 and 20564-1 for SpO2 inconsistently in the research; confirm which code applies.
- UK ambulance response figures and jurisdiction-specific emergency speed exemptions need verification. The NFPA 1710 total includes or excludes call processing ambiguously in the research.
- Vitals alarm limits are drawn partly from a bedside-monitor checklist (not an ambulance monitor) and partly from estimates.
- Per-ambulance fault frequencies are estimates, not measured fleet statistics.
- Inference items in this report: the mission state machine as a Markov-style chain, time-of-day call-rate scaling, MAP approximation, oxygen minutes-remaining formula, and the urban BLS, ALS and rural variant presets.
- All patient vitals are generator parameters for synthetic data. No real patient data was used or is implied.
10 Sources
- isobus.net J1939 PGN/SPN reference (https://www.isobus.net/isobus/pGNAndSPN/1856?type=PGN)
- SAE J1939DA digital annex (https://saemobilus.sae.org/content/J1939DA_201505)
- Mindray DPM5 bedside monitor guidelines (https://www.mindray.com/content/dam/xpace/en_us/service-and-support/training-and-education/clinical-support/clinical-reference-guidelines/dpm5-bedside-monitor-guidelines.pdf)
- Mindray N-Series bedside guideline (https://WWW.MINDRAY.COM/content/dam/xpace/en_us/resource-library/patient-monitoring/technical-document/continuous-patient-monitoring/N-Series-Bedside-Guideline-8135.pdf)
- Fort Lauderdale Fire Rescue statistics (https://www.fortlauderdale.gov/Government/Departments/Fire-Rescue/Organization/Fire-Rescue-Statistics)
- DC FEMS EMS response time (https://fems.dc.gov/page/ems-reponse-time)
- Utah agency document quoting NFPA 1710 (https://www.utah.gov/pmn/files/893169.pdf)
- AUTOSAR SAE J1939 transport layer specification (https://www.autosar.org/fileadmin/standards/R25-11/CP/AUTOSAR_CP_SWS_SAEJ1939TransportLayer.pdf)
- Copperhill J1939 RTS/CTS walkthrough (https://copperhilltech.com/blog/sae-j1939-programming-with-arduino-multipacket-peertopeer-rtscts-session/)
- NDSS VehicleSec J1939 slides (https://www.ndss-symposium.org/wp-content/uploads/2024/09/vehiclesec2023-23053-slides.pdf)
- ISO 15765-2 (ISO-TP) (https://en.wikipedia.org/wiki/ISO_15765-2)
- Zephyr ISO-TP documentation (https://docs.zephyrproject.org/latest/services/connectivity/canbus/isotp.html)
- EMQX introduction to MQTT QoS (https://emqx.io/blog/introduction-to-mqtt-qos)
- ThingsBoard MQTT QoS (https://thingsboard.io/docs/mqtt-broker/concepts/qos/)
- DTU benchmarking of cellular IoT technology (https://orbit.dtu.dk/en/publications/benchmarking-of-cellular-iot-technology-based-on-coverage-mobilit/)
- Digital Matter data usage (https://digitalmatter.helpjuice.com/how-much-data-do-dm-devices-use)
- AWS IoT connect and publish (https://docs.aws.amazon.com/iot/latest/developerguide/connect-and-pub.html)