diff --git a/app/src/main/java/com/casic/common/detector/gd/extensions/ByteArray.kt b/app/src/main/java/com/casic/common/detector/gd/extensions/ByteArray.kt index 1b9b6d5..97823b8 100644 --- a/app/src/main/java/com/casic/common/detector/gd/extensions/ByteArray.kt +++ b/app/src/main/java/com/casic/common/detector/gd/extensions/ByteArray.kt @@ -1,5 +1,7 @@ package com.casic.common.detector.gd.extensions +import android.util.Log + /** * ByteArray转Hex * */ @@ -18,15 +20,27 @@ * 因为数据频率很高,而且每一帧数据至少有一个信号值,如果有多个信号强度值,取平均值 * * [78, 53, 49, 55, 51] + * * [78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51] + * * [78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51] * * */ fun ByteArray.toSignalStrength(): Int { + //判断数据合理性 + val validBytes = if (this.size % 5 == 0) { + this + } else { + // 计算最大能取到的5的倍数的数据长度 + val maxMultipleOfFour = (this.size / 5) * 5 + // 获取最大能取到的5的倍数的数据 + this.sliceArray(0 until maxMultipleOfFour) + } + val list = ArrayList() - for (i in this.indices step 5) { + for (i in validBytes.indices step 5) { // 每5个字节取一次数据 - val tempBytes = this.sliceArray(i until minOf(i + 5, this.size)) + val tempBytes = validBytes.sliceArray(i until minOf(i + 5, validBytes.size)) // [78, 53, 49, 55, 51] // 第一个字节是标志位,丢弃,将后面的数据转为十进制 val dataBytes = tempBytes.sliceArray(1 until tempBytes.size) @@ -37,4 +51,37 @@ list.add(decimalValue) } return list.average().toInt() +} + +/** + * 因为数据频率很高,而且每一帧数据至少有一个设备ID,已最后一个正确的ID为设备编号 + * + * [48, 48, 48, 56, 56, 57, 49, 48, 55, 51] + * + * [48, 48, 48, 56, 56, 57, 49, 48, 55, 51, 48, 48, 48, 56, 56, 57, 49, 48, 55, 51] + * + * */ +fun ByteArray.toMarkerId(): String { + //判断数据合理性 + val validBytes = if (this.size % 10 == 0) { + this + } else { + // 计算最大能取到的5的倍数的数据长度 + val maxMultipleOfFour = (this.size / 10) * 10 + // 获取最大能取到的5的倍数的数据 + this.sliceArray(0 until maxMultipleOfFour) + } + + val list = ArrayList() + for (i in validBytes.indices step 10) { + // 每10个字节取一次数据转为ASCII + val tempBytes = validBytes.sliceArray(i until minOf(i + 10, validBytes.size)) + val string = tempBytes.map { it.toInt().toChar() }.joinToString("") + if (string.matches("-?\\d+".toRegex())) { + list.add(string) + } else { + Log.d("kTag", "toDeviceCode: 编号解析失败") + } + } + return list.last() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/common/detector/gd/extensions/ByteArray.kt b/app/src/main/java/com/casic/common/detector/gd/extensions/ByteArray.kt index 1b9b6d5..97823b8 100644 --- a/app/src/main/java/com/casic/common/detector/gd/extensions/ByteArray.kt +++ b/app/src/main/java/com/casic/common/detector/gd/extensions/ByteArray.kt @@ -1,5 +1,7 @@ package com.casic.common.detector.gd.extensions +import android.util.Log + /** * ByteArray转Hex * */ @@ -18,15 +20,27 @@ * 因为数据频率很高,而且每一帧数据至少有一个信号值,如果有多个信号强度值,取平均值 * * [78, 53, 49, 55, 51] + * * [78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51] + * * [78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51] * * */ fun ByteArray.toSignalStrength(): Int { + //判断数据合理性 + val validBytes = if (this.size % 5 == 0) { + this + } else { + // 计算最大能取到的5的倍数的数据长度 + val maxMultipleOfFour = (this.size / 5) * 5 + // 获取最大能取到的5的倍数的数据 + this.sliceArray(0 until maxMultipleOfFour) + } + val list = ArrayList() - for (i in this.indices step 5) { + for (i in validBytes.indices step 5) { // 每5个字节取一次数据 - val tempBytes = this.sliceArray(i until minOf(i + 5, this.size)) + val tempBytes = validBytes.sliceArray(i until minOf(i + 5, validBytes.size)) // [78, 53, 49, 55, 51] // 第一个字节是标志位,丢弃,将后面的数据转为十进制 val dataBytes = tempBytes.sliceArray(1 until tempBytes.size) @@ -37,4 +51,37 @@ list.add(decimalValue) } return list.average().toInt() +} + +/** + * 因为数据频率很高,而且每一帧数据至少有一个设备ID,已最后一个正确的ID为设备编号 + * + * [48, 48, 48, 56, 56, 57, 49, 48, 55, 51] + * + * [48, 48, 48, 56, 56, 57, 49, 48, 55, 51, 48, 48, 48, 56, 56, 57, 49, 48, 55, 51] + * + * */ +fun ByteArray.toMarkerId(): String { + //判断数据合理性 + val validBytes = if (this.size % 10 == 0) { + this + } else { + // 计算最大能取到的5的倍数的数据长度 + val maxMultipleOfFour = (this.size / 10) * 10 + // 获取最大能取到的5的倍数的数据 + this.sliceArray(0 until maxMultipleOfFour) + } + + val list = ArrayList() + for (i in validBytes.indices step 10) { + // 每10个字节取一次数据转为ASCII + val tempBytes = validBytes.sliceArray(i until minOf(i + 10, validBytes.size)) + val string = tempBytes.map { it.toInt().toChar() }.joinToString("") + if (string.matches("-?\\d+".toRegex())) { + list.add(string) + } else { + Log.d("kTag", "toDeviceCode: 编号解析失败") + } + } + return list.last() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt b/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt index 03913c2..24083d9 100644 --- a/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt +++ b/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt @@ -42,7 +42,7 @@ commandArray.forEach { outStream?.write(it.code) outStream?.flush() - Thread.sleep(50) + Thread.sleep(500) } inStreamFirst = serialPorts.first().inputStream @@ -52,13 +52,13 @@ if (gpioState.get() == 1) { readData(inStreamFirst!!, listener) } - }, 0, 100, TimeUnit.MILLISECONDS) + }, 100, 150, TimeUnit.MILLISECONDS) executor.scheduleAtFixedRate({ if (gpioState.get() == 1) { readData(inStreamLast!!, listener) } - }, 0, 100, TimeUnit.MILLISECONDS) + }, 100, 150, TimeUnit.MILLISECONDS) } catch (e: IOException) { e.printStackTrace() closeSerialPort() diff --git a/app/src/main/java/com/casic/common/detector/gd/extensions/ByteArray.kt b/app/src/main/java/com/casic/common/detector/gd/extensions/ByteArray.kt index 1b9b6d5..97823b8 100644 --- a/app/src/main/java/com/casic/common/detector/gd/extensions/ByteArray.kt +++ b/app/src/main/java/com/casic/common/detector/gd/extensions/ByteArray.kt @@ -1,5 +1,7 @@ package com.casic.common.detector.gd.extensions +import android.util.Log + /** * ByteArray转Hex * */ @@ -18,15 +20,27 @@ * 因为数据频率很高,而且每一帧数据至少有一个信号值,如果有多个信号强度值,取平均值 * * [78, 53, 49, 55, 51] + * * [78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51] + * * [78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51] * * */ fun ByteArray.toSignalStrength(): Int { + //判断数据合理性 + val validBytes = if (this.size % 5 == 0) { + this + } else { + // 计算最大能取到的5的倍数的数据长度 + val maxMultipleOfFour = (this.size / 5) * 5 + // 获取最大能取到的5的倍数的数据 + this.sliceArray(0 until maxMultipleOfFour) + } + val list = ArrayList() - for (i in this.indices step 5) { + for (i in validBytes.indices step 5) { // 每5个字节取一次数据 - val tempBytes = this.sliceArray(i until minOf(i + 5, this.size)) + val tempBytes = validBytes.sliceArray(i until minOf(i + 5, validBytes.size)) // [78, 53, 49, 55, 51] // 第一个字节是标志位,丢弃,将后面的数据转为十进制 val dataBytes = tempBytes.sliceArray(1 until tempBytes.size) @@ -37,4 +51,37 @@ list.add(decimalValue) } return list.average().toInt() +} + +/** + * 因为数据频率很高,而且每一帧数据至少有一个设备ID,已最后一个正确的ID为设备编号 + * + * [48, 48, 48, 56, 56, 57, 49, 48, 55, 51] + * + * [48, 48, 48, 56, 56, 57, 49, 48, 55, 51, 48, 48, 48, 56, 56, 57, 49, 48, 55, 51] + * + * */ +fun ByteArray.toMarkerId(): String { + //判断数据合理性 + val validBytes = if (this.size % 10 == 0) { + this + } else { + // 计算最大能取到的5的倍数的数据长度 + val maxMultipleOfFour = (this.size / 10) * 10 + // 获取最大能取到的5的倍数的数据 + this.sliceArray(0 until maxMultipleOfFour) + } + + val list = ArrayList() + for (i in validBytes.indices step 10) { + // 每10个字节取一次数据转为ASCII + val tempBytes = validBytes.sliceArray(i until minOf(i + 10, validBytes.size)) + val string = tempBytes.map { it.toInt().toChar() }.joinToString("") + if (string.matches("-?\\d+".toRegex())) { + list.add(string) + } else { + Log.d("kTag", "toDeviceCode: 编号解析失败") + } + } + return list.last() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt b/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt index 03913c2..24083d9 100644 --- a/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt +++ b/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt @@ -42,7 +42,7 @@ commandArray.forEach { outStream?.write(it.code) outStream?.flush() - Thread.sleep(50) + Thread.sleep(500) } inStreamFirst = serialPorts.first().inputStream @@ -52,13 +52,13 @@ if (gpioState.get() == 1) { readData(inStreamFirst!!, listener) } - }, 0, 100, TimeUnit.MILLISECONDS) + }, 100, 150, TimeUnit.MILLISECONDS) executor.scheduleAtFixedRate({ if (gpioState.get() == 1) { readData(inStreamLast!!, listener) } - }, 0, 100, TimeUnit.MILLISECONDS) + }, 100, 150, TimeUnit.MILLISECONDS) } catch (e: IOException) { e.printStackTrace() closeSerialPort() diff --git a/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt b/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt index 873cdeb..3dc737e 100644 --- a/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt +++ b/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt @@ -26,13 +26,11 @@ import com.casic.common.detector.gd.databinding.ActivityInstallMarkerBinding import com.casic.common.detector.gd.extensions.compressImage import com.casic.common.detector.gd.extensions.getDefaultValue -import com.casic.common.detector.gd.extensions.hexToString import com.casic.common.detector.gd.extensions.initImmersionBar -import com.casic.common.detector.gd.extensions.isNumeric import com.casic.common.detector.gd.extensions.setDefaultValue import com.casic.common.detector.gd.extensions.show import com.casic.common.detector.gd.extensions.toColor -import com.casic.common.detector.gd.extensions.toHex +import com.casic.common.detector.gd.extensions.toMarkerId import com.casic.common.detector.gd.extensions.toObjectType import com.casic.common.detector.gd.service.SerialPortService import com.casic.common.detector.gd.utils.DataBaseManager @@ -263,10 +261,8 @@ override fun onDataReceived(buffer: ByteArray) { - val hex = buffer.toHex() - Log.d(kTag, hex) - val markerId = hex.take(20).hexToString() - if (markerId.isNumeric()) { + if ((buffer.first().toInt() and 0xFF).toString(16).uppercase() == "30") { + val markerId = buffer.toMarkerId() runOnUiThread { LoadingDialog.dismiss() countDownTimer.cancel() diff --git a/app/src/main/java/com/casic/common/detector/gd/extensions/ByteArray.kt b/app/src/main/java/com/casic/common/detector/gd/extensions/ByteArray.kt index 1b9b6d5..97823b8 100644 --- a/app/src/main/java/com/casic/common/detector/gd/extensions/ByteArray.kt +++ b/app/src/main/java/com/casic/common/detector/gd/extensions/ByteArray.kt @@ -1,5 +1,7 @@ package com.casic.common.detector.gd.extensions +import android.util.Log + /** * ByteArray转Hex * */ @@ -18,15 +20,27 @@ * 因为数据频率很高,而且每一帧数据至少有一个信号值,如果有多个信号强度值,取平均值 * * [78, 53, 49, 55, 51] + * * [78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51] + * * [78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51] * * */ fun ByteArray.toSignalStrength(): Int { + //判断数据合理性 + val validBytes = if (this.size % 5 == 0) { + this + } else { + // 计算最大能取到的5的倍数的数据长度 + val maxMultipleOfFour = (this.size / 5) * 5 + // 获取最大能取到的5的倍数的数据 + this.sliceArray(0 until maxMultipleOfFour) + } + val list = ArrayList() - for (i in this.indices step 5) { + for (i in validBytes.indices step 5) { // 每5个字节取一次数据 - val tempBytes = this.sliceArray(i until minOf(i + 5, this.size)) + val tempBytes = validBytes.sliceArray(i until minOf(i + 5, validBytes.size)) // [78, 53, 49, 55, 51] // 第一个字节是标志位,丢弃,将后面的数据转为十进制 val dataBytes = tempBytes.sliceArray(1 until tempBytes.size) @@ -37,4 +51,37 @@ list.add(decimalValue) } return list.average().toInt() +} + +/** + * 因为数据频率很高,而且每一帧数据至少有一个设备ID,已最后一个正确的ID为设备编号 + * + * [48, 48, 48, 56, 56, 57, 49, 48, 55, 51] + * + * [48, 48, 48, 56, 56, 57, 49, 48, 55, 51, 48, 48, 48, 56, 56, 57, 49, 48, 55, 51] + * + * */ +fun ByteArray.toMarkerId(): String { + //判断数据合理性 + val validBytes = if (this.size % 10 == 0) { + this + } else { + // 计算最大能取到的5的倍数的数据长度 + val maxMultipleOfFour = (this.size / 10) * 10 + // 获取最大能取到的5的倍数的数据 + this.sliceArray(0 until maxMultipleOfFour) + } + + val list = ArrayList() + for (i in validBytes.indices step 10) { + // 每10个字节取一次数据转为ASCII + val tempBytes = validBytes.sliceArray(i until minOf(i + 10, validBytes.size)) + val string = tempBytes.map { it.toInt().toChar() }.joinToString("") + if (string.matches("-?\\d+".toRegex())) { + list.add(string) + } else { + Log.d("kTag", "toDeviceCode: 编号解析失败") + } + } + return list.last() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt b/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt index 03913c2..24083d9 100644 --- a/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt +++ b/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt @@ -42,7 +42,7 @@ commandArray.forEach { outStream?.write(it.code) outStream?.flush() - Thread.sleep(50) + Thread.sleep(500) } inStreamFirst = serialPorts.first().inputStream @@ -52,13 +52,13 @@ if (gpioState.get() == 1) { readData(inStreamFirst!!, listener) } - }, 0, 100, TimeUnit.MILLISECONDS) + }, 100, 150, TimeUnit.MILLISECONDS) executor.scheduleAtFixedRate({ if (gpioState.get() == 1) { readData(inStreamLast!!, listener) } - }, 0, 100, TimeUnit.MILLISECONDS) + }, 100, 150, TimeUnit.MILLISECONDS) } catch (e: IOException) { e.printStackTrace() closeSerialPort() diff --git a/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt b/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt index 873cdeb..3dc737e 100644 --- a/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt +++ b/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt @@ -26,13 +26,11 @@ import com.casic.common.detector.gd.databinding.ActivityInstallMarkerBinding import com.casic.common.detector.gd.extensions.compressImage import com.casic.common.detector.gd.extensions.getDefaultValue -import com.casic.common.detector.gd.extensions.hexToString import com.casic.common.detector.gd.extensions.initImmersionBar -import com.casic.common.detector.gd.extensions.isNumeric import com.casic.common.detector.gd.extensions.setDefaultValue import com.casic.common.detector.gd.extensions.show import com.casic.common.detector.gd.extensions.toColor -import com.casic.common.detector.gd.extensions.toHex +import com.casic.common.detector.gd.extensions.toMarkerId import com.casic.common.detector.gd.extensions.toObjectType import com.casic.common.detector.gd.service.SerialPortService import com.casic.common.detector.gd.utils.DataBaseManager @@ -263,10 +261,8 @@ override fun onDataReceived(buffer: ByteArray) { - val hex = buffer.toHex() - Log.d(kTag, hex) - val markerId = hex.take(20).hexToString() - if (markerId.isNumeric()) { + if ((buffer.first().toInt() and 0xFF).toString(16).uppercase() == "30") { + val markerId = buffer.toMarkerId() runOnUiThread { LoadingDialog.dismiss() countDownTimer.cancel() diff --git a/app/src/main/java/com/casic/common/detector/gd/view/MainActivity.kt b/app/src/main/java/com/casic/common/detector/gd/view/MainActivity.kt index de9f07c..db1574b 100644 --- a/app/src/main/java/com/casic/common/detector/gd/view/MainActivity.kt +++ b/app/src/main/java/com/casic/common/detector/gd/view/MainActivity.kt @@ -46,10 +46,8 @@ import com.casic.common.detector.gd.extensions.appendDownloadUrl import com.casic.common.detector.gd.extensions.createTaskCode import com.casic.common.detector.gd.extensions.drawCircle -import com.casic.common.detector.gd.extensions.hexToString import com.casic.common.detector.gd.extensions.initImmersionBar -import com.casic.common.detector.gd.extensions.isNumeric -import com.casic.common.detector.gd.extensions.toHex +import com.casic.common.detector.gd.extensions.toMarkerId import com.casic.common.detector.gd.extensions.toSignalStrength import com.casic.common.detector.gd.model.TaskDetailLocalModel import com.casic.common.detector.gd.model.TaskModel @@ -507,43 +505,46 @@ override fun onDataReceived(buffer: ByteArray) { //只响一次,因为探测频率高,所以依旧是连续的报警声 soundPool.play(soundResourceId, 1f, 1f, 0, 0, 1f) - if (buffer.first() == 78.toByte()) { - val signalEnergy = buffer.toSignalStrength() - if (signalEnergy <= 1500 && detailDialog.isShowing) { - detailDialog.dismiss() - } - } - - val hex = buffer.toHex() - val markerId = hex.take(20).hexToString() - if (markerId.isNumeric()) { - //添加地图Marker - if (!ids.contains(markerId)) { - //根据markerId查询标识器经纬度 - val labels = DataBaseManager.get.queryMarkerById(markerId) - if (labels.isNotEmpty()) { - val bean = labels.first() - aMap.addMarker( - MarkerOptions().position( - LatLng(bean.lat.toDouble(), bean.lng.toDouble()) - ).icon( - BitmapDescriptorFactory.fromResource(R.mipmap.label_blue1) - ) - ) - } - } - ids.add(markerId) - - //显示标识器详细信息 - if (!detailDialog.isShowing) { - val markerBean = DataBaseManager.get.queryMarkerById(markerId).firstOrNull() - if (markerBean == null) { - "无法查询到此ID【${markerId}】的信息".show(context) - } else { - detailDialog.setMarker(markerBean) + when ((buffer.first().toInt() and 0xFF).toString(16).uppercase()) { + "4E" -> { + val signalEnergy = buffer.toSignalStrength() + if (signalEnergy <= 1500) { detailDialog.show() } } + + "30" -> { + val markerId = buffer.toMarkerId() + //添加地图Marker + if (!ids.contains(markerId)) { + //根据markerId查询标识器经纬度 + val labels = DataBaseManager.get.queryMarkerById(markerId) + if (labels.isNotEmpty()) { + val bean = labels.first() + aMap.addMarker( + MarkerOptions() + .position(LatLng(bean.lat.toDouble(), bean.lng.toDouble())) + .icon(BitmapDescriptorFactory.fromResource(R.mipmap.label_blue1)) + ) + } + } + ids.add(markerId) + + //显示标识器详细信息 + if (!detailDialog.isShowing) { + val markerBean = DataBaseManager.get.queryMarkerById(markerId).firstOrNull() + if (markerBean == null) { + "无法查询到此ID【${markerId}】的信息".show(context) + } else { + detailDialog.setMarker(markerBean) + detailDialog.show() + } + } + } + + else -> { + Log.d(kTag, "乱码数据: ${buffer.contentToString()}") + } } } diff --git a/app/src/main/java/com/casic/common/detector/gd/extensions/ByteArray.kt b/app/src/main/java/com/casic/common/detector/gd/extensions/ByteArray.kt index 1b9b6d5..97823b8 100644 --- a/app/src/main/java/com/casic/common/detector/gd/extensions/ByteArray.kt +++ b/app/src/main/java/com/casic/common/detector/gd/extensions/ByteArray.kt @@ -1,5 +1,7 @@ package com.casic.common.detector.gd.extensions +import android.util.Log + /** * ByteArray转Hex * */ @@ -18,15 +20,27 @@ * 因为数据频率很高,而且每一帧数据至少有一个信号值,如果有多个信号强度值,取平均值 * * [78, 53, 49, 55, 51] + * * [78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51] + * * [78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51, 78, 53, 49, 55, 51] * * */ fun ByteArray.toSignalStrength(): Int { + //判断数据合理性 + val validBytes = if (this.size % 5 == 0) { + this + } else { + // 计算最大能取到的5的倍数的数据长度 + val maxMultipleOfFour = (this.size / 5) * 5 + // 获取最大能取到的5的倍数的数据 + this.sliceArray(0 until maxMultipleOfFour) + } + val list = ArrayList() - for (i in this.indices step 5) { + for (i in validBytes.indices step 5) { // 每5个字节取一次数据 - val tempBytes = this.sliceArray(i until minOf(i + 5, this.size)) + val tempBytes = validBytes.sliceArray(i until minOf(i + 5, validBytes.size)) // [78, 53, 49, 55, 51] // 第一个字节是标志位,丢弃,将后面的数据转为十进制 val dataBytes = tempBytes.sliceArray(1 until tempBytes.size) @@ -37,4 +51,37 @@ list.add(decimalValue) } return list.average().toInt() +} + +/** + * 因为数据频率很高,而且每一帧数据至少有一个设备ID,已最后一个正确的ID为设备编号 + * + * [48, 48, 48, 56, 56, 57, 49, 48, 55, 51] + * + * [48, 48, 48, 56, 56, 57, 49, 48, 55, 51, 48, 48, 48, 56, 56, 57, 49, 48, 55, 51] + * + * */ +fun ByteArray.toMarkerId(): String { + //判断数据合理性 + val validBytes = if (this.size % 10 == 0) { + this + } else { + // 计算最大能取到的5的倍数的数据长度 + val maxMultipleOfFour = (this.size / 10) * 10 + // 获取最大能取到的5的倍数的数据 + this.sliceArray(0 until maxMultipleOfFour) + } + + val list = ArrayList() + for (i in validBytes.indices step 10) { + // 每10个字节取一次数据转为ASCII + val tempBytes = validBytes.sliceArray(i until minOf(i + 10, validBytes.size)) + val string = tempBytes.map { it.toInt().toChar() }.joinToString("") + if (string.matches("-?\\d+".toRegex())) { + list.add(string) + } else { + Log.d("kTag", "toDeviceCode: 编号解析失败") + } + } + return list.last() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt b/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt index 03913c2..24083d9 100644 --- a/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt +++ b/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt @@ -42,7 +42,7 @@ commandArray.forEach { outStream?.write(it.code) outStream?.flush() - Thread.sleep(50) + Thread.sleep(500) } inStreamFirst = serialPorts.first().inputStream @@ -52,13 +52,13 @@ if (gpioState.get() == 1) { readData(inStreamFirst!!, listener) } - }, 0, 100, TimeUnit.MILLISECONDS) + }, 100, 150, TimeUnit.MILLISECONDS) executor.scheduleAtFixedRate({ if (gpioState.get() == 1) { readData(inStreamLast!!, listener) } - }, 0, 100, TimeUnit.MILLISECONDS) + }, 100, 150, TimeUnit.MILLISECONDS) } catch (e: IOException) { e.printStackTrace() closeSerialPort() diff --git a/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt b/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt index 873cdeb..3dc737e 100644 --- a/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt +++ b/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt @@ -26,13 +26,11 @@ import com.casic.common.detector.gd.databinding.ActivityInstallMarkerBinding import com.casic.common.detector.gd.extensions.compressImage import com.casic.common.detector.gd.extensions.getDefaultValue -import com.casic.common.detector.gd.extensions.hexToString import com.casic.common.detector.gd.extensions.initImmersionBar -import com.casic.common.detector.gd.extensions.isNumeric import com.casic.common.detector.gd.extensions.setDefaultValue import com.casic.common.detector.gd.extensions.show import com.casic.common.detector.gd.extensions.toColor -import com.casic.common.detector.gd.extensions.toHex +import com.casic.common.detector.gd.extensions.toMarkerId import com.casic.common.detector.gd.extensions.toObjectType import com.casic.common.detector.gd.service.SerialPortService import com.casic.common.detector.gd.utils.DataBaseManager @@ -263,10 +261,8 @@ override fun onDataReceived(buffer: ByteArray) { - val hex = buffer.toHex() - Log.d(kTag, hex) - val markerId = hex.take(20).hexToString() - if (markerId.isNumeric()) { + if ((buffer.first().toInt() and 0xFF).toString(16).uppercase() == "30") { + val markerId = buffer.toMarkerId() runOnUiThread { LoadingDialog.dismiss() countDownTimer.cancel() diff --git a/app/src/main/java/com/casic/common/detector/gd/view/MainActivity.kt b/app/src/main/java/com/casic/common/detector/gd/view/MainActivity.kt index de9f07c..db1574b 100644 --- a/app/src/main/java/com/casic/common/detector/gd/view/MainActivity.kt +++ b/app/src/main/java/com/casic/common/detector/gd/view/MainActivity.kt @@ -46,10 +46,8 @@ import com.casic.common.detector.gd.extensions.appendDownloadUrl import com.casic.common.detector.gd.extensions.createTaskCode import com.casic.common.detector.gd.extensions.drawCircle -import com.casic.common.detector.gd.extensions.hexToString import com.casic.common.detector.gd.extensions.initImmersionBar -import com.casic.common.detector.gd.extensions.isNumeric -import com.casic.common.detector.gd.extensions.toHex +import com.casic.common.detector.gd.extensions.toMarkerId import com.casic.common.detector.gd.extensions.toSignalStrength import com.casic.common.detector.gd.model.TaskDetailLocalModel import com.casic.common.detector.gd.model.TaskModel @@ -507,43 +505,46 @@ override fun onDataReceived(buffer: ByteArray) { //只响一次,因为探测频率高,所以依旧是连续的报警声 soundPool.play(soundResourceId, 1f, 1f, 0, 0, 1f) - if (buffer.first() == 78.toByte()) { - val signalEnergy = buffer.toSignalStrength() - if (signalEnergy <= 1500 && detailDialog.isShowing) { - detailDialog.dismiss() - } - } - - val hex = buffer.toHex() - val markerId = hex.take(20).hexToString() - if (markerId.isNumeric()) { - //添加地图Marker - if (!ids.contains(markerId)) { - //根据markerId查询标识器经纬度 - val labels = DataBaseManager.get.queryMarkerById(markerId) - if (labels.isNotEmpty()) { - val bean = labels.first() - aMap.addMarker( - MarkerOptions().position( - LatLng(bean.lat.toDouble(), bean.lng.toDouble()) - ).icon( - BitmapDescriptorFactory.fromResource(R.mipmap.label_blue1) - ) - ) - } - } - ids.add(markerId) - - //显示标识器详细信息 - if (!detailDialog.isShowing) { - val markerBean = DataBaseManager.get.queryMarkerById(markerId).firstOrNull() - if (markerBean == null) { - "无法查询到此ID【${markerId}】的信息".show(context) - } else { - detailDialog.setMarker(markerBean) + when ((buffer.first().toInt() and 0xFF).toString(16).uppercase()) { + "4E" -> { + val signalEnergy = buffer.toSignalStrength() + if (signalEnergy <= 1500) { detailDialog.show() } } + + "30" -> { + val markerId = buffer.toMarkerId() + //添加地图Marker + if (!ids.contains(markerId)) { + //根据markerId查询标识器经纬度 + val labels = DataBaseManager.get.queryMarkerById(markerId) + if (labels.isNotEmpty()) { + val bean = labels.first() + aMap.addMarker( + MarkerOptions() + .position(LatLng(bean.lat.toDouble(), bean.lng.toDouble())) + .icon(BitmapDescriptorFactory.fromResource(R.mipmap.label_blue1)) + ) + } + } + ids.add(markerId) + + //显示标识器详细信息 + if (!detailDialog.isShowing) { + val markerBean = DataBaseManager.get.queryMarkerById(markerId).firstOrNull() + if (markerBean == null) { + "无法查询到此ID【${markerId}】的信息".show(context) + } else { + detailDialog.setMarker(markerBean) + detailDialog.show() + } + } + } + + else -> { + Log.d(kTag, "乱码数据: ${buffer.contentToString()}") + } } } diff --git a/app/src/main/java/com/casic/common/detector/gd/view/SearchMarkerActivity.kt b/app/src/main/java/com/casic/common/detector/gd/view/SearchMarkerActivity.kt index a4b8db4..1186df0 100644 --- a/app/src/main/java/com/casic/common/detector/gd/view/SearchMarkerActivity.kt +++ b/app/src/main/java/com/casic/common/detector/gd/view/SearchMarkerActivity.kt @@ -27,8 +27,8 @@ import com.casic.common.detector.gd.callback.OnSerialPortListener import com.casic.common.detector.gd.databinding.ActivitySearchMarkerBinding import com.casic.common.detector.gd.extensions.hexToString -import com.casic.common.detector.gd.extensions.isNumeric import com.casic.common.detector.gd.extensions.toHex +import com.casic.common.detector.gd.extensions.toMarkerId import com.casic.common.detector.gd.extensions.toSignalStrength import com.casic.common.detector.gd.model.MarkerDistanceData import com.casic.common.detector.gd.service.SerialPortService @@ -301,25 +301,28 @@ runOnUiThread { try { // 读取到信号强度 - val tag = (buffer.first().toInt() and 0xFF).toString(16).uppercase() - if (tag == "4E") { - val signalEnergy = buffer.toSignalStrength() + when ((buffer.first().toInt() and 0xFF).toString(16).uppercase()) { + "4E" -> { + val signalEnergy = buffer.toSignalStrength() - //声音 - updateSound(signalEnergy) + //声音 + updateSound(signalEnergy) - //信号强度显示 - updateProgressBar(signalEnergy) + //信号强度显示 + updateProgressBar(signalEnergy) - //搜索信号文字显示 - updateTextResult(signalEnergy) - } else { - Log.d(kTag, buffer.contentToString()) - val id = buffer.toHex().take(20).hexToString() - if (id.isNumeric()) { - markerId = id + //搜索信号文字显示 + updateTextResult(signalEnergy) + } + + "30" -> { + markerId = buffer.toMarkerId() handleMarker(markerId) } + + else -> { + Log.d(kTag, "乱码数据: ${buffer.contentToString()}") + } } } catch (e: Exception) { e.printStackTrace()