From af819a4241cf4162618d4caafa20a5b6ae609808 Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Tue, 25 Aug 2020 20:45:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8B=A5=E5=A0=B5=E7=AD=96?= =?UTF-8?q?=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../share/strategyreceiver/BlockStrategy.kt | 46 +++++++++++++++---- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/modules/mogo-module-share/src/main/java/com/mogo/module/share/strategyreceiver/BlockStrategy.kt b/modules/mogo-module-share/src/main/java/com/mogo/module/share/strategyreceiver/BlockStrategy.kt index 125ebab3b6..ff0e58de14 100644 --- a/modules/mogo-module-share/src/main/java/com/mogo/module/share/strategyreceiver/BlockStrategy.kt +++ b/modules/mogo-module-share/src/main/java/com/mogo/module/share/strategyreceiver/BlockStrategy.kt @@ -5,7 +5,6 @@ import android.util.ArrayMap import com.mogo.module.share.constant.HttpConstant import com.mogo.module.share.net.ShareApiService import com.mogo.service.IMogoServiceApis -import com.mogo.service.network.IMogoNetwork import com.mogo.service.tanlu.IMogoTanluProvider import com.mogo.service.tanlu.TanluUploadParams import com.mogo.utils.logger.Logger @@ -15,17 +14,35 @@ import com.mogo.utils.logger.Logger * 速度记录间隔,单位是毫秒 */ private const val SPEED_RECORD_TIME_INTERVAL = 2 * 60 * 1000L + +/** + * 停车标志位阈值,单位是次,两秒一次 + */ +private const val STOP_FLAG_THRESHOLD = 30 private const val TAG = "BlockUploadStrategy" + /** * 用于计算拥堵策略 */ -class BlockStrategy(private val apis:IMogoServiceApis) { +class BlockStrategy(private val apis: IMogoServiceApis) { private var startRecordTime: Long = 0 private var speedCacheList = ArrayList() + /** + * 停车标志位,当速度为0时加1,超过[STOP_FLAG_THRESHOLD]判定为停车,不认为是拥堵,这组数据无效 + */ + private var stopFlag = 0 + /** * 拥堵速度计算上报策略 * 计算[SPEED_RECORD_TIME_INTERVAL]内的平均速度,并上报 + * + * 定义的此方法是每两秒钟调用一次, 两分钟为一段进行计算 |--两分钟--|--两分钟--|--两分钟--| + * + * 里面有一个小策略,使用了一个停车标志位,如果速度为0,停车标志位加一,一个两分钟时间段内, + * 停车标志为累加超过[STOP_FLAG_THRESHOLD]判定为停车,不是拥堵,舍弃掉整个两分钟数据,不进行上报, + * 否则上报服务端,返回是否抓取视频 + * * @param speed 当前速度,单位需要是Km/h */ fun recordSpeed(speed: Float) { @@ -33,21 +50,32 @@ class BlockStrategy(private val apis:IMogoServiceApis) { if (startRecordTime == 0L) { // 数据初始化 startRecordTime = current + stopFlag = 0 speedCacheList.clear() } speedCacheList.add(speed) + if (speed == 0F) { + stopFlag++ + }else{ + stopFlag = 0 + } + if (current - startRecordTime >= SPEED_RECORD_TIME_INTERVAL) { // 到达时间限制,上报速度,数据清空 - var sum = 0F - speedCacheList.forEach { - sum += it + if(stopFlag < STOP_FLAG_THRESHOLD) { + // 停车标志位小于阈值,判定不是停车,计算平均值,进行上报 + var sum = 0F + speedCacheList.forEach { + sum += it + } + val ave = sum / speedCacheList.size + Logger.d(TAG, "平均速度为: $ave") + // 上报平均速度 + uploadAverageSpeed(ave) } - val ave = sum / speedCacheList.size - Logger.d(TAG, "平均速度为: $ave") - // 上报平均速度 - uploadAverageSpeed(ave) + startRecordTime = 0 } }