Bus Sensor Networks
What a diesel, CNG, hybrid or electric bus measures, which on-board networks carry it, how it behaves over a service day, how it fails, and how to reproduce all of that in synthetic telemetry. Tags: [S] backed by a cited source, [K] domain knowledge or engineering estimate, [E] bridge-layer estimate, inference = derived by the author from the research notes.
1 Overview and operating context
A bus carries two overlapping sensor families. The first is the powertrain and chassis data shared with heavy trucks, broadcast on SAE J1939 CAN at 250 kbit/s (engine, transmission, brakes, tyres, aftertreatment). The second is passenger-service data specific to buses: per-door open state, automatic passenger counting (APC), kneeling and ramp, stop request, HVAC, GNSS for schedule adherence and, on electric buses, the battery management system (BMS) with a 400-800 V high-voltage pack.
Powertrain variants covered: diesel, CNG, hybrid and battery-electric; service types covered: urban transit (stop every 300-500 m) and intercity (stops every 20-100 km). A telematics gateway reads the buses through a read-only FMS (Fleet Management System) interface (Bus FMS 2007; FMS 3.0 of 2012 harmonised bus and truck) and uploads over cellular. Availability of individual FMS signals varies by vehicle model [S].
Fleet-scale framing from the bridge research [E]: a city bus operating 8-16 h per day produces about 2-10 records per second at the gateway, uploaded as one publish per 10-60 s, roughly 5-40 MB per day as JSON or 1-8 MB per day as binary or compressed payloads, or about 150-1000 MB per month.
2 Sensor inventory
Period values are bus broadcast periods ([K]) unless noted. Telematics export cadence is described in section 7. "Source bus" is the network on which the value normally appears.
| Signal | Unit | Typical range | Sample / report rate | Source bus |
|---|---|---|---|---|
| Engine speed (PGN 61444, SPN 190) | rpm | idle 600-800; cruise 1100-1500; max 2100-2500 | 10-20 ms; resolution 0.125 rpm [S] | J1939 CAN 250 kbit/s |
| Actual engine torque (SPN 513) | % | 0-100 | 10-20 ms | J1939 |
| Accelerator pedal position (PGN 61443, SPN 91) | % | 0-100 | 50 ms | J1939 |
| Engine load (SPN 92) | % | 0-100 | 50 ms | J1939 |
| Wheel-based vehicle speed (PGN 65265, SPN 84) | km/h | urban bus 0-70 | 100 ms; res 1/256 km/h | J1939 |
| Brake / clutch / cruise switches (SPN 597 / 598 / 595) | bool | on / off | 100 ms | J1939 |
| Engine coolant temperature (SPN 110) | degC | 80-95 normal; alarm above 105-110; offset -40 | 1 s; PGN 65262 per J1939-71 (a Garmin list shows 65263), verify [S] | J1939 |
| Engine oil temperature / oil pressure (SPN 175 / 100) | degC / kPa | 90-120 / 200-500 (idle 100-200) | 1 s | J1939 |
| Fuel temperature (SPN 174) | degC | 20-60 | 1 s | J1939 |
| Engine fuel rate (PGN 65266, SPN 183) | L/h | idle 1.5-4; bus urban 15-45 | 100 ms; res 0.05 L/h [S] | J1939 |
| Instant fuel economy (SPN 184) | km/L | 0-125 | 100 ms | J1939 |
| Fuel level 1 (PGN 65276, SPN 96) | % | 0-100; slosh noise +-2-5% while moving | 1 s; filter 10-60 s | J1939 |
| Total fuel used (PGN 65257, SPN 250) | L | monotonic | 1 s | J1939 |
| Total engine hours (PGN 65253, SPN 247) | h | monotonic | 1 s | J1939 |
| High-resolution vehicle distance (PGN 65217, SPN 917) | m | monotonic | 1 s | J1939 |
| Boost pressure / intake temperature (PGN 65270, SPN 102 / 105) | kPa / degC | 100-250 / 30-70 | 500 ms | J1939 |
| Exhaust gas temperature (SPN 173) | degC | 200-600; DPF regeneration 550-650 | 500 ms | J1939 |
| Battery potential, 24 V system (PGN 65271, SPN 168) | V | 24-28.8 running | 1 s | J1939 |
| Ambient temperature / barometric pressure (PGN 65269, SPN 171 / 108) | degC / kPa | -30..45 / 80-105 | 1 s | J1939 |
| DEF tank level (PGN 65110, SPN 3517) | % | 0-100; warn below 15%, derate below 5% | 1 s [S] | J1939 |
| DEF tank volume / temperature (SPN 1761 / 3031) | L / degC | 0-40 L; DEF freezes at -11 degC | 1 s [S] | J1939 |
| DPF soot load / differential pressure (SPN 3719 / 3251) | % / kPa | 0-100 / 0-30; regeneration near 80% soot | 1 s | J1939 |
| Tyre pressure (PGN 65268, SPN 241) | kPa | 750-900 cold | on change / 10 s; res 4 kPa/bit [S] | J1939 (or sensor RF gateway) |
| Tyre temperature (SPN 242) | degC | 20-90; alarm above 90-100 | on change / 10 s [S] | J1939 |
| Tyre location index (SPN 929); leak rate (SPN 1699) | index; Pa/s | - ; 0-65 | on change [S] / [K] | J1939 |
| Brake pedal position (PGN 61441, SPN 521) | % | 0-100 | 100 ms | J1939 |
| ABS active / ASR (SPN 563 / 575) | bool | on / off | 100 ms | J1939 |
| Brake air pressure (PGN 65274, SPN 116 / 117) | kPa | 700-1000; warn below 550 | 1 s | J1939 |
| Brake lining remaining | % | 100 to 0 over 40-80k km on an urban bus | 1-60 s | OEM / EBS (no standard SPN) |
| Transmission gear / oil temperature (PGN 61445 / 65272, SPN 523 / 177) | gear / degC | 1-12 / 60-110 | 100 ms / 1 s | J1939 |
| Active DTC (DM1, PGN 65226) | SPN + FMI + OC | - | 1 s while active; TP.BAM if more than one DTC | J1939 |
| Vehicle position (PGN 65267, SPN 584 / 585) | deg | - | 1 s; usually from telematics GNSS | J1939 or gateway GNSS |
| Signal | Unit | Typical range | Sample / report rate | Source bus |
|---|---|---|---|---|
| GNSS lat, lon, speed, heading, HDOP, satellites | deg, km/h | HDOP 0.7-2 open sky; 3-10 urban canyon; 6-18 satellites | 1 Hz fix; report 5-30 s and at stops | Gateway GNSS receiver |
| Door open, per door | bool | dwell 10-40 s | event plus 1 s | Digital input / body CAN |
| APC boardings and alightings per door | count | 0-30 each per stop; load 0-100 (articulated 150+) | per stop | Ethernet / PoE camera or sensor to gateway [S] |
| Occupancy | persons | 0 to about 2x seats | per stop | Derived from APC (running sum) |
| Kneeling, ramp, stop request | bool | - | event | Body CAN / LIN [K] |
| HVAC power / cabin temperature | kW / degC | 5-20 kW (heating up to 25-30) / 20-24 | 10-60 s | Body or powertrain CAN |
| Air pressure circuits | kPa | 700-1000 | 1 s | J1939 |
| Retarder / regeneration torque | % | - | 100 ms | J1939 |
| Fire detection (engine bay), CCTV, validators | - | - | event | Digital input, Ethernet, RS-232/485 |
| Signal | Unit | Typical range | Sample / report rate | Source bus |
|---|---|---|---|---|
| Pack voltage | V | NMC 540-650; LFP 500-650 nominal; more than 180 series cells [S] | CAN 100 ms-1 s; upload 10 s [S Chengdu] to 60 s [S Ruter] | CAN 500 kbit/s or J1939 |
| Pack current | A | -250 (regen) to +400 (traction); depot charge 150-450 | same | CAN; sign convention varies |
| State of charge (SOC) | % | operating 95 to 20 [S] | same | CAN |
| State of health (SOH) | % | 100 to 80 over 6-10 years, about 2-3%/yr | daily | CAN |
| Cell voltage max / min | V | NMC 3.0-4.2; LFP 2.5-3.65; spread 10-60 mV healthy | 1 s [S: min and max recommended] | CAN |
| Cell temperature max / min / avg | degC | 15-35 normal; alarm above 45-55; no charging below 0-5 | 1-10 s [S: redundant sensors] | CAN |
| Battery coolant in / out | degC | 20-40 | 1-10 s | CAN |
| Insulation resistance | ohm/V | above 500; fault below 100 | 1-10 s | CAN |
| Charge / discharge power limit | kW | 150-300; derates when cold and SOC below 10% | 100 ms | CAN |
| Motor speed / torque / temperature | rpm, Nm, degC | 0-2500; 0-1500; to 150 | 10-100 ms | CAN |
| Energy consumption | kWh/km | 12 m: 0.9-1.8 (Ruter example 1.52 [S]); winter +30-60%; articulated 1.6-2.5; loaded +45% vs empty [S thesis] | derived | derived from pack power |
| Charger power | kW | depot 50-150; opportunity / pantograph 300-600; taper above about 80% SOC | 1 s | Charger link |
| Regeneration share | % of traction energy | 15-30% urban | derived | derived |
3 On-vehicle networks and protocols
| Bus / protocol | Bitrate | Use on a bus | Notes |
|---|---|---|---|
| CAN 2.0B (ISO 11898) | 250 kbit/s (J1939, FMS); 500 kbit/s (OBD-II, e-bus powertrain and BMS); 125 kbit/s body; up to 1 Mbit/s | Engine, transmission, brakes, BMS | [S] trackers support 50/100/125/250/500/1000 kbps; FMS 250/500 |
| SAE J1939 | 250 kbit/s | Heavy-duty application layer | 29-bit ID, 8-byte frames, transport protocol (BAM or RTS/CTS) above 8 bytes; PGN 0-65535; 3-bit priority, 8-bit source address |
| OBD-II / ISO 15765-4 (UDS ISO 14229) | 500 (or 250) kbit/s CAN | Diagnostics and DTC | Polled request and response, not broadcast |
| FMS standard (Bus FMS 2007; FMS 3.0 2012) | 250 kbit/s | Read-only gateway for telematics | [S] speed, fuel level, total fuel, vehicle weight, axle weight, tachograph data; availability varies by model |
| J1708 / J1587 | 9.6 kbit/s | Legacy pre-2010 vehicles | [K]; unlikely on a modern bus (inference) |
| LIN | 19.2 kbit/s | Doors, mirrors, simple sensors | [K]; master schedule slots 5-20 ms, bridged via a LIN-CAN node [E] |
| Ethernet 100BASE-T1 / PoE | 100 Mbit/s | APC cameras, CCTV, infotainment | [S] PoE APC |
| Modbus RTU/TCP, RS-485 / RS-232 | 9.6-115.2 kbit/s | Ticketing, destination signs, validators | Modbus RTU polls 100 ms-1 s per register block, CRC16, timeout 100-500 ms, 3-10% retries on noisy power [E] |
| Tachograph (EU) | CAN via FMS | Driving and rest state | [S] tachograph CAN data may stop with ignition off |
Bridge layer between the bus and the cloud
| Topic | Fact | Tag |
|---|---|---|
| CAN classic frame | 8 B payload, about 130 bits with stuffing; at 250 kbps about 0.5 ms wire time, 1.3-1.6 ms effective | [E] |
| J1939 TP.CM_BAM | Up to 1785 B (255 packets x 7 B); PGN 0xEC00 (CM) / 0xEB00 (DT); inter-packet gap 50-200 ms, 50 ms typical; no retry, so one lost frame drops the whole message | [S-partial] numbers [E] |
| J1939 TP RTS/CTS | RTS, CTS(n), DT x n, EndOfMsgACK; timers T1 750 ms, T2 1250 ms, T3 1250 ms, T4 1050 ms | [E] |
| Typical PGNs | EEC1 (61444) 20 ms; CCVS (65265) 100 ms; ET1 (65262) 1 s; DM1 (65226) 1 s while active (BAM if more than one DTC); VIN (65260) multi-frame on request | [E] |
| Telematics gateway class | CAN-to-MQTT/TCP box (Teltonika FMC/FMB, CalAmp, Geotab GO, Samsara, Webfleet, Digital Matter): 1-2 CAN, J1939/OBD, GNSS, accelerometer; 4G Cat-1/Cat-4 or LTE-M; records every 1-10 s, batched 30-300 s | [E] |
| Binary AVL record | About 40-120 B per record, up to 255 records per packet | [E] |
| 4G LTE link | RTT 30-60 ms (p95 150), loss 0.1-1%, handover blips 50-500 ms, weak-cell stalls 2-10 s | [E] |
| Urban bus coverage | 99%+ coverage; dead spots 5-30 s at depots and underpasses; handover glitch every 1-5 km; tunnels 30 s-10 min full loss with GNSS also lost | [E] |
| Wi-Fi offload | Depot Wi-Fi, 5-30 ms RTT, used for backfill, OTA and high-rate logs; association 1-5 s | [E] |
| TPMS / BLE | TPMS is one-way 315/433 MHz; assume 60-300 s parked, 3-30 s moving or on pressure change; BLE gateway scan misses 5-20% of adverts | [E] |
| MQTT QoS | QoS0 loses data on link drop; QoS1 default for telemetry, duplicates 0.1-2% on lossy cell and 5-15% of in-flight messages around reconnects; QoS2 for alarms, rare on cellular. Resend needs Clean Start=0. Keepalive at most 60 s on cellular | [S] semantics, rates [E] |
| Cloud dedupe key | (device_id, boot_id, seq); a sequence reset on reboot is a classic false duplicate or gap source | [S] |
Telematics reporting from the research notes: 1-30 s while moving, 1-15 min heartbeat while parked, store-and-forward on cellular loss [K].
4 Duty cycles and operating profiles
| Parameter | Urban transit | Intercity |
|---|---|---|
| Pull-out / pull-in | 04:30-06:30 / 00:00-01:00 | same range (inference) |
| Peaks | 07-09 and 16-19 | - |
| Block length | 8-16 h | 8-16 h |
| Stop spacing / dwell | 300-500 m / 15-40 s | every 20-100 km |
| Commercial speed | 12-22 km/h | 60-85 km/h average, limit 100 km/h |
| Daily distance | 150-250 km (e-bus examples 200-250 km) | 300-500 km |
| Time at speed 0 while engine on | 40-60% (lights, stops) | not stated; expect much lower (inference) |
| Driver breaks / layover | 10-30 min / 3-15 min at terminus | - |
- Diesel: idle 600-800 rpm, 1.5-3 L/h, 20-35% of engine hours; tank 250-350 L refuelled nightly; DEF 20-40 L.
- Electric: SOC 95% at 05:00 falling to 20-30% by evening over 200-250 km; optional midday opportunity charge; overnight depot charge 3-6 h at 50-150 kW; battery pre-heat at depot; winter HVAC drains SOC faster.
- Weekend service is 60-70% of weekday. Passenger load follows the peaks, spikes at hubs, and is zero at the end of line.
- GNSS dropouts occur in tunnels, depots and urban canyons.
- Power: key-off sleep with CAN or accelerometer wake; cranking brownout below 6 V reboots 0.1-1 per day on weak-battery vehicles [E].
5 Faults and anomaly signatures
All injection rates are [K] estimates unless noted; bridge-layer rates are [E].
| Mode | Signature | Approx. frequency | Applies to |
|---|---|---|---|
| Stuck-at | Zero variance over N samples while related signals move (fuel level, coolant) | 0.1-1% of sensor-days | all |
| Drift | Bias growth 0.1-1% per month; RTD offset +0.5-2 degC; IMU bias 0.02-0.05 g | 1-3% per year of sensors | fuel, temps, tyres, cells, IMU |
| Spike / outlier | Single sample 3-10 sigma | 1e-4 to 1e-3 of samples | all |
| J1939 not-available / error | Raw 0xFF / 0xFE at ignition or after a DTC | 1-5 s per startup | J1939 signals |
| Cellular dropout | Gaps 30 s-30 min; store-and-forward bursts with old timestamps | 1-5% of time | all |
| CAN dropout / ECU reset / bus-off | All signals from one source address vanish 1-60 s | about 1 per 1e5 h | all |
| GPS multipath / urban canyon | Jumps 20-100+ m, HDOP above 3, fewer than 5 satellites, speed noise; tunnel loss | 5-15% of fixes in a dense city; below 1% on highway | buses more than trucks |
| GPS cold start / teleport | Wrong fix km away for 30-60 s after power-up; rare jumps | per power-up | all |
| Time skew, duplicates, out of order | Device vs server skew 0-30 s; retransmitted duplicates | 0.1-2% | all |
| Quantisation | 1 degC/bit, 1/256 km/h, 0.05 L/h | always | J1939 |
| TPMS | Slow leak 5-20 kPa/day; sensor battery death | leak about 1%/yr/tyre | buses (lower than trucks) |
| Fuel level | Slosh noise; step up on refuel; sudden drop (theft) | per event | diesel |
| Odometer / hours reset | Decrease or jump after ECU swap | very rare | all |
| E-bus BMS | SOC step 2-10% on recalibration at rest; cell spread growth; temperature sensor reads -40 or 215 degC when offline; comms dropouts [S PowerUp] | about 1% of buses per month | e-buses |
| Engine overtemp / derate | Coolant above 105 degC with torque cut | rare | all |
| APC miscount | Drift, negative occupancy, stuck zero, double count at wide doors | 1-5% error; sensor failure about 1-2%/yr | buses |
| Door switch stuck | Open for hours or never | rare | buses |
| Failure | Signature | Rate |
|---|---|---|
| CAN bus-off | All signals vanish 0.1-5 s, or until power cycle | 0.05-0.5 episodes per vehicle per day; 1% of devices chronic |
| Wrong bitrate | Error frames, no data | 0.5% of installs |
| Dropped frames | Gaps in cyclic PGNs, alive-counter skips | 0.01-0.5%; up to 5% on an overloaded gateway |
| Duplicate frames | Identical timestamp and value | 0.1-1% |
| TP session failure | DM1 or VIN missing, abort codes | 0.5-3% of multi-frame messages |
| Buffer overflow | Sequence gap, oldest dropped (after 6-72 h offline at 1 Hz) | 0.5-2% of outages longer than 6 h |
| Timestamp skew | Future timestamps, 1970 dates; 0.5-2% of devices offset above 5 s; 0.05% above 1 h | 0.5-2% of devices |
| Encoding errors | Scaling x10 or x100, signed/unsigned, endianness, 0xFF/0xFFFF sentinels; impossible values such as 6553.5 km/h | 0.1-1% of records |
| Firmware / schema mismatch | Unknown IDs, shifted signals, dropped fields | 2-10% of fleet on old firmware for 1-4 weeks after rollout |
| Frozen value | Flatline with valid timestamp | 0.1-1% of signals |
| Reconnect storm | Mass reconnect, burst replay, duplicates | event-based |
| Clock jump | Timestamp step of seconds after NTP or GNSS correction | few per month |
6 Events, alerts and thresholds
| Event | Threshold | Basis |
|---|---|---|
| Harsh braking | 0.30-0.45 g | [S] GPS Insight 0.29-0.38 g by weight class (device default 0.367 g); Digital Matter 4.4 m/s2 (about 0.45 g); transit often 0.25-0.3 g for standing passengers [K] |
| Harsh acceleration | 0.30-0.45 g; buses rarely above 0.2 g | [S] 0.337 g GPS Insight; 4.4 m/s2 Digital Matter |
| Harsh cornering | 0.35-0.56 g; buses 0.2-0.3 g | [S] 0.357 g; 5.5 m/s2 Digital Matter; bus values [K] |
| Minimum speed for GPS-based event | 10 km/h accel and brake; 30 km/h cornering | [S] Teltonika; accelerometer preferred [S] |
| Overspeed | limit +5-10 km/h | [K] |
| Excess idling | above 3-5 min; alarm above 10 min | [K] |
| Door open while moving | speed above 5 km/h | [K] |
| Overload | passengers above rated (80-100 for 12 m) | [K] |
| Low tyre | below 85% nominal or below 700 kPa | [K] |
| Coolant | above 105 degC | [K] |
| DEF | below 15% warn; below 5% derate | [K] |
| Air pressure | below 550 kPa | [K] |
| Battery cell temperature | above 50-55 degC | [K] |
| Low SOC | below 20% warn; below 10% limp | [K] |
| Cell imbalance | spread above 100-150 mV | [K] |
| Schedule / route | more than 1-3 min late; more than 100-200 m off route; skipped stop | [K] |
| Impact | above 2.5-4 g | [K] |
| Active DTC (DM1) | any active amber or red lamp DTC | [K] |
Note on door signals: door switches distinguish holding time from dwell, and some fleets drive with doors open, making that signal useless on those fleets [S TCRP].
7 Generator guidance for the simulator
1 Hz for kinematics, engine rpm, speed and fuel rate; 10 s for battery, temperatures, DEF and TPMS; event-driven for doors, APC, DTC, harsh events and geofence; 5-15 min parked heartbeat. Apply +-10% report jitter and batched uploads after connectivity loss [K]. Typical gateway batch: 60 s (10 s live, 300 s eco), flush on ignition-off or at 70-80% buffer fill [E].
Drive every signal from a duty-cycle state machine with states: depot/parked, driving, stop dwell, layover, idle, charging/refuelling, rest break.
- Fuel rate = f(speed, grade, load): idle 1.5-3 L/h; urban 15-45 L/h at speed.
- Coolant: first-order lag of engine load, tau 120-300 s, normal band 80-95 degC.
- E-bus SOC(t) = SOC(0) - integral of pack power dt / usable energy, regen negative, 15-30% of traction energy recovered in urban service.
- Passenger load: occupancy(t) = sum(in - out) per door, clamp at 0, reset at terminus; boardings 0-30 per stop with peak scaling.
- Stop cycle: stop every 300-500 m, dwell 15-40 s drawn from a right-skewed distribution (inference: lognormal), door open during dwell.
- Quantise to J1939 resolutions: speed 1/256 km/h, rpm 0.125, fuel rate 0.05 L/h, temperatures 1 degC with -40 offset, tyre pressure 4 kPa/bit.
- Fuel level: add +-2-5% slosh noise while moving, filter 10-60 s, step up 200-300 L-scale on nightly refuel (tank 250-350 L).
- GNSS: HDOP 0.7-2 open sky, 3-10 urban canyon; urban canyon position error 10-50 m, tails 100+ m.
- Counts: APC accuracy 97.5-99.5% vendor, 90-98% real world at crowded wide doors.
Inject faults per Tables 5.1 and 5.2 with a ground-truth label on every injected imperfection. Suggested per-vehicle latent traits: clock ppm (20-50 typical; cheap RTC up to 100 ppm, i.e. 1.7-4.3 s/day and 8.6 s/day), firmware version, buffer size, link type, chronic-fault flag. Pipeline order: truth signals, bus layer (frame loss, TP aborts, bus-off, sentinels), gateway (clock, deadband, batch, codec, finite buffer), link state machine, broker semantics (QoS1 duplicates, reorder on replay), cloud record with received_at, boot_id, seq, batch_id, fw_version, schema_version, tenant [E].
Optional edge filters [E]: speed 1 km/h, coolant 1 degC, fuel 0.5%, GPS 10-50 m or 15-30 degrees heading; removes 60-90% of samples. Size vs JSON: CBOR 0.5-0.8, Protobuf 0.2-0.5, vendor binary 0.1-0.3; JSON record of 10 signals is 250-600 B.
| Knob | City transit | Intercity | Electric fleet |
|---|---|---|---|
| Mean speed | 12-22 km/h | 60-85 km/h | 12-22 km/h urban |
| Daily km | 150-250 | 300-500 | 200-250 |
| Stop spacing | 300-500 m | 20-100 km | 300-500 m |
| Dwell | 15-40 s | minutes (inference) | 15-40 s |
| Share of engine-on time at speed 0 | 40-60% | low (inference) | not applicable to idle fuel; motor idle (inference) |
| Energy / fuel | idle 1.5-3 L/h; 15-45 L/h | same signal set, lower stop-go load (inference) | 0.9-1.8 kWh/km; winter +30-60%; loaded +45% |
| APC / doors | 0-30 per door per stop | fewer, larger boarding groups at stops (inference) | as city transit |
| Powertrain-only signals | rpm, coolant, DEF, DPF, fuel | same | replace with pack V/I, SOC, cell V/T, charger |
| GNSS quality | 5-15% degraded fixes | below 1% degraded | 5-15% degraded |
| Charging / refuel | nightly refuel 250-350 L | refuel at depot (inference) | 3-6 h overnight at 50-150 kW; optional opportunity 300-600 kW |
| Connectivity | 99%+, 5-30 s dead spots | rural gaps 3-10% of drive time (truck figure, inference) | 99%+, depot Wi-Fi backfill |
| Harsh thresholds | brake 0.25-0.3 g | vendor default 0.3-0.45 g | vendor default |
| Cadence | 1 Hz GPS, report 10-60 s | report 10-60 s | BMS upload 10-60 s |
| Schema | doors and pax present | doors, pax; tachograph via FMS | BMS block present |
Further tenant-level knobs from the bridge research [E]: unit and key naming (km/h, degC, camel vs snake case), timestamp format (epoch ms vs ISO-8601), missing values as null vs sentinel, sampling policy pushed via retained config (config lag leaves 1-10% of devices on the old policy for hours), retention (raw 7-30 days, 1-min rollups 13 months, driver GPS trails shortened or anonymised for GDPR), and topic pattern t/{tenantId}/v1/{vehicleClass}/{deviceId}/{telemetry|event|status|cmd|ack}.
8 How the Sense simulator implements this
Source and status. This section restates the simulator document BUS_POINTS.md (verification dated 12 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. Where the Sense side is described, it 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 has the variant bus and a subvariant that selects the scenario. The codes are the ones the Controller and the platform use. A tenant with another subvariant (or none) runs no bus; the simulator's own selector (default staff-shuttle) is used only when the tenant's subvariant is empty. Table 7.1 above covers city transit, intercity and electric fleet; the hospital staff shuttle is a fourth scenario that Table 7.1 does not list.
| Code | Stands for | Route | How it is generated |
|---|---|---|---|
| staff-shuttle | Hospital staff shuttle | Closed loop of 6 stops in Bengaluru (stops 301-306), about 9 km | Stop, doors, one alights a second, one boards every 2 s with a card tap; more boarding at shift changes (06:30-08:00, 13:30-15:00, 20:30-22:00 IST); every third loop a 10-minute layover at the main gate with engine off, driver change and refuel; runs all day |
| city-transit | Diesel city bus | Majestic - MG Road - Indiranagar - Marathahalli - Whitefield, about 23 km, out and back | Block of 12-16 h from 04:30-06:30 (70%) or 8-14 h ending 00:00-01:00 (30%); stop every 300-500 m; dwell lognormal (median 23 s, 14-60 s); 0-30 boardings per door per stop with peak scaling (07-09, 16-19), hubs x3, weekend x0.65; traffic signals; terminus layover 3-15 min with passengers zero at the end of line; nightly refuel after pull-in; 5-15% degraded GNSS; dead spots |
| intercity-coach | Diesel coach | Bengaluru - Nelamangala - Kunigal - Channarayapatna - Hassan, about 188 km, stops 26-79 km apart | 78-96 km/h cruise, 50 km/h near towns; dwell in minutes (lognormal, median 6 min); rest break of 15-25 min after 1.5 h of driving; terminus layover 60-100 min; block of 8-11 h (300-500 km a day); rural dead zones (3 km cells, 6.5% of the route); GNSS degraded below 1% |
| electric-fleet | Battery-electric city bus | Majestic - Jayanagar - Silk Board - Bommanahalli - Electronic City, about 22 km | Like city transit without engine groups: 180-cell LFP pack (400 kWh usable), SOC 95% at pull-out falling to 25-30%, regeneration 15-20% of traction energy, 1.2-1.7 kWh/km, cell temperatures, overnight depot charge of 3-6 h at 55-120 kW (taper above 80%) |
8.2 Protocols emitted and the one-vehicle-per-tenant model
One Fleet tenant is one bus, and every bus tenant has its own Bhairava Sense. The desktop simulator starts one bus for the tenant's subvariant and gives the tenant a slot 0-23 (tenant id modulo 24, moved up to the next free slot when another running vehicle tenant holds it; one allocator serves buses, trucks and ambulances). Slot s sends UDP to 127.0.0.1 ports 49001+5s (CAN gateway), 49002+5s (NMEA) and 49003+5s (tracker) from source address 127.0.(1+s).20; for example slot 5 sends to 49026, 49027, 49028 from 127.0.6.20. The card shows the matching Ports text to type into the Ports setting of that tenant's Sense (socket mode). Two Sense instances on one PC cannot share a UDP port, which is why each tenant has its own triple. The bus identity (bus id, IMEI with a valid Luhn digit, VIN with a valid check digit, driver cards, J1939 address-claim identity number) is drawn from an FNV-1a hash of tenant:<id>, so the same tenant is the same bus in every run. The multi-bus options (:N) remain for tests and load runs only.
| Equipment | Protocol on the wire (all UDP) | Default port | Sense device name |
|---|---|---|---|
| GNSS receiver (ignition on) | NMEA 0183 $GNGGA and $GNRMC, 1 Hz | 10110 | talker GN at <source ip> |
| Powertrain and body CAN through a CAN-to-Ethernet gateway (13-octet frames, one datagram a second, ignition on) | SAE J1939 (29-bit) and OBD-II (VIN) | 20001 | unit <SA> on CAN gateway <source ip> (SA 0 powertrain, 11 brakes, 23 cluster, 33 body); control unit 7E8 on CAN gateway <source ip> |
| Telematics unit | Wialon IPS 1.1 text: login line, then data lines with date, time, position, speed, course, altitude, satellites, HDOP, inputs, outputs, ADC, iButton and params | 20332 | tracker <imei> |
Wialon input bits: 0 ignition, 1 front door, 2 rear door, 3 panic (shuttle), stop request (city, coach) or plugged in (electric). Params are name:type:value (1 integer, 2 decimal). J1939 values are quantised to the J1939-71 resolutions listed in section 7. NMEA and CAN are sent only while the ignition is on; CAN slow groups every 10 s and the VIN every 600 s in all four scenarios.
| Scenario | Moving | Standing | Ignition off |
|---|---|---|---|
| staff-shuttle | 10 s | 30 s | 120 s |
| city-transit | 15 s | 30 s | 600 s |
| intercity-coach | 30 s | 60 s | 600 s |
| electric-fleet | 20 s | 30 s | 300 s (60 s while charging) |
8.3 Signals actually emitted
"Diesel" means staff-shuttle, city-transit and intercity-coach; "all" includes electric-fleet. Sense makes one reading per J1939 signal and per Wialon param, named as in the table.
| Source | Sense point (unit) | Scenarios | Rate |
|---|---|---|---|
| NMEA GGA | GGA latitude, GGA longitude (degrees); GGA fix quality; GGA satellites; GGA altitude (m) | all | 1 s |
| NMEA RMC | RMC status (valid or warning); RMC latitude, RMC longitude (degrees); RMC speed (knots); RMC course (degrees) | all | 1 s |
| J1939 EEC1 (PGN 61444) | Driver demand torque, Engine torque, Engine demand torque (%); Engine speed (rpm) | diesel | 1 s |
| J1939 EEC2 (61443) | Accelerator pedal position, Engine load (%) | diesel | 1 s |
| J1939 CCVS (65265) | Vehicle speed (km/h); Parking brake; Brake pedal; Cruise control; Clutch pedal | all | 1 s |
| J1939 LFE (65266) | Fuel rate (L/h); Instantaneous fuel economy, Average fuel economy (km/L); Throttle position (%) | diesel | 1 s |
| J1939 ET1 (65262) | Coolant temperature, Fuel temperature, Engine oil temperature (degC) | diesel | 10 s |
| J1939 EFL/P1 (65263) | Fuel delivery pressure, Engine oil pressure, Coolant pressure (kPa); Engine oil level, Coolant level (%) | diesel | 10 s |
| J1939 DD (65276, SA 23) | Fuel level (%) | diesel | 10 s |
| J1939 VEP1 (65271) | Battery current, Alternator current (A); Charging system voltage, Battery voltage, Key switch battery voltage (V, 24 V system) | all | 10 s |
| J1939 AMB (65269, SA 33) | Barometric pressure (kPa); Cab interior temperature, Ambient air temperature, Air inlet temperature (degC) | all | 10 s |
| J1939 HOURS, LFC, VD, VDHR, AT1T1I | Engine hours (h), Engine revolutions; Trip fuel, Total fuel used (L); Trip distance, Total vehicle distance (km) and the high-resolution pair; Exhaust fluid tank level (%, diesel only) | all (fuel, hours and DEF: diesel) | 10 s |
| J1939 DM1 (65226) | Event "fault SPN n FMI m", or "no active fault codes" | all | 1 s while active, else 10 s |
| J1939 address claim (60928) | Presence "unit claims address 0 / 23 / 33" | all | at ignition on |
| OBD-II service 09 PID 02 | Presence "vehicle identification number" with the VIN | all | at ignition on and every 600 s |
DM1 codes sent (amber lamp): diesel SPN 110 FMI 16 (coolant over 102 degC), SPN 1761 FMI 18 (DEF under 10%), SPN 117 FMI 1 (air pressure under 600 kPa); electric SPN 520193 FMI 0 (cell over 50 degC), SPN 520192 FMI 1 (SOC under 10%), SPN 117 FMI 1. Degraded GNSS is sent as 3-4 satellites, HDOP 3-10, 10-50 m position error with jumps over 100 m; a tunnel gives fix quality 0 and RMC status warning.
| Scenario | Params (unit) |
|---|---|
| all | ign (0/1); seq (report counter, resets at reboot); boot_id (counts reboots); pwr_ext (V); odometer (km); hdop; gps_sats; gsm_lvl (0-5); gsm_rsrp (dBm); gsm_rsrq (dB); gsm_sinr (dB); net_type (3, 4, 5); link_down_s (s, length of the outage just ended); door_front, door_rear (0/1); stop_id; cabin_temp (degC); plus Latitude, Longitude (degrees), Speed (km/h), Heading (degrees), Altitude (m) |
| staff-shuttle | pax (persons, max 42); pax_in, pax_out (this stop); card_id (card UID as decimal); card_taps (count); ac (0/1); ac_setpoint (degC); ac_fault; driver_card; panic; cam1 to cam4 (1 ok, 0 fault); dvr_rec |
| city-transit | pax (APC occupancy estimate); apc_in_1, apc_out_1, apc_in_2, apc_out_2 (counted this stop, per door); stop_req (0/1); hvac_kw (kW) |
| intercity-coach | pax; apc_in_1, apc_out_1; hvac_kw (kW); drv_state (0 rest, 1 available, 2 work, 3 driving; tachograph via FMS); drive_min (minutes driving since the last break); overspeed (over 100 km/h) |
| electric-fleet | As city-transit plus the battery block: charge_state (0 driving, 1 parked, 2 charging); soc, soh (%); pack_v (V); pack_i (A, discharge positive); cell_vmax, cell_vmin (V); cell_tmax, cell_tmin, cell_tavg (degC); coolant_in, coolant_out (degC); iso_res (ohm/V); chg_limit_kw, dis_limit_kw (kW); motor_rpm; motor_nm (Nm); motor_temp (degC); kwh_km (kWh/km, windowed); regen_pct (share of traction energy recovered); charger_kw (kW) |
8.4 What Sense can and cannot read yet
The simulator document lists these as Sense-side gaps; Sense itself was not changed by the simulator work. The state below follows BUS_POINTS.md section 8, the later TRUCK_POINTS.md section 8 and Sense's BUILD.md.
- Read by the working copy of Sense, not by the released build of 12 Oct 2026: J1939 TIRE1 (65268, one point per tyre) and B1 (65274, brake pressures); NMEA GGA HDOP and the RMC time; the Wialon record date and time (kept as the source time); a Wialon unit for the names in Table 8.5 through a name table (unknown names stay without a unit). The setting
common.use_source_timeis off by default. - Electric bus battery, motor and charger: no J1939 high-voltage energy-storage group and no OBD-II PID 5B in Sense, so these travel only as Wialon params.
- Not read at all: APC, HVAC and door-control signals (no standard group; carried as Wialon params), the tachograph state beyond speed, string params and the iButton field of Wialon IPS, the native UDP form of Wialon IPS 2.0 (only the session form, login plus data lines in each datagram, is read), Teltonika over UDP, and the J1939 vehicle number (65260). Sense also does not use seq or boot_id, so duplicates and replayed old records count as new readings.
- Not reachable from the simulator: MQTT, HTTP JSON, HL7 and TCP trackers; the simulator sends UDP only.
- Vehicle profiles: the Fleet compatibility check compares what is heard with a profile chosen by the tenant variant and, for a bus, by the subvariant (profiles exist for staff-shuttle, city-transit, intercity-coach and electric-fleet; an empty or unknown subvariant uses the plain Bus profile).
8.5 Faults and the ground-truth file
Each bus carries latent traits (device clock error in ppm, a chronic flag in 1% of buses with 5% frame loss and bus-off 5 a day, frame loss 0.01-0.5%, bus-off 0.05-0.5 a day, a weak battery in 5% with a reboot on 40% of ignition-on events, APC miss rate 1-5%). Fault rates are those of Tables 5.1 and 5.2, scaled by --bus-faults (100 = as in the report). Injected faults include the J1939 not-available block after ignition on, spikes, x10 encoding errors, dropped and duplicated CAN frames, bus-off, VIN transport aborts, stuck-at and drift, GNSS episodes, jumps and cold-start teleport, link outages with store-and-forward replay, reboots (seq restarts, boot_id +1), door stuck, APC miscount and stuck at zero, fuel theft, TPMS leak, engine overtemperature, and for electric buses SOC steps, cell temperature sensors reading -40 or 215 and BMS dropouts.
With --truth FILE the simulator writes one JSON object per line. Every line has t (simulated seconds since start), utc, vehicle and type; the first lines are run (seed, clock, options) and one vehicle per bus (scenario, IMEI, VIN, source, clock error, block hours). Then one line per event, for example stop (true in and out, dwell), apc_error, link_down and link_up (cause dead_zone, tunnel or dropout), replayed, buffer_overflow, frame_dropped, bus_off, tp_abort, j1939_na, spike, encoding_error, stuck_at, drift, gps_jump, reboot, door_stuck_start, fuel_theft, engine_overtemp_start, soc_recalibration_step, bms_comms_dropout and end. The file is the ground truth against which a detector can be scored. Not simulated: multi-code DM1 transport failures, wrong CAN bit rate, firmware or schema mismatch, clock jump, odometer reset, reconnect storms from many buses, and signals absent by tenant.
8.6 Measured differences between the scenarios
Headless runs of 12 Oct 2026 with a fixed seed and simulated clock 60 (staff-shuttle 2 buses for 3 simulated hours, city-transit 4 buses for 4 h, intercity-coach 2 buses for 9 h, electric-fleet 3 buses for 4 h). Every datagram (41,057 / 86,949 / 74,848 / 57,681 / 106,035 over the runs including a night run) was identified by Sense's protocol handler as NMEA 0183, OBD-II, J1939 or Wialon IPS, with none unknown or unreadable. The table is taken from NMEA and the truth file.
| Measure | staff-shuttle | city-transit | intercity-coach | electric-fleet |
|---|---|---|---|---|
| Mean speed, ignition on / moving (km/h) | 23.3 / 29.4 | 14.0 / 23.7 | 67.7 / 80.2 | 13.4 / 23.2 |
| Share of engine-on time at speed 0 | 21% | 41% | 16% | 42% |
| Stop spacing, mean (m) | 1,509 (loop) | 408 (303-498) | 53,898 (37-79 km) | 392 (302-689) |
| Dwell, mean / median / range (s) | 22 / 19 / 11-73 | 25 / 24 / 14-55 | 387 / 315 / 126-917 | 25 / 24 / 14-60 |
| Terminus layover | 630-670 s (every third loop) | 281-890 s | 71-91 min | 483-647 s |
| Degraded GNSS fixes (HDOP over 3, fewer than 5 satellites or no fix) | 0.8% | 7.9% | 0.6% | 6.8% |
| Link down, share of time | 1.1% | 2.3% | 4.0% of all time (about 6% of driving) | 1.5% |
| Outage length (s) | 24-51 | 31-418 | 119-142 | 29-80 |
| Fuel (L/100 km) | 28 | 49 | 31 | - |
| Energy | - | - | - | 1.6-1.7 kWh/km (SOC drop over odometer), regeneration 15.6-16.3% |
Night run: three electric buses charged 4.4-5.5 h at 71-92 kW (266-342 kWh); the diesel buses pulled in and refuelled; no NMEA datagram was heard inside any outage interval of the truth file. The coach covered about 340 km per bus in 9 h. Two tenants at once (staff-shuttle and city-transit on separate Sense instances and port triples) each heard only their own IMEI and address.
One result sits at the low end of this report: Table 4.1 asks for 40-60% of engine-on time at speed 0 in city service, and the simulation gives 41-42%. These are simulator outputs; they show the generator follows the report, not that real buses do.
9 Uncertainty and assumptions
- The fetched sources did not give J1939 scaling; verify against SAE J1939-71 and J1939DA before decoding any raw frame. The coolant PGN is listed as 65262 in J1939-71 and 65263 on one Garmin list.
- Most ranges, periods, thresholds and fault frequencies are [K] or [E] estimates, not measured data; use them as priors with wide jitter.
- Cited bus-specific facts are narrow: the Chengdu e-bus dataset (10 s logging), Ruter (1/min SOC, current, Wh/km), PowerUp (min/max cell V and T, BMS errors), APC vendor accuracy, and vendor harsh-driving defaults, which target light vehicles and need bus tuning.
- Intercity numbers are thinner than urban ones; intercity columns in Table 7.1 that say inference are not from the research files.
- J1708/J1587 and ISO 11992 are included from domain knowledge only; ISO 11992 is a truck-trailer link and was omitted as irrelevant to rigid buses (inference).
- Bridge-layer numbers are largely [E]; link and gateway behaviour on a specific operator network will differ.
- Many telematics suppliers expose only a subset of FMS signals for buses; the generator should allow signals to be absent by tenant.
10 Sources
- J1939 PGN 61444 EEC1 (isobus.net, from SAE J1939DA)
- J1939 PGN 65110 DEF tank (isobus.net)
- Garmin J1939 PGN list (coolant, fuel rate)
- Tyre PGN 65268 (TIRE1)
- Chengdu e-bus CAN dataset
- Ruter (Oslo) bus telemetry concept
- PowerUp e-bus battery analytics
- Route One e-fleet data access
- FMS standard overview (DigiKey)
- Teltonika FMC650 CAN IO
- Wialon FMS gateway
- GPS Insight harsh driving thresholds
- Digital Matter harsh driving event setup
- Teltonika FMB150 features and settings
- Navixy harsh driving settings
- Infodev APC solutions for transit
- Thoreb APC module
- TCRP report 13907, chapter 5 (door switch vs dwell)
- AUTOSAR SAE J1939 transport layer specification
- Transport protocol vulnerabilities on SAE J1939 networks (Colorado State)
- J1939 RTS/CTS session walkthrough (Copperhill)
- NDSS VehicleSec 2023 slides (TP failure modes)
- TPMS sensor signals (Tomorrow's Technician)
- AWS IoT FleetWise
- EMQX MQTT QoS introduction
- ThingsBoard MQTT QoS
- Digital Matter data usage
- JSON vs CBOR for IoT payloads (Hubble)
- Beating JSON performance with Protobuf (Auth0)
- AWS IoT connect and publish
- HiveMQ MQTT topic namespace