react-native-ble-manager 8.7.0 → 9.0.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 +96 -47
- package/android/.gradle/7.4/checksums/checksums.lock +0 -0
- package/android/.gradle/7.4/dependencies-accessors/dependencies-accessors.lock +0 -0
- package/android/.gradle/7.4/dependencies-accessors/gc.properties +0 -0
- package/android/.gradle/7.4/executionHistory/executionHistory.bin +0 -0
- package/android/.gradle/7.4/executionHistory/executionHistory.lock +0 -0
- package/android/.gradle/7.4/fileChanges/last-build.bin +0 -0
- package/android/.gradle/7.4/fileHashes/fileHashes.bin +0 -0
- package/android/.gradle/7.4/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/7.4/fileHashes/resourceHashesCache.bin +0 -0
- package/android/.gradle/7.4/gc.properties +0 -0
- package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
- package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
- package/android/.gradle/file-system.probe +0 -0
- package/android/.gradle/vcs-1/gc.properties +0 -0
- package/android/.idea/.name +1 -0
- package/android/.idea/compiler.xml +6 -0
- package/android/.idea/gradle.xml +18 -0
- package/android/.idea/jarRepositories.xml +40 -0
- package/android/.idea/misc.xml +10 -0
- package/android/.idea/vcs.xml +6 -0
- package/android/build.gradle +17 -17
- package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +5 -0
- package/android/gradle.properties +3 -1
- package/android/gradlew +234 -0
- package/android/gradlew.bat +89 -0
- package/android/local.properties +8 -0
- package/android/src/main/java/it/innove/BleManager.java +33 -17
- package/android/src/main/java/it/innove/LegacyScanManager.java +33 -28
- package/android/src/main/java/it/innove/LollipopPeripheral.java +66 -65
- package/android/src/main/java/it/innove/LollipopScanManager.java +52 -25
- package/android/src/main/java/it/innove/Peripheral.java +889 -837
- package/android/src/main/java/it/innove/ScanManager.java +24 -23
- package/dist/cjs/index.d.ts +147 -0
- package/dist/cjs/index.js +487 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/types.d.ts +311 -0
- package/dist/cjs/types.js +110 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/index.d.ts +147 -0
- package/dist/esm/index.js +471 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/types.d.ts +311 -0
- package/dist/esm/types.js +107 -0
- package/dist/esm/types.js.map +1 -0
- package/ios/BleManager.m +87 -110
- package/ios/BleManager.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/package.json +31 -4
- package/src/index.ts +569 -0
- package/src/types.ts +336 -0
- package/.github/FUNDING.yml +0 -3
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
- package/BleManager.js +0 -427
- package/index.d.ts +0 -168
|
@@ -5,6 +5,7 @@ import android.bluetooth.le.ScanRecord;
|
|
|
5
5
|
import android.bluetooth.le.ScanResult;
|
|
6
6
|
import android.os.Build;
|
|
7
7
|
import android.os.ParcelUuid;
|
|
8
|
+
|
|
8
9
|
import androidx.annotation.RequiresApi;
|
|
9
10
|
|
|
10
11
|
import com.facebook.react.bridge.Arguments;
|
|
@@ -18,76 +19,76 @@ import java.util.Map;
|
|
|
18
19
|
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
|
|
19
20
|
public class LollipopPeripheral extends Peripheral {
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
22
|
+
private ScanRecord advertisingData;
|
|
23
|
+
private ScanResult scanResult;
|
|
24
|
+
|
|
25
|
+
public LollipopPeripheral(ReactContext reactContext, ScanResult result) {
|
|
26
|
+
super(result.getDevice(), result.getRssi(), result.getScanRecord().getBytes(), reactContext);
|
|
27
|
+
this.advertisingData = result.getScanRecord();
|
|
28
|
+
this.scanResult = result;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public LollipopPeripheral(BluetoothDevice device, ReactApplicationContext reactContext) {
|
|
32
|
+
super(device, reactContext);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@Override
|
|
36
|
+
public WritableMap asWritableMap() {
|
|
37
|
+
WritableMap map = super.asWritableMap();
|
|
38
|
+
WritableMap advertising = Arguments.createMap();
|
|
39
|
+
|
|
40
|
+
try {
|
|
41
|
+
advertising.putMap("manufacturerData", byteArrayToWritableMap(advertisingDataBytes));
|
|
42
|
+
|
|
43
|
+
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
44
|
+
// We can check if peripheral is connectable using the scanresult
|
|
45
|
+
if (this.scanResult != null) {
|
|
46
|
+
advertising.putBoolean("isConnectable", scanResult.isConnectable());
|
|
47
|
+
}
|
|
48
|
+
} else {
|
|
49
|
+
// We can't check if peripheral is connectable
|
|
50
|
+
advertising.putBoolean("isConnectable", true);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
if (advertisingData != null) {
|
|
55
|
+
String deviceName = advertisingData.getDeviceName();
|
|
56
|
+
if (deviceName != null)
|
|
57
|
+
advertising.putString("localName", deviceName.replace("\0", ""));
|
|
58
|
+
|
|
59
|
+
WritableArray serviceUuids = Arguments.createArray();
|
|
60
|
+
if (advertisingData.getServiceUuids() != null && advertisingData.getServiceUuids().size() != 0) {
|
|
61
|
+
for (ParcelUuid uuid : advertisingData.getServiceUuids()) {
|
|
62
|
+
serviceUuids.pushString(UUIDHelper.uuidToString(uuid.getUuid()));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
advertising.putArray("serviceUUIDs", serviceUuids);
|
|
66
|
+
|
|
67
|
+
WritableMap serviceData = Arguments.createMap();
|
|
68
|
+
if (advertisingData.getServiceData() != null) {
|
|
69
|
+
for (Map.Entry<ParcelUuid, byte[]> entry : advertisingData.getServiceData().entrySet()) {
|
|
70
|
+
if (entry.getValue() != null) {
|
|
71
|
+
serviceData.putMap(UUIDHelper.uuidToString((entry.getKey()).getUuid()), byteArrayToWritableMap(entry.getValue()));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
74
75
|
|
|
75
76
|
advertising.putMap("serviceData", serviceData);
|
|
76
|
-
|
|
77
|
-
|
|
77
|
+
advertising.putInt("txPowerLevel", advertisingData.getTxPowerLevel());
|
|
78
|
+
}
|
|
78
79
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
80
|
+
map.putMap("advertising", advertising);
|
|
81
|
+
} catch (Exception e) { // this shouldn't happen
|
|
82
|
+
e.printStackTrace();
|
|
83
|
+
}
|
|
83
84
|
|
|
84
|
-
|
|
85
|
-
|
|
85
|
+
return map;
|
|
86
|
+
}
|
|
86
87
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
88
|
+
public void updateData(ScanResult result) {
|
|
89
|
+
advertisingData = result.getScanRecord();
|
|
90
|
+
advertisingDataBytes = advertisingData.getBytes();
|
|
91
|
+
}
|
|
91
92
|
|
|
92
93
|
|
|
93
94
|
}
|
|
@@ -88,11 +88,19 @@ public class LollipopScanManager extends ScanManager {
|
|
|
88
88
|
for (int i = 0; i < serviceUUIDs.size(); i++) {
|
|
89
89
|
ScanFilter filter = new ScanFilter.Builder().setServiceUuid(new ParcelUuid(UUIDHelper.uuidFromString(serviceUUIDs.getString(i)))).build();
|
|
90
90
|
filters.add(filter);
|
|
91
|
-
Log.d(
|
|
91
|
+
Log.d(BleManager.LOG_TAG, "Filter service: " + serviceUUIDs.getString(i));
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
+
if (options.hasKey("exactAdvertisingName")) {
|
|
96
|
+
String expectedName = options.getString("exactAdvertisingName");
|
|
97
|
+
Log.d(BleManager.LOG_TAG, "Filter on advertising name:" + expectedName);
|
|
98
|
+
ScanFilter filter = new ScanFilter.Builder().setDeviceName(expectedName).build();
|
|
99
|
+
filters.add(filter);
|
|
100
|
+
}
|
|
101
|
+
|
|
95
102
|
getBluetoothAdapter().getBluetoothLeScanner().startScan(filters, scanSettingsBuilder.build(), mScanCallback);
|
|
103
|
+
|
|
96
104
|
if (scanSeconds > 0) {
|
|
97
105
|
Thread thread = new Thread() {
|
|
98
106
|
private int currentScanSession = scanSessionId.incrementAndGet();
|
|
@@ -109,11 +117,13 @@ public class LollipopScanManager extends ScanManager {
|
|
|
109
117
|
@Override
|
|
110
118
|
public void run() {
|
|
111
119
|
BluetoothAdapter btAdapter = getBluetoothAdapter();
|
|
120
|
+
|
|
112
121
|
// check current scan session was not stopped
|
|
113
122
|
if (scanSessionId.intValue() == currentScanSession) {
|
|
114
123
|
if (btAdapter.getState() == BluetoothAdapter.STATE_ON) {
|
|
115
124
|
btAdapter.getBluetoothLeScanner().stopScan(mScanCallback);
|
|
116
125
|
}
|
|
126
|
+
|
|
117
127
|
WritableMap map = Arguments.createMap();
|
|
118
128
|
map.putInt("status", 10);
|
|
119
129
|
bleManager.sendEvent("BleManagerStopScan", map);
|
|
@@ -129,41 +139,58 @@ public class LollipopScanManager extends ScanManager {
|
|
|
129
139
|
callback.invoke();
|
|
130
140
|
}
|
|
131
141
|
|
|
132
|
-
private
|
|
142
|
+
private void onDiscoveredPeripheral(final ScanResult result) {
|
|
143
|
+
String info;
|
|
144
|
+
ScanRecord record = result.getScanRecord();
|
|
145
|
+
|
|
146
|
+
if (record != null) {
|
|
147
|
+
info = record.getDeviceName();
|
|
148
|
+
} else if (ActivityCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED) {
|
|
149
|
+
info = result.getDevice().getName();
|
|
150
|
+
} else {
|
|
151
|
+
info = result.toString();
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
Log.i(BleManager.LOG_TAG, "DiscoverPeripheral: " + info);
|
|
155
|
+
|
|
156
|
+
LollipopPeripheral peripheral = (LollipopPeripheral) bleManager.getPeripheral(result.getDevice());
|
|
157
|
+
if (peripheral == null) {
|
|
158
|
+
peripheral = new LollipopPeripheral(bleManager.getReactContext(), result);
|
|
159
|
+
} else {
|
|
160
|
+
peripheral.updateData(result);
|
|
161
|
+
peripheral.updateRssi(result.getRssi());
|
|
162
|
+
}
|
|
163
|
+
bleManager.savePeripheral(peripheral);
|
|
164
|
+
|
|
165
|
+
WritableMap map = peripheral.asWritableMap();
|
|
166
|
+
bleManager.sendEvent("BleManagerDiscoverPeripheral", map);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
private final ScanCallback mScanCallback = new ScanCallback() {
|
|
133
170
|
@Override
|
|
134
171
|
public void onScanResult(final int callbackType, final ScanResult result) {
|
|
135
|
-
|
|
136
172
|
runOnUiThread(new Runnable() {
|
|
137
173
|
@Override
|
|
138
174
|
public void run() {
|
|
139
|
-
|
|
140
|
-
ScanRecord record = result.getScanRecord();
|
|
141
|
-
if (record != null)
|
|
142
|
-
info = record.getDeviceName();
|
|
143
|
-
else if (ActivityCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED)
|
|
144
|
-
info = result.getDevice().getName();
|
|
145
|
-
else
|
|
146
|
-
info = result.toString();
|
|
147
|
-
|
|
148
|
-
Log.i(bleManager.LOG_TAG, "DiscoverPeripheral: " + info);
|
|
149
|
-
|
|
150
|
-
LollipopPeripheral peripheral = (LollipopPeripheral) bleManager.getPeripheral(result.getDevice());
|
|
151
|
-
if (peripheral == null) {
|
|
152
|
-
peripheral = new LollipopPeripheral(bleManager.getReactContext(), result);
|
|
153
|
-
} else {
|
|
154
|
-
peripheral.updateData(result);
|
|
155
|
-
peripheral.updateRssi(result.getRssi());
|
|
156
|
-
}
|
|
157
|
-
bleManager.savePeripheral(peripheral);
|
|
158
|
-
|
|
159
|
-
WritableMap map = peripheral.asWritableMap();
|
|
160
|
-
bleManager.sendEvent("BleManagerDiscoverPeripheral", map);
|
|
175
|
+
onDiscoveredPeripheral(result);
|
|
161
176
|
}
|
|
162
177
|
});
|
|
163
178
|
}
|
|
164
179
|
|
|
165
180
|
@Override
|
|
166
181
|
public void onBatchScanResults(final List<ScanResult> results) {
|
|
182
|
+
runOnUiThread(new Runnable() {
|
|
183
|
+
@Override
|
|
184
|
+
public void run() {
|
|
185
|
+
if (results.isEmpty()) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
for (ScanResult result : results) {
|
|
190
|
+
onDiscoveredPeripheral(result);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
});
|
|
167
194
|
}
|
|
168
195
|
|
|
169
196
|
@Override
|