[2.13.0-arhc-opt] move monitoring to biz

This commit is contained in:
zhongchao
2023-01-04 21:03:30 +08:00
parent 2b679720bc
commit 19d02aa429
55 changed files with 77 additions and 1032 deletions

View File

@@ -1,22 +1,26 @@
package com.mogo.eagle.function.biz.push
package com.mogo.eagle.function.biz
import android.content.Context
import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.eagle.core.data.camera.CameraEntity
import com.mogo.eagle.core.data.constants.MogoServicePaths
import com.mogo.eagle.core.function.api.biz.IMoGoFuncBizProvider
import com.mogo.eagle.core.function.api.biz.IMoGoNoticeNetCallBack
import com.mogo.eagle.function.biz.push.dispatch.DispatchAutoPilotManager.Companion.dispatchAutoPilotManager
import com.mogo.eagle.function.biz.push.notice.NoticeSocketManager.Companion.noticeSocketManager
import com.mogo.eagle.function.biz.push.notice.network.NoticeNetWorkManager
import com.mogo.eagle.function.biz.dispatch.DispatchAutoPilotManager.Companion.dispatchAutoPilotManager
import com.mogo.eagle.function.biz.monitoring.CronTaskManager.Companion.cronTaskManager
import com.mogo.eagle.function.biz.notice.NoticeSocketManager.Companion.noticeSocketManager
import com.mogo.eagle.function.biz.notice.network.NoticeNetWorkManager
@Route(path = MogoServicePaths.PATH_FUNC_BIZ)
class FuncBizProvider : IMoGoFuncBizProvider {
override val functionName: String
get() = "FuncBiz"
override fun init(context: Context) {
noticeSocketManager.init(context)
dispatchAutoPilotManager.init(context)
cronTaskManager.startCronTask()
}
override fun feedBackNoticeTraffic(infoId: String, sn: String, accept: Int) {
@@ -39,8 +43,24 @@ class FuncBizProvider : IMoGoFuncBizProvider {
dispatchAutoPilotManager.testDispatch(sceneType)
}
override val getCameraList: List<CameraEntity>
get() = cronTaskManager.getCameraList()
override fun openCameraStream(cameraIp: String) {
cronTaskManager.reqOpenCameraStream(cameraIp)
}
override fun openCameraStream(cameraIp: String, success: (String) -> Unit, error: (Throwable) -> Unit) {
cronTaskManager.reqOpenCameraStream(cameraIp, success, error)
}
override fun closeCameraLive() {
cronTaskManager.clear()
}
override fun onDestroy() {
noticeSocketManager.release()
dispatchAutoPilotManager.release()
cronTaskManager.release()
}
}

View File

@@ -1,6 +1,5 @@
package com.mogo.eagle.function.biz.push.dispatch
package com.mogo.eagle.function.biz.dispatch
import android.annotation.SuppressLint
import android.content.Context
import android.os.Handler
import android.os.Message
@@ -22,10 +21,10 @@ import com.mogo.eagle.core.function.call.hmi.CallerHmiListenerManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.function.biz.push.dispatch.network.DispatchServiceModel.Companion.DISPATCH_RESULT_AFFIRM
import com.mogo.eagle.function.biz.push.dispatch.network.DispatchServiceModel.Companion.DISPATCH_RESULT_MANUAL_CANCEL
import com.mogo.eagle.function.biz.push.dispatch.network.DispatchServiceModel.Companion.DISPATCH_RESULT_TIMER_CANCEL
import com.mogo.eagle.function.biz.push.dispatch.network.DispatchServiceModel.Companion.dispatchServiceModel
import com.mogo.eagle.function.biz.dispatch.network.DispatchServiceModel.Companion.DISPATCH_RESULT_AFFIRM
import com.mogo.eagle.function.biz.dispatch.network.DispatchServiceModel.Companion.DISPATCH_RESULT_MANUAL_CANCEL
import com.mogo.eagle.function.biz.dispatch.network.DispatchServiceModel.Companion.DISPATCH_RESULT_TIMER_CANCEL
import com.mogo.eagle.function.biz.dispatch.network.DispatchServiceModel.Companion.dispatchServiceModel
import mogo.telematics.pad.MessagePad

View File

@@ -1,4 +1,4 @@
package com.mogo.eagle.function.biz.push.dispatch.network
package com.mogo.eagle.function.biz.dispatch.network
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.commons.constants.HostConst

View File

@@ -1,4 +1,4 @@
package com.mogo.eagle.function.biz.push.dispatch.network
package com.mogo.eagle.function.biz.dispatch.network
import com.mogo.eagle.core.data.BaseData
import io.reactivex.Observable

View File

@@ -0,0 +1,286 @@
package com.mogo.eagle.function.biz.monitoring
import android.os.Handler
import android.os.Looper
import android.os.Message
import com.mogo.commons.constants.HostConst
import com.mogo.commons.utils.RetryWithDelay
import com.mogo.eagle.core.data.camera.CameraEntity
import com.mogo.eagle.core.data.camera.ReqLiveCarBean
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager
import com.mogo.eagle.function.biz.monitoring.net.ICameraListServices
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MONITOR
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
class CronTaskManager {
companion object {
private const val TAG = "CronTaskManager"
private const val CRON_TASK_TYPE = 1011
val cronTaskManager by lazy(LazyThreadSafetyMode.SYNCHRONIZED){
CronTaskManager()
}
}
// 请求路侧摄像头
private var disposable: Disposable? = null
// 请求车侧摄像头
private var carDisposable: Disposable? = null
// 开启路侧摄像头推流
private var streamDisposable: Disposable? = null
private var streamDisposable2: Disposable? = null
private var cameraList: List<CameraEntity>? = null
private var carCameraList: List<CameraEntity>? = null
private val cronHandler: Handler = object : Handler(Looper.getMainLooper()) {
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
when (msg.what) {
CRON_TASK_TYPE -> {
removeMessages(CRON_TASK_TYPE)
// 路测和车侧摄像头列表分开调用
// requestCameraList()
requestDeviceList()
requestCarCameraList()
sendEmptyMessageDelayed(CRON_TASK_TYPE, 10000)
}
}
}
}
@Deprecated("已废弃", ReplaceWith("requestDeviceList()"), DeprecationLevel.WARNING)
private fun requestCameraList() {
// 衡阳可直播的摄像头有限先写死roadId便于调试
disposable = MoGoRetrofitFactory.getInstance(HostConst.CAMERA_STREAM_HOST)
.create(ICameraListServices::class.java)
.getCameraList("10849")
.subscribeOn(Schedulers.io())
.map { cameraListInfo ->
cameraListInfo.result?.crossings?.flatMap { crossing ->
crossing.cameras.filter { camera ->
!camera.flvUrl.isNullOrEmpty()
}.map {
CameraEntity(
it.flvUrl, "", it.roadName,
it.crossingName, it.getHeadingStr(), it.ip
)
}
} ?: ArrayList()
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
cameraList = it
CallerLogger.d("$M_MONITOR$TAG", "requestCameraList返回结果为$it")
}, {
it.printStackTrace()
CallerLogger.e("$M_MONITOR$TAG", "message is:${it.message}, cause is:${it.cause}")
})
}
/**
* 请求路口一定范围内的设备信息(包含:摄像头、灯)
*/
private fun requestDeviceList() {
CallerMapLocationListenerManager.getCurrentLocation()?.let { location ->
disposable = MoGoRetrofitFactory.getInstance(HostConst.CITY_HOST)
.create(ICameraListServices::class.java)
.getDeviceList(location.longitude, location.latitude, 500)
.subscribeOn(Schedulers.io())
.map { cameraListInfo ->
cameraListInfo.result?.crossings?.flatMap { crossing ->
crossing.cameras.filter { camera ->
!camera.ip.isNullOrEmpty()
}.map {
CameraEntity(
it.flvUrl, "", it.roadName,
it.crossingName, it.getHeadingStr(), it.ip
)
}
} ?: ArrayList()
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
cameraList = it
// CallerLogger.d("$M_MONITOR$TAG", "requestDeviceList返回结果为$it")
}, {
it.printStackTrace()
CallerLogger.e(
"$M_MONITOR$TAG",
"requestDeviceList:message is:${it.message}, cause is:${it.cause}"
)
})
}?: run {
CallerLogger.e("$M_MONITOR$TAG", "CurrentLocation is null!")
}
}
private fun requestCarCameraList() {
CallerMapLocationListenerManager.getCurrentLocation()?.let { location ->
carDisposable = MoGoRetrofitFactory.getInstance(HostConst.CITY_HOST)
.create(ICameraListServices::class.java)
.getCarCameraList(ReqLiveCarBean(location.longitude, location.latitude))
.subscribeOn(Schedulers.io())
.map { liveCarCameraInfo ->
liveCarCameraInfo.result?.liveCamera?.filter { liveCarCamera ->
!liveCarCamera.videoSn.isNullOrEmpty()
}?.map { cameraInfo ->
CameraEntity(
sn = cameraInfo.videoSn,
street = cameraInfo.street,
township = cameraInfo.township
)
} ?: ArrayList()
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
carCameraList = it
// CallerLogger.d("$M_MONITOR$TAG", "requestCarCameraList返回结果为$it")
}, {
CallerLogger.e(
"$M_MONITOR$TAG",
"message is:${it.message}, cause is:${it.cause}"
)
it.printStackTrace()
})
} ?: run {
CallerLogger.e("$M_MONITOR$TAG", "CurrentLocation is null!")
}
}
/**
* 开启从摄像头拉流
*/
@Deprecated("已废弃", ReplaceWith("requestDeviceList()"), DeprecationLevel.WARNING)
fun requestOpenCamera(cameraIp: String) {
streamDisposable?.let {
if (!it.isDisposed) it.dispose()
}
streamDisposable = MoGoRetrofitFactory.getInstance(HostConst.OPEN_CAMERA_STREAM_HOST)
.create(ICameraListServices::class.java)
.openCameraStream(cameraIp)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
CallerLogger.d("$M_MONITOR$TAG", "openCameraStream返回结果为$it")
it.result?.let { streamResult ->
if (!streamResult.flvUrl.isNullOrEmpty()) CallerHmiManager.startRoadCameraLive(
streamResult.flvUrl!!
)
}
}, {
CallerLogger.e(
"$M_MONITOR$TAG",
"openCameraStream&message is:${it.message}, cause is:${it.cause}"
)
CallerHmiManager.showNoSignalView()
it.printStackTrace()
})
}
/**
* 打开单个视频推流
*/
fun reqOpenCameraStream(cameraIp: String) {
streamDisposable?.let {
if (!it.isDisposed) it.dispose()
}
streamDisposable = MoGoRetrofitFactory.getInstance(HostConst.CITY_HOST)
.create(ICameraListServices::class.java)
.reqOpenCameraStream(cameraIp)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
CallerLogger.d("$M_MONITOR$TAG", "reqOpenCameraStream返回结果为$it")
if (!it.flvUrl.isNullOrEmpty()) {
CallerHmiManager.startRoadCameraLive(it.flvUrl!!)
} else {
CallerHmiManager.showNoSignalView()
}
}, {
CallerLogger.e(
"$M_MONITOR$TAG",
"reqOpenCameraStream&message is:${it.message}, cause is:${it.cause}"
)
CallerHmiManager.showNoSignalView()
it.printStackTrace()
})
}
/**
* 供全览模式摄像头业务使用
*/
fun reqOpenCameraStream(cameraIp: String, success: (String) -> Unit, error: (Throwable) -> Unit) {
streamDisposable2?.let {
if (!it.isDisposed) it.dispose()
}
streamDisposable2 = MoGoRetrofitFactory.getInstance(HostConst.CITY_HOST)
.create(ICameraListServices::class.java)
.reqOpenCameraStreamWithRetry(cameraIp)
.flatMap {
if (it.code != 200 && it.code != 0) {
Observable.error(Throwable(it.msg))
} else {
Observable.just(it)
}
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retryWhen(RetryWithDelay())
.subscribe({
CallerLogger.d("$M_MONITOR$TAG", "reqOpenCameraStream返回结果为$it")
if (it.code == 200 || it.code == 0) {
val flvString = it.flvUrl
if (!flvString.isNullOrEmpty()) {
success(flvString)
} else {
error(Throwable("flvUrl为空"))
}
} else {
error(Throwable(it.msg))
}
}, {
CallerLogger.e(
"$M_MONITOR$TAG",
"reqOpenCameraStream&message is:${it.message}, cause is:${it.cause}"
)
error(it)
it.printStackTrace()
})
}
fun startCronTask() {
cronHandler.sendEmptyMessageDelayed(CRON_TASK_TYPE, 0)
}
fun getCameraList() = ArrayList<CameraEntity>().apply {
cameraList?.let { addAll(it) }
carCameraList?.let { addAll(it) }
}
fun clear() {
streamDisposable?.let {
if (!it.isDisposed) it.dispose()
}
}
fun release() {
disposable?.dispose()
carDisposable?.dispose()
streamDisposable?.let {
if (!it.isDisposed) it.dispose()
}
streamDisposable2?.let {
if (!it.isDisposed) it.dispose()
}
cronHandler.removeMessages(CRON_TASK_TYPE)
}
}

