Add manufacturer data filtering (#23)
* Add manufacturer data filtering * Implement manufacturer data filter in windows * Fix manufacturerData filtering on windows * Fix linux * Clean comments --------- Co-authored-by: Foti Dim <fdimanidis@gmail.com>
This commit is contained in:
@@ -127,21 +127,53 @@ data class UniversalBleCharacteristic (
|
||||
}
|
||||
}
|
||||
|
||||
/** Generated class from Pigeon that represents data sent in messages. */
|
||||
/**
|
||||
* Scan Filters
|
||||
*
|
||||
* Generated class from Pigeon that represents data sent in messages.
|
||||
*/
|
||||
data class UniversalScanFilter (
|
||||
val withServices: List<String?>
|
||||
val withServices: List<String?>,
|
||||
val withManufacturerData: List<UniversalManufacturerDataFilter?>
|
||||
|
||||
) {
|
||||
companion object {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun fromList(list: List<Any?>): UniversalScanFilter {
|
||||
val withServices = list[0] as List<String?>
|
||||
return UniversalScanFilter(withServices)
|
||||
val withManufacturerData = list[1] as List<UniversalManufacturerDataFilter?>
|
||||
return UniversalScanFilter(withServices, withManufacturerData)
|
||||
}
|
||||
}
|
||||
fun toList(): List<Any?> {
|
||||
return listOf<Any?>(
|
||||
withServices,
|
||||
withManufacturerData,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/** Generated class from Pigeon that represents data sent in messages. */
|
||||
data class UniversalManufacturerDataFilter (
|
||||
val companyIdentifier: Long? = null,
|
||||
val data: ByteArray? = null,
|
||||
val mask: ByteArray? = null
|
||||
|
||||
) {
|
||||
companion object {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun fromList(list: List<Any?>): UniversalManufacturerDataFilter {
|
||||
val companyIdentifier = list[0].let { if (it is Int) it.toLong() else it as Long? }
|
||||
val data = list[1] as ByteArray?
|
||||
val mask = list[2] as ByteArray?
|
||||
return UniversalManufacturerDataFilter(companyIdentifier, data, mask)
|
||||
}
|
||||
}
|
||||
fun toList(): List<Any?> {
|
||||
return listOf<Any?>(
|
||||
companyIdentifier,
|
||||
data,
|
||||
mask,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -166,6 +198,11 @@ private object UniversalBlePlatformChannelCodec : StandardMessageCodec() {
|
||||
}
|
||||
}
|
||||
131.toByte() -> {
|
||||
return (readValue(buffer) as? List<Any?>)?.let {
|
||||
UniversalManufacturerDataFilter.fromList(it)
|
||||
}
|
||||
}
|
||||
132.toByte() -> {
|
||||
return (readValue(buffer) as? List<Any?>)?.let {
|
||||
UniversalScanFilter.fromList(it)
|
||||
}
|
||||
@@ -187,10 +224,14 @@ private object UniversalBlePlatformChannelCodec : StandardMessageCodec() {
|
||||
stream.write(130)
|
||||
writeValue(stream, value.toList())
|
||||
}
|
||||
is UniversalScanFilter -> {
|
||||
is UniversalManufacturerDataFilter -> {
|
||||
stream.write(131)
|
||||
writeValue(stream, value.toList())
|
||||
}
|
||||
is UniversalScanFilter -> {
|
||||
stream.write(132)
|
||||
writeValue(stream, value.toList())
|
||||
}
|
||||
else -> super.writeValue(stream, value)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,7 +144,7 @@ fun Int.parseGattErrorCode(): String? {
|
||||
}
|
||||
|
||||
fun UniversalScanFilter.toScanFilters(): List<ScanFilter> {
|
||||
var scanFilters: List<ScanFilter> = emptyList()
|
||||
var scanFilters: ArrayList<ScanFilter> = arrayListOf()
|
||||
|
||||
// Add withServices Filter
|
||||
for (service in this.withServices) {
|
||||
@@ -152,7 +152,7 @@ fun UniversalScanFilter.toScanFilters(): List<ScanFilter> {
|
||||
val serviceUUID = service?.validFullUUID()
|
||||
serviceUUID?.let {
|
||||
val parcelUUId = ParcelUuid.fromString(it)
|
||||
scanFilters = scanFilters.plus(
|
||||
scanFilters.add(
|
||||
ScanFilter.Builder().setServiceUuid(parcelUUId).build()
|
||||
)
|
||||
Log.e(TAG, "scanFilters: $parcelUUId")
|
||||
@@ -167,7 +167,37 @@ fun UniversalScanFilter.toScanFilters(): List<ScanFilter> {
|
||||
}
|
||||
}
|
||||
|
||||
return scanFilters
|
||||
// Add ManufacturerData Filter
|
||||
for (manufacturerData in this.withManufacturerData) {
|
||||
try {
|
||||
manufacturerData?.companyIdentifier?.let {
|
||||
val data: ByteArray = manufacturerData.data ?: ByteArray(0)
|
||||
val mask: ByteArray? = manufacturerData.mask
|
||||
if (mask == null) {
|
||||
scanFilters.add(
|
||||
ScanFilter.Builder().setManufacturerData(
|
||||
it.toInt(), data
|
||||
).build()
|
||||
)
|
||||
} else {
|
||||
scanFilters.add(
|
||||
ScanFilter.Builder().setManufacturerData(
|
||||
it.toInt(), data, mask
|
||||
).build()
|
||||
)
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, e.toString())
|
||||
throw FlutterError(
|
||||
"illegalIllegalArgument",
|
||||
"Invalid manufacturerData: ${manufacturerData?.companyIdentifier} ${manufacturerData?.data} ${manufacturerData?.mask}",
|
||||
e.toString()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
return scanFilters.toList()
|
||||
}
|
||||
|
||||
val ScanResult.manufacturerDataHead: ByteArray?
|
||||
|
||||
Reference in New Issue
Block a user