Supported devices
SUPPORTED_DEVICES is the single catalog export for apps that need both display
metadata and integration declarations. Every entry has:
type SupportedDeviceDefinition = {
id: string;
name: string;
nameKey: string;
manufacturer: string;
manufacturerKey: string;
logo: string;
creditsForImage: string;
acceptedDevices: readonly AcceptedDevice[];
measurementTypes: readonly MeasurementTypeKey[];
manualUrl?: string;
};
nameKey and manufacturerKey are localization keys. The English strings are
fallback metadata; applications can translate the keys without changing the
protocol declaration. logo is a local/remote image value selected by the SDK,
and creditsForImage is the exact source/credit text to show beside it.
Use the catalog
import {
SUPPORTED_ACCEPTED_DEVICES,
SUPPORTED_DEVICES,
} from "@ovok/native/bt-device";
const allAcceptedDevices = SUPPORTED_ACCEPTED_DEVICES;
const catalogForPicker = SUPPORTED_DEVICES;
<BTProvider
bleManager={bleManager}
acceptedDevices={allAcceptedDevices}
onDeviceFound={(device) => device.connect()}
/>;
Use one entry's acceptedDevices when an app supports a single model or family:
const bp3 = SUPPORTED_DEVICES.find(
(device) => device.name === "Viatom BP3 series",
);
const acceptedDevices = bp3?.acceptedDevices ?? [];
The app should keep the tuple narrow when it knows the intended device. Passing the whole list is supported, but increases matching and selection work.
Current families
The catalog covers the built-in identities and declarations for:
- Lepu/Viatom BP2, BP2A/BP2T/BP2W, BP3 names, F4/Lescale, O2Ring/Oxyfit/KidsO2/BabyO2, R20/R200 sleep-therapy models, ER1/ER2/ER3, Lepod, and LepodPro model names;
- Contec BC401/BC01, TaiDoc glucose and thermometer models, GlucoCheck, BGM, FORA IR20 and W550, Transtek GBS-2012-B, Andesfit TEMP, cosinuss° devices, cmed, PULMO80B, Le S5, and AliveCor;
- AOJ-20A, boso medicus system, visomat comfort soft BT, cyclotest mySense, and HARTMANN Veroval duo control, compact+ BPU26/BPW26, ECG, and Activity;
- standard Bluetooth SIG blood-pressure, heart-rate, pulse-oximeter, thermometer, and weight-scale profile factories.
The catalog entry tells an app what the SDK can identify and decode. A family row does not promise that an unknown firmware payload is understood; the exact model matcher and decoder remain the source of truth.
Clock synchronization
Every discovered device reports a clockSync capability in deviceData:
| Capability | Meaning |
|---|---|
supported | The SDK has a verified, device-specific clock write. |
unsupported | The device is known not to have a verified clock write in the SDK. |
unknown | The SDK must not send a clock command because the protocol is not verified. |
Clock writes are opt-in by device and enabled by default only for verified protocols.
The BTProvider option below supplies one clock source and an explicit timezone policy:
<BTProvider
bleManager={bleManager}
acceptedDevices={acceptedDevices}
clockSync={{
now: () => new Date(),
timezone: "utc",
enabled: true,
}}
/>
Set enabled: false to skip optional verified clock writes. This does not change
history download. cyclotest mySense is the exception: its verified greeting carries
the timestamp required to start the history exchange, so the greeting remains intact
when synchronization is disabled. The SDK never sends a guessed date command to a
device whose capability is unknown or unsupported, and it never rewrites the
timezone of historical records.
The verified writes happen at these points:
| Device | When the write happens | App guidance |
|---|---|---|
| Contec BC401 / BC01 | After the version reply and before the history count request | Keep enabled when the device clock should be corrected. |
| cyclotest mySense | In the required greeting before history acknowledgement | The greeting cannot be removed without changing the protocol exchange. |
| Viatom O2Ring | Before the device-information request | Only the exact O2Ring declaration opts into this command; other Viatom oximeters remain unknown. |
| Viatom R20 / R200 | Before the one-shot therapy-parameter request | Sends the verified Ventilator clock command; the returned parameter snapshot has no device timestamp and is dated when received. |
| HARTMANN Veroval Activity | No verified write | Treat history as read-only and use the reported reading dates as received. |
| Other devices | No verified write in the SDK | Do not attempt a generic Bluetooth clock command. |
Veroval Activity transport
The Veroval Activity integration matches the private service
2610fc00-494d-494c-4544-55544954414c, so discovery does not depend on the
advertised model name. Its verified characteristics are:
| Characteristic | Role |
|---|---|
2610fc01-494d-494c-4544-55544954414c | Encrypted bonding command |
2610fc02-494d-494c-4544-55544954414c | Token, summary, daily, and minute commands |
2610fc03-494d-494c-4544-55544954414c | Encrypted history notifications |
2610fc04-494d-494c-4544-55544954414c | Secondary notifications; subscribed but not parsed |
The bonding command is sent only to FC01; all other requests use FC02. FC01
does not emit a protocol acknowledgement on FC03, so the summary request follows
the successful transport write directly. Notifications use the device's encrypted
chunk format and end at FF FF. Daily records are 32 bytes, and the minute response
starts with an eight-byte empty sentinel before its compressed records. The FC04
subscription is optional at the device level, so peripherals that do not emit it
continue to work. The current public result contract reports step-count and
heart-rate history only.
Veroval duo control history measurements also expose the device metadata
memorySlot (1 or 2) and recordedAt. recordedAt is the timestamp stored
in the monitor, so applications can preserve the measurement time instead of
using the download time.
Images and credits
Do not remove creditsForImage when building a custom picker. Render the image and
the exact credit together, and keep the catalog's attribution URL/text intact. The
catalog uses official manufacturer/product pages where available and a Bluetooth
SIG brand asset for generic profile rows. It does not claim that a generic profile
image is the image of a particular manufacturer's device.
Manuals and unsupported products
manualUrl is present only when the SDK has an official manual reference. A product
not present in the catalog can still be integrated by declaring it with
defineCustomDevice. A custom declaration is app-owned and
must not reuse a built-in id or pretend that a family image proves protocol support.