@tempivo/sensor-beacon 0.1.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +222 -78
- package/android/build.gradle +38 -2
- package/android/src/main/AndroidManifest.xml +10 -0
- package/android/src/main/java/expo/modules/tempivosensorbeacon/SensorBeaconNative.java +233 -0
- package/android/src/main/java/expo/modules/tempivosensorbeacon/TempivoSensorBeaconModule.kt +122 -0
- package/android-aar/build.gradle +4 -0
- package/{android → android-aar}/library/build.gradle +3 -0
- package/android-aar/library/src/main/java/com/tempivo/sensor/beacon/PartnerBleRules.kt +279 -0
- package/android-aar/library/src/main/java/com/tempivo/sensor/beacon/SensorBleRuntime.kt +168 -0
- package/{android → android-aar}/library/src/main/java/com/tempivo/sensor/beacon/TempivoSensorBeaconDecoder.kt +6 -23
- package/{android → android-aar}/library/src/main/java/com/tempivo/sensor/beacon/TempivoSensorBeaconScanner.kt +0 -2
- package/{android → android-aar}/library/src/main/java/com/tempivo/sensor/beacon/TempivoSensorBeaconTypes.kt +2 -4
- package/android-aar/library/src/main/java/com/tempivo/sensor/beacon/TempivoSensorCalibration.kt +36 -0
- package/android-aar/library/src/main/java/com/tempivo/sensor/beacon/TempivoSensorError.kt +18 -0
- package/android-aar/library/src/main/java/com/tempivo/sensor/beacon/TempivoSensorProfile.kt +171 -0
- package/android-aar/library/src/main/java/com/tempivo/sensor/beacon/TempivoSensorQr.kt +82 -0
- package/android-aar/library/src/main/java/com/tempivo/sensor/beacon/TempivoSensorSession.kt +127 -0
- package/{android → android-aar}/settings.gradle +1 -0
- package/app.plugin.cjs +142 -0
- package/dist/calibration.d.ts +7 -0
- package/dist/calibration.js +42 -0
- package/dist/decoder.js +4 -12
- package/dist/errors.d.ts +6 -0
- package/dist/errors.js +8 -0
- package/dist/expo-modules-core.web-stub.d.ts +5 -0
- package/dist/expo-modules-core.web-stub.js +9 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.js +6 -1
- package/dist/native-bridge.d.ts +14 -0
- package/dist/native-bridge.js +51 -0
- package/dist/native-helpers.d.ts +5 -0
- package/dist/native-helpers.js +33 -0
- package/dist/native-module.d.ts +14 -0
- package/dist/native-module.js +104 -0
- package/dist/native-types.d.ts +41 -0
- package/dist/native-types.js +1 -0
- package/dist/profile.d.ts +10 -0
- package/dist/profile.js +226 -0
- package/dist/qr.d.ts +16 -0
- package/dist/qr.js +90 -0
- package/dist/react-native.d.ts +1 -0
- package/dist/react-native.js +1 -0
- package/dist/session-types.d.ts +64 -0
- package/dist/session-types.js +1 -0
- package/dist/tempivo-sensor-beacon.aar +0 -0
- package/dist/types.d.ts +3 -3
- package/expo-module.config.json +12 -0
- package/ios/Frameworks/TempivoSensorBridge.xcframework/Info.plist +43 -0
- package/ios/Frameworks/TempivoSensorBridge.xcframework/ios-arm64/TempivoSensorBridge.framework/Headers/TempivoSensorBridge.h +159 -0
- package/ios/Frameworks/TempivoSensorBridge.xcframework/ios-arm64/TempivoSensorBridge.framework/Info.plist +35 -0
- package/ios/Frameworks/TempivoSensorBridge.xcframework/ios-arm64/TempivoSensorBridge.framework/Modules/module.modulemap +8 -0
- package/ios/Frameworks/TempivoSensorBridge.xcframework/ios-arm64/TempivoSensorBridge.framework/TempivoSensorBridge +0 -0
- package/ios/Frameworks/TempivoSensorBridge.xcframework/ios-arm64-simulator/TempivoSensorBridge.framework/Headers/TempivoSensorBridge.h +159 -0
- package/ios/Frameworks/TempivoSensorBridge.xcframework/ios-arm64-simulator/TempivoSensorBridge.framework/Info.plist +31 -0
- package/ios/Frameworks/TempivoSensorBridge.xcframework/ios-arm64-simulator/TempivoSensorBridge.framework/Modules/module.modulemap +8 -0
- package/ios/Frameworks/TempivoSensorBridge.xcframework/ios-arm64-simulator/TempivoSensorBridge.framework/TempivoSensorBridge +0 -0
- package/ios/Sources/TempivoSensorBeacon/TempivoSensorBeaconDecoder.swift +4 -8
- package/ios/Sources/TempivoSensorBeacon/TempivoSensorBeaconTypes.swift +3 -6
- package/ios/Sources/TempivoSensorBeacon/TempivoSensorCalibration.swift +22 -0
- package/ios/Sources/TempivoSensorBeacon/TempivoSensorError.swift +24 -0
- package/ios/Sources/TempivoSensorBeacon/TempivoSensorProfile.swift +123 -0
- package/ios/Sources/TempivoSensorBeacon/TempivoSensorQr.swift +78 -0
- package/ios/Sources/TempivoSensorBeacon/TempivoSensorSession.swift +161 -0
- package/ios/Sources/TempivoSensorBeacon/TempivoSensorSessionTypes.swift +93 -0
- package/ios/TempivoSensorBeacon.podspec +35 -0
- package/ios/TempivoSensorBeaconModule.swift +208 -0
- package/package.json +55 -7
- /package/{android → android-aar}/gradle/wrapper/gradle-wrapper.jar +0 -0
- /package/{android → android-aar}/gradle/wrapper/gradle-wrapper.properties +0 -0
- /package/{android → android-aar}/gradle.properties +0 -0
- /package/{android → android-aar}/gradlew +0 -0
- /package/{android → android-aar}/library/consumer-rules.pro +0 -0
- /package/{android → android-aar}/library/src/main/AndroidManifest.xml +0 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import CoreBluetooth
|
|
2
|
+
import ExpoModulesCore
|
|
3
|
+
|
|
4
|
+
public class TempivoSensorBeaconModule: Module, TempivoSensorBeaconScannerDelegate {
|
|
5
|
+
private var scanner: TempivoSensorBeaconScanner?
|
|
6
|
+
private let session = TempivoSensorSession()
|
|
7
|
+
|
|
8
|
+
public func definition() -> ModuleDefinition {
|
|
9
|
+
Name("TempivoSensorBeacon")
|
|
10
|
+
Events("onDeviceFound")
|
|
11
|
+
|
|
12
|
+
AsyncFunction("requestPermissions") { () -> [String: Any] in
|
|
13
|
+
_ = self.requireScanner()
|
|
14
|
+
return self.permissionPayload()
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
AsyncFunction("startScan") {
|
|
18
|
+
self.requireScanner().startScanning()
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
Function("stopScan") {
|
|
22
|
+
self.scanner?.stopScanning()
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
Function("isScanning") { () -> Bool in
|
|
26
|
+
self.scanner?.scanning ?? false
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
AsyncFunction("connect") { (qrJson: String) -> [String: Any] in
|
|
30
|
+
do {
|
|
31
|
+
let qr = try TempivoSensorQrParser.parse(qrJson)
|
|
32
|
+
try self.session.connect(qr: qr)
|
|
33
|
+
return self.qrPayload(qr)
|
|
34
|
+
} catch {
|
|
35
|
+
throw self.mapError(error)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
AsyncFunction("disconnect") {
|
|
40
|
+
self.session.disconnect()
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
AsyncFunction("getConfigurationJson") { () -> String in
|
|
44
|
+
do {
|
|
45
|
+
return try self.session.getConfigurationJson()
|
|
46
|
+
} catch {
|
|
47
|
+
throw self.mapError(error)
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
AsyncFunction("setConfigurationJson") { (json: String) in
|
|
52
|
+
do {
|
|
53
|
+
try self.session.setConfigurationJson(json)
|
|
54
|
+
} catch {
|
|
55
|
+
throw self.mapError(error)
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
AsyncFunction("triggerTransmission") { () -> [String: Any] in
|
|
60
|
+
do {
|
|
61
|
+
let result = try self.session.triggerTransmission()
|
|
62
|
+
return ["ok": result.ok, "supported": result.supported]
|
|
63
|
+
} catch {
|
|
64
|
+
throw self.mapError(error)
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
AsyncFunction("getCalibration") { () -> [String: Any] in
|
|
69
|
+
do {
|
|
70
|
+
let cal = try self.session.getCalibration()
|
|
71
|
+
var payload: [String: Any] = [:]
|
|
72
|
+
if let date = cal.laboratoryCalibrationDate {
|
|
73
|
+
payload["laboratoryCalibrationDate"] = date
|
|
74
|
+
}
|
|
75
|
+
if let ts = cal.laboratoryCalibrationTimestamp {
|
|
76
|
+
payload["laboratoryCalibrationTimestamp"] = Int(ts)
|
|
77
|
+
}
|
|
78
|
+
return payload
|
|
79
|
+
} catch {
|
|
80
|
+
throw self.mapError(error)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
OnDestroy {
|
|
85
|
+
self.scanner?.stopScanning()
|
|
86
|
+
self.session.disconnect()
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
public func sensorBeaconScanner(
|
|
91
|
+
_ scanner: TempivoSensorBeaconScanner,
|
|
92
|
+
didDiscover discovery: SensorBeaconDiscovery
|
|
93
|
+
) {
|
|
94
|
+
sendEvent("onDeviceFound", devicePayload(discovery))
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
private func requireScanner() -> TempivoSensorBeaconScanner {
|
|
98
|
+
if let scanner {
|
|
99
|
+
return scanner
|
|
100
|
+
}
|
|
101
|
+
let created = TempivoSensorBeaconScanner()
|
|
102
|
+
created.delegate = self
|
|
103
|
+
scanner = created
|
|
104
|
+
return created
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private func permissionPayload() -> [String: Any] {
|
|
108
|
+
if #available(iOS 13.1, *) {
|
|
109
|
+
let status = CBManager.authorization
|
|
110
|
+
let granted = status == .allowedAlways
|
|
111
|
+
let statusName: String
|
|
112
|
+
switch status {
|
|
113
|
+
case .allowedAlways: statusName = "granted"
|
|
114
|
+
case .notDetermined: statusName = "undetermined"
|
|
115
|
+
default: statusName = "denied"
|
|
116
|
+
}
|
|
117
|
+
return [
|
|
118
|
+
"granted": granted,
|
|
119
|
+
"status": statusName,
|
|
120
|
+
"canAskAgain": status == .notDetermined,
|
|
121
|
+
"expires": "never",
|
|
122
|
+
]
|
|
123
|
+
}
|
|
124
|
+
return [
|
|
125
|
+
"granted": true,
|
|
126
|
+
"status": "granted",
|
|
127
|
+
"canAskAgain": true,
|
|
128
|
+
"expires": "never",
|
|
129
|
+
]
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
private func qrPayload(_ qr: TempivoSensorQr) -> [String: Any] {
|
|
133
|
+
var payload: [String: Any] = [
|
|
134
|
+
"serial": qr.serial,
|
|
135
|
+
"pin": qr.pin,
|
|
136
|
+
"sessionType": qr.sessionType.rawValue,
|
|
137
|
+
"bluetoothMac": qr.bluetoothMac,
|
|
138
|
+
]
|
|
139
|
+
if let model = qr.model {
|
|
140
|
+
payload["model"] = model
|
|
141
|
+
}
|
|
142
|
+
return payload
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
private func devicePayload(_ discovery: SensorBeaconDiscovery) -> [String: Any] {
|
|
146
|
+
var payload: [String: Any] = [
|
|
147
|
+
"deviceId": discovery.deviceId,
|
|
148
|
+
"rssi": discovery.rssi,
|
|
149
|
+
]
|
|
150
|
+
if let serial = discovery.serialNumber {
|
|
151
|
+
payload["serialNumber"] = serial
|
|
152
|
+
}
|
|
153
|
+
if let mac = discovery.bluetoothMacAddress {
|
|
154
|
+
payload["bluetoothMacAddress"] = mac
|
|
155
|
+
}
|
|
156
|
+
if let reading = discovery.reading {
|
|
157
|
+
payload["summary"] = reading.summary
|
|
158
|
+
payload["telemetry"] = telemetryPayload(reading)
|
|
159
|
+
}
|
|
160
|
+
return payload
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
private func telemetryPayload(_ reading: SensorBeaconReading) -> [String: Any] {
|
|
164
|
+
var payload: [String: Any] = [
|
|
165
|
+
"readingsCount": reading.readingsCount,
|
|
166
|
+
"summary": reading.summary,
|
|
167
|
+
"readings": reading.readings.map { slot in
|
|
168
|
+
[
|
|
169
|
+
"typeHex": slot.typeHex,
|
|
170
|
+
"raw24": slot.raw24,
|
|
171
|
+
"text": slot.text,
|
|
172
|
+
] as [String: Any]
|
|
173
|
+
},
|
|
174
|
+
]
|
|
175
|
+
if let firmware = reading.firmware { payload["firmware"] = firmware }
|
|
176
|
+
if let batteryOk = reading.batteryOk { payload["batteryOk"] = batteryOk }
|
|
177
|
+
if let encryptionEnabled = reading.encryptionEnabled { payload["encryptionEnabled"] = encryptionEnabled }
|
|
178
|
+
if let cellularStatus = reading.cellularStatus { payload["cellularStatus"] = cellularStatus }
|
|
179
|
+
if let measurementCounter = reading.measurementCounter { payload["measurementCounter"] = measurementCounter }
|
|
180
|
+
if let readingTimestampUnix = reading.readingTimestampUnix { payload["readingTimestampUnix"] = readingTimestampUnix }
|
|
181
|
+
if let readingTimestampIso = reading.readingTimestampIso { payload["readingTimestampIso"] = readingTimestampIso }
|
|
182
|
+
if let measurementIntervalSeconds = reading.measurementIntervalSeconds {
|
|
183
|
+
payload["measurementIntervalSeconds"] = measurementIntervalSeconds
|
|
184
|
+
}
|
|
185
|
+
return payload
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
private func mapError(_ error: Error) -> SensorBeaconException {
|
|
189
|
+
if let sensor = error as? TempivoSensorError {
|
|
190
|
+
return SensorBeaconException(code: sensor.code.rawValue, reason: sensor.message)
|
|
191
|
+
}
|
|
192
|
+
return SensorBeaconException(code: "unknown", reason: error.localizedDescription)
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
internal final class SensorBeaconException: Exception {
|
|
197
|
+
private let customCode: String
|
|
198
|
+
private let customReason: String
|
|
199
|
+
|
|
200
|
+
init(code: String, reason: String) {
|
|
201
|
+
self.customCode = code
|
|
202
|
+
self.customReason = reason
|
|
203
|
+
super.init()
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
override var code: String { customCode }
|
|
207
|
+
override var reason: String { customReason }
|
|
208
|
+
}
|
package/package.json
CHANGED
|
@@ -1,20 +1,38 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tempivo/sensor-beacon",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Tempivo sensor BLE
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Tempivo sensor BLE SDK for Expo, React Native, Android, iOS, and Node.",
|
|
5
5
|
"homepage": "https://app.tempivo.com/integrations",
|
|
6
|
+
"author": "Tempivo",
|
|
6
7
|
"type": "module",
|
|
7
8
|
"main": "dist/index.js",
|
|
8
9
|
"types": "dist/index.d.ts",
|
|
10
|
+
"react-native": "./dist/react-native.js",
|
|
9
11
|
"exports": {
|
|
10
12
|
".": {
|
|
13
|
+
"react-native": {
|
|
14
|
+
"types": "./dist/react-native.d.ts",
|
|
15
|
+
"default": "./dist/react-native.js"
|
|
16
|
+
},
|
|
11
17
|
"types": "./dist/index.d.ts",
|
|
12
|
-
"import": "./dist/index.js"
|
|
13
|
-
|
|
18
|
+
"import": "./dist/index.js",
|
|
19
|
+
"default": "./dist/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./react-native": {
|
|
22
|
+
"types": "./dist/react-native.d.ts",
|
|
23
|
+
"default": "./dist/react-native.js"
|
|
24
|
+
},
|
|
25
|
+
"./app.plugin": "./app.plugin.cjs",
|
|
26
|
+
"./app.plugin.js": "./app.plugin.cjs",
|
|
27
|
+
"./app.plugin.cjs": "./app.plugin.cjs",
|
|
28
|
+
"./package.json": "./package.json"
|
|
14
29
|
},
|
|
15
30
|
"files": [
|
|
31
|
+
"app.plugin.cjs",
|
|
16
32
|
"dist",
|
|
17
33
|
"android",
|
|
34
|
+
"android-aar",
|
|
35
|
+
"expo-module.config.json",
|
|
18
36
|
"ios",
|
|
19
37
|
"LICENSE",
|
|
20
38
|
"README.md"
|
|
@@ -29,21 +47,51 @@
|
|
|
29
47
|
"build": "npm run build:ts",
|
|
30
48
|
"build:ts": "tsc",
|
|
31
49
|
"build:android": "node scripts/build-aar.mjs",
|
|
50
|
+
"build:ios-bridge": "bash scripts/build-ios-bridge.sh && node scripts/copy-ios-bridge.mjs",
|
|
51
|
+
"copy:ios-bridge": "node scripts/copy-ios-bridge.mjs",
|
|
32
52
|
"build:all": "npm run build:ts && npm run build:android",
|
|
33
|
-
"
|
|
34
|
-
"
|
|
53
|
+
"prepare": "npm run build:ts",
|
|
54
|
+
"test": "npm run test:all",
|
|
55
|
+
"test:unit": "node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.mjs",
|
|
56
|
+
"test:python": "PYTHONPATH=python python3 -m pytest python/tests -q",
|
|
57
|
+
"test:all": "npm run test:unit && npm run test:python",
|
|
58
|
+
"test:smoke": "node scripts/smoke-test.mjs",
|
|
59
|
+
"prepublishOnly": "npm run build:all && npm run copy:ios-bridge"
|
|
35
60
|
},
|
|
36
61
|
"keywords": [
|
|
37
62
|
"tempivo",
|
|
38
63
|
"ble",
|
|
39
64
|
"bluetooth",
|
|
40
65
|
"beacon",
|
|
66
|
+
"gatt",
|
|
41
67
|
"sensor",
|
|
42
68
|
"manufacturer-data",
|
|
43
69
|
"android",
|
|
44
|
-
"ios"
|
|
70
|
+
"ios",
|
|
71
|
+
"expo",
|
|
72
|
+
"react-native"
|
|
45
73
|
],
|
|
46
74
|
"license": "MIT",
|
|
75
|
+
"peerDependencies": {
|
|
76
|
+
"expo": "*",
|
|
77
|
+
"expo-modules-core": "*",
|
|
78
|
+
"react": "*",
|
|
79
|
+
"react-native": "*"
|
|
80
|
+
},
|
|
81
|
+
"peerDependenciesMeta": {
|
|
82
|
+
"expo": {
|
|
83
|
+
"optional": true
|
|
84
|
+
},
|
|
85
|
+
"expo-modules-core": {
|
|
86
|
+
"optional": true
|
|
87
|
+
},
|
|
88
|
+
"react": {
|
|
89
|
+
"optional": true
|
|
90
|
+
},
|
|
91
|
+
"react-native": {
|
|
92
|
+
"optional": true
|
|
93
|
+
}
|
|
94
|
+
},
|
|
47
95
|
"devDependencies": {
|
|
48
96
|
"@types/jest": "^29.5.14",
|
|
49
97
|
"jest": "^29.7.0",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|