优化拥堵策略上报逻辑

This commit is contained in:
tongchenfei
2020-10-21 15:23:19 +08:00
parent 88fc1d0d34
commit f52d4a94cb
9 changed files with 219 additions and 1 deletions

View File

@@ -48,11 +48,13 @@ dependencies {
implementation rootProject.ext.dependencies.mogocommons
implementation rootProject.ext.dependencies.modulecommon
implementation rootProject.ext.dependencies.mogomoduleauth
implementation rootProject.ext.dependencies.moduleservice
} else {
implementation project(":foudations:mogo-utils")
api project(":foudations:mogo-commons")
implementation project(':modules:mogo-module-common')
implementation project(':modules:mogo-module-authorize')
implementation project(':modules:mogo-module-service')
}
}

View File

@@ -5,6 +5,7 @@ import com.alibaba.android.arouter.facade.annotation.Route
import com.alibaba.android.arouter.facade.template.IProvider
import com.alibaba.android.arouter.launcher.ARouter
import com.mogo.commons.debug.DebugConfig
import com.mogo.module.share.adas.AdasFrontCarDistanceY
import com.mogo.module.share.constant.ACCIDENT_STRATEGY_SHARE_PUSH_TYPE
import com.mogo.module.share.constant.S_TAG
import com.mogo.module.share.strategyreceiver.AccidentStrategyReceiver
@@ -12,6 +13,9 @@ import com.mogo.module.share.strategyreceiver.BlockStrategy
import com.mogo.service.IMogoServiceApis
import com.mogo.service.MogoServicePaths
import com.mogo.utils.logger.Logger
import com.mogo.utils.network.utils.GsonUtil
import org.json.JSONObject
import java.lang.Exception
/**
* 策略上报入口服务端策略上报Push的接收地接收后再调用tanlu相关接口进行视频抓取
@@ -30,8 +34,26 @@ class StrategyShareProvider : IProvider {
// if(!DebugConfig.isLauncher()) {
apis.registerCenterApi.registerMogoLocationListener(MogoServicePaths.PATH_STRATEGY_SHARE) {
// Logger.d(S_TAG,"定位发生变化,准备记录速度: ${it.speed}")
blockStrategy.recordSpeed(it.speed * 3.6F)
blockStrategy.recordLocation(it.latitude, it.longitude)
}
apis.adasControllerApi.addAdasDataCallback {
Logger.d(S_TAG, "收到adas数据===$it")
try {
val oriJson = JSONObject(it)
val action = oriJson.optInt("action", -1)
if (action == 0) {
// adas返回前车距离单位是米
val frontDistanceItem = GsonUtil.objectFromJson(it, AdasFrontCarDistanceY::class.java)
val distance = frontDistanceItem.result.distanceY.toDouble().toInt()
blockStrategy.refreshFrontDistance(distance)
}
} catch (e: Exception) {
Logger.e(S_TAG, e, "解析adas数据异常")
e.printStackTrace()
}
}
// }
}

View File

@@ -0,0 +1,21 @@
package com.mogo.module.share.adas;
/**
* @author nie yunlong
* @des
* @date 2020/10/20
*/
public class AdasDataInfo {
/**
* 距离
*/
private String distanceY;
public String getDistanceY() {
return distanceY;
}
public void setDistanceY(String distanceY) {
this.distanceY = distanceY;
}
}

View File

@@ -0,0 +1,11 @@
package com.mogo.module.share.adas;
/**
* @author nie yunlong
* @des 正前方距离y
* @date 2020/10/20
*/
public class AdasFrontCarDistanceY extends BasePushMsgModel<AdasDataInfo> {
}

View File

@@ -0,0 +1,31 @@
package com.mogo.module.share.adas;
import java.io.Serializable;
/**
* @author nie yunlong
* @des
* @date 2020/10/20
*/
public class BasePushMsgModel<T> implements Serializable {
//行为
private int action;
//结果
private T result;
public int getAction() {
return action;
}
public void setAction(int action) {
this.action = action;
}
public T getResult() {
return result;
}
public void setResult(T result) {
this.result = result;
}
}

View File

