Skip to content
Document DB 13 - MCP Server, REST API, Field Level Encryption, Transactional Outbox, & More!SHOW ME!!

OBD Releases

Feature
Shiny.Obd.Emulator — be an adapter instead of reading one. The OBD-II adapter emulator that shipped inside the sample app is now a package. It answers the ELM327 dialect over a real TCP socket, so the AT initialisation handshake, supported-PID discovery, multi-frame VIN reads, freeze frames and trouble codes all happen for real rather than being mocked — which also makes it useful for testing apps that have nothing to do with .NET. services.AddObdEmulator() registers the vehicle, the responder, the TCP front-end and the driving scenarios; ObdEmulatorHost.Start() begins listening. Every PID the library has a command for is settable in engineering units or as raw bytes, individually supported or not (an unsupported PID answers NO DATA and leaves the supported-PID bitmask), alongside trouble codes for modes 03/07/0A, MIL state, monitor readiness, freeze frames and the ATI string.
Feature
Shiny.Obd.Emulator.Ble — the same emulator as a Bluetooth LE peripheral. services.AddObdEmulatorBluetoothLE() adds a GATT front-end advertising the FFF0/FFF1/FFF2 triple as VEEPEAK — the BleObdConfiguration defaults, so a Shiny.Obd client finds it with no configuration on either side. Transports are additive and share one vehicle, so a value you set is answered identically over BLE and TCP.
Feature
Eight emulated vehicles whose VINs decode for real. VehicleCatalog ships a Civic, a Camry, a 330i, a Prius, a Golf TDI, a Cummins Ram 2500, a Leaf and a 1998 Cavalier — each with a real WMI and descriptor, a valid ISO 3779 check digit, and a decode verified against NHTSA vPIC, so IVinDecoder answers with a real make, model and year instead of null. Setting ObdEmulatorState.Vehicle rewrites the whole car: identity PIDs, which PIDs exist at all (the diesels drop the narrowband O2 sensors and the evaporative system, the Leaf drops a third of mode 01, the Cavalier answers no mode 09 and so has no VIN to read over the bus), the readiness monitor set, the seeded fault memory, and the mass, gearing and fuel chemistry a driving scenario is played through.
Feature
Driving scenarios. DrivingScenarioPlayer writes the mode 01 parameters five times a second from the selected vehicle’s own physical model, so a client polling for hours sees a vehicle being driven rather than fixed values — RPM follows the gear the speed implies, mass air flow follows the load and the engine’s displacement, fuel rate follows the air flow at that fuel’s density, and the odometer, fuel level and trip counters integrate across laps. DrivingScenarioCatalog ships warm idle, city driving, busy highway and a mixed commute; gear changes with load-dependent shift points, deceleration fuel cut and harsh braking are all modelled.
Feature
VIN check digit. VinNumber.CalculateCheckDigit(vin) returns the ISO 3779 position-9 character ('0''9' or 'X', or null when the input is implausible) and VinNumber.IsCheckDigitValid(vin) compares it to what is there. Position 9 weighs zero in the formula, so a VIN carrying the wrong check digit still computes the right one — which is what makes this usable for generating VINs a decoder will accept, not just for checking them. Deliberately kept out of IsPlausible: the check digit is only mandatory in North America, so plenty of legitimate European and Asian VINs fail it and it must never be used to reject a VIN read off a vehicle.

Initial Release