@tempivo/sensor-beacon
v0.1.1
Published
Tempivo sensor BLE beacon SDK: TypeScript decoder plus iOS and Android scan libraries. Advertising only, no GATT.
Maintainers
Readme
@tempivo/sensor-beacon
Tempivo partner SDK for BLE advertising from Tempivo sensors (manufacturer id 0x026C). No GATT connection.
One npm package:
| Path | Use |
|------|-----|
| dist/ | Node / TypeScript decoder |
| android/ + dist/tempivo-sensor-beacon.aar | Android scan + decode |
| ios/ | iOS Swift Package (scan + decode) |
npm install @tempivo/sensor-beaconNode / TypeScript
Node.js 18+. Import from the package root:
import {
TEMPVO_SENSOR_MANUFACTURER_ID,
normalizeManufacturerBytes,
decodeSensorBeaconPayload,
} from '@tempivo/sensor-beacon';
const reading = decodeSensorBeaconPayload(normalizeManufacturerBytes(rawBytes));Many stacks return manufacturer bytes without the 2-byte company id (6C 02). Use normalizeManufacturerBytes when needed.
Frame cache (0x03 + 0x04)
FW6 devices split meta (advertisement) and measurements (scan response):
import {
createSensorBeaconFrameCache,
ingestManufacturerPayload,
buildSensorBeaconReading,
macKeyFromAddress,
} from '@tempivo/sensor-beacon';
const cache = createSensorBeaconFrameCache();
const macKey = macKeyFromAddress('28:2C:02:4F:00:12');
ingestManufacturerPayload(advPayload, macKey, cache);
ingestManufacturerPayload(scanPayload, macKey, cache);
const reading = buildSensorBeaconReading(cache.last03.get(macKey), cache.last04.get(macKey));TypeScript API
| Export | Purpose |
|--------|---------|
| TEMPVO_SENSOR_MANUFACTURER_ID | BLE company id 0x026c |
| normalizeManufacturerBytes | Strip company id prefix when present |
| decodeSensorBeaconPayload | One-shot decode |
| ingestManufacturerPayload | Update frame cache |
| buildSensorBeaconReading | Merge cached frames |
| SensorBeaconReading | Parsed device + measurements |
Measurement types 0x01–0x22 decode to human-readable text on each slot.
Android
Published artifact: dist/tempivo-sensor-beacon.aar (built before npm publish).
// app/build.gradle.kts
dependencies {
implementation(
files(
"${rootProject.projectDir}/../node_modules/@tempivo/sensor-beacon/dist/tempivo-sensor-beacon.aar",
),
)
}Adjust the path to your node_modules layout.
import com.tempivo.sensor.beacon.TempivoSensorBeaconScanner
val scanner = TempivoSensorBeaconScanner(context)
scanner.startScan { device ->
// device.serialNumber, device.rssi, device.telemetry, device.summary
}Declare and request BLUETOOTH_SCAN (API 31+) or location permissions for legacy APIs.
iOS
- File → Add Package Dependencies… → Add Local…
- Path:
node_modules/@tempivo/sensor-beacon/ios - Add product TempivoSensorBeacon
- Set
NSBluetoothAlwaysUsageDescriptionin Info.plist
import TempivoSensorBeacon
final class ScanHost: NSObject, TempivoSensorBeaconScannerDelegate {
private let scanner = TempivoSensorBeaconScanner()
override init() {
super.init()
scanner.delegate = self
}
func start() { scanner.startScanning() }
func sensorBeaconScanner(_ scanner: TempivoSensorBeaconScanner, didDiscover discovery: SensorBeaconDiscovery) {
print(discovery.serialNumber ?? discovery.deviceId, discovery.reading?.summary ?? "")
}
}Requires iOS 15+. Use a physical device for BLE.
Build locally
npm run build:ts # dist/ only
npm run build:android # requires Android SDK
npm run build:all # bothLicense
MIT