@@ -1,6 +1,7 @@
package com.mogo.module.share.strategyreceiver
import android.content.Context
import android.os.Handler
import android.os.SystemClock
import android.util.ArrayMap
import com.mogo.commons.network.SubscribeImpl
@@ -32,6 +33,8 @@ private const val SPEED_RECORD_TIME_INTERVAL = 2 * 60 * 1000L
private const val STOP_FLAG_THRESHOLD = 30
private const val TAG = "BlockUploadStrategy"
private const val DISTANCE_RECORD_TIME = 3 * 60 * 1000L
/**
* 用于计算拥堵策略
*/
@@ -44,6 +47,10 @@ class BlockStrategy(private val context: Context, private val apis: IMogoService
*/
private var stopFlag = 0
private var currentSpeed: Int = 0
private var startRecordDistanceTime = 0L
/**
* 拥堵速度计算上报策略
* 计算[SPEED_RECORD_TIME_INTERVAL]内的平均速度,并上报
@@ -57,6 +64,7 @@ class BlockStrategy(private val context: Context, private val apis: IMogoService
* @param speed 当前速度单位需要是Km/h
*/
fun recordSpeed(speed: Float) {
currentSpeed = speed.toInt()
val current = SystemClock.uptimeMillis()
if (startRecordTime == 0L) {
// 数据初始化
@@ -93,6 +101,60 @@ class BlockStrategy(private val context: Context, private val apis: IMogoService
}
}
private var lastLat: Double = 0.0
private var lastLon: Double = 0.0
/**
* 用于记录行进的距离
*/
private var tripDistance: Int = 0
/**
* 距离策略上报
*
* 1. 过去3分钟行驶距离<1km
* 2. 前车距离<5m获取不到前车距离时默认此项满足
* 3. 当前车速<40km/h
*
* 满足上述条件,自动上报拥堵
*/
fun recordLocation(lat: Double, lon: Double) {
if (lastLat == 0.0) {
// 定位初始化,只判断一个就行了
lastLon = lon
lastLat = lat
} else {
// 记录行进距离
tripDistance += com.mogo.module.service.Utils.calculateLineDistance(lastLon, lastLat, lon, lat).toInt()
val current = SystemClock.uptimeMillis()
if (startRecordDistanceTime == 0L) {
startRecordDistanceTime = current
}
if (current - startRecordDistanceTime >= DISTANCE_RECORD_TIME) {
// 超过阈值,准备判断是否拥堵
startRecordDistanceTime = 0L
if (tripDistance < 1000 && isClose() && currentSpeed < 40) {
Logger.d(TAG, "根据距离,判定为拥堵,准备上报")
val p = TanluUploadParams(IMogoTanluProvider.TYPE_BLOCK, IMogoTanluProvider.UPLOAD_FROM_STRATEGY_BLOCK_AUTO)
val latLon = MogoLatLng(lat, lon)
p.location = latLon
apis.tanluApi.uploadRoadCondition(p)
} else {
Logger.d(TAG, "根据距离,没有判定为拥堵, tripDistance: $tripDistance, frontDistance: $frontDistance, currentSpeed: $currentSpeed")
}
tripDistance = 0
}
}
}
/**
* 没有有效前车距离或者前车距离小于5m
*/
private fun isClose(): Boolean {
return frontDistance in 1..4
}
private fun uploadAverageSpeed(average: Float) {
val params = ArrayMap<String, Any>()
params["speed"] = average.toInt()
@@ -115,4 +177,26 @@ class BlockStrategy(private val context: Context, private val apis: IMogoService
})
}
companion object {
const val MSG_FRONT_DISTANCE_CHECK = 1001
const val FRONT_DISTANCE_CHECK_DELAY = 30_000L
}
private val handler = Handler(Handler.Callback {
if (it.what == MSG_FRONT_DISTANCE_CHECK) {
frontDistance = -1
true
} else {
false
}
})
@Volatile
private var frontDistance: Int = -1
fun refreshFrontDistance(distance: Int) {
handler.removeMessages(MSG_FRONT_DISTANCE_CHECK)
frontDistance = distance
handler.sendEmptyMessageDelayed(MSG_FRONT_DISTANCE_CHECK, FRONT_DISTANCE_CHECK_DELAY)
}
}

View File

@@ -75,4 +75,16 @@ public interface IMogoADASController extends IProvider {
* @param json
*/
void notifyAdas( String json );
/**
* 添加adas数据回调接口
* @param callback 回调接口
*/
void addAdasDataCallback(IMogoAdasDataCallback callback);
/**
* 移除adas数据回调接口
* @param callback 待移除的callback
*/
void removeAdasDataCallback(IMogoAdasDataCallback callback);
}

View File

@@ -0,0 +1,14 @@
package com.mogo.service.adas;
/**
* adas 数据回调接口
*
* @author tongchenfei
*/
public interface IMogoAdasDataCallback {
/**
* adas 数据回调
* @param msg 具体数据
*/
void onAdasDataCallback(String msg);
}

View File

@@ -13,6 +13,7 @@ import com.mogo.map.uicontroller.EnumMapUI;
import com.mogo.module.common.utils.CarSeries;
import com.mogo.service.MogoServicePaths;
import com.mogo.service.adas.IMogoADASController;
import com.mogo.service.adas.IMogoAdasDataCallback;
import com.mogo.service.impl.singleton.SingletonsHolder;
import com.mogo.service.statusmanager.IMogoStatusManager;
import com.mogo.utils.UiThreadHandler;
@@ -24,9 +25,11 @@ import com.zhidao.adasconfig.common.config.EnumCarHeading;
import com.zhidao.adasconfig.common.config.EnumSkinStyle;
import com.zhidao.autopilot.support.api.AutopilotServiceManage;
import com.zhidao.autopilot.support.api.IAutopilotServiceStatusListener;
import com.zhidao.autopilot.support.api.IAutopolitDataCallBack;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import static com.mogo.module.common.utils.SPConst.getSpGuide;
@@ -54,6 +57,8 @@ public class MogoADASController implements IMogoADASController {
private IMogoStatusManager mStatusManager = SingletonsHolder.get( IMogoStatusManager.class );
private List<IMogoAdasDataCallback> adasDataCallbackList = new ArrayList<>();
private boolean mIsReleased = true;
@Override
@@ -90,6 +95,12 @@ public class MogoADASController implements IMogoADASController {
} );
invokeShowADASOperation();
AutopilotServiceManage.getInstance().registerAutopilotDataListener(msg -> {
Logger.d(TAG, "收到adas数据回调: " + msg);
for (IMogoAdasDataCallback callback : adasDataCallbackList) {
callback.onAdasDataCallback(msg);
}
});
}
private void invokeShowADASOperation() {
@@ -220,6 +231,16 @@ public class MogoADASController implements IMogoADASController {
}
}
@Override
public void addAdasDataCallback(IMogoAdasDataCallback callback) {
adasDataCallbackList.add(callback);
}
@Override
public void removeAdasDataCallback(IMogoAdasDataCallback callback) {
adasDataCallbackList.remove(callback);
}
@Override
public void release() {
mIsReleased = true;