View File

@@ -0,0 +1,29 @@
package com.mogo.eagle.function.biz.monitoring.net
import com.mogo.eagle.core.data.camera.*
import io.reactivex.Observable
import io.reactivex.Single
import retrofit2.http.*
interface ICameraListServices {
@GET("/yycp-smartTransportationAiCloud-service/eagle/device/list")
fun getCameraList(@Query("roadId") roadId: String?): Single<CameraListInfo?>
@POST("/yycp-launcherSnapshot/car/queryLiveCarByLocal")
fun getCarCameraList(@Body reqBody: ReqLiveCarBean): Single<LiveCarCameraInfo?>
@GET("/openStream/{cameraIp}")
fun openCameraStream(@Path("cameraIp") cameraIp: String): Single<CameraStreamEntity>
@GET("/camera-stream/stream/camera/openStream")
fun reqOpenCameraStream(@Query("ip") cameraIp: String): Single<OpenCameraStreamEntity>
@GET("/mec-etl-server/crossing/geo/device")
fun getDeviceList(
@Query("lon") lon: Double, @Query("lat") lat: Double,
@Query("radiusMeter") radiusMeter: Int
): Single<CameraListInfo?>
@GET("/camera-stream/stream/camera/openStream")
fun reqOpenCameraStreamWithRetry(@Query("ip") cameraIp: String): Observable<OpenCameraStreamEntity>
}

View File

@@ -1,4 +1,4 @@
package com.mogo.eagle.function.biz.push.notice
package com.mogo.eagle.function.biz.notice
import android.content.Context
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d

View File

@@ -1,4 +1,4 @@
package com.mogo.eagle.function.biz.push.notice.network;
package com.mogo.eagle.function.biz.notice.network;
import com.mogo.eagle.core.data.BaseData;
import com.mogo.eagle.core.data.notice.NoticeNormalDetail;