From 8a8d0bf56ab715311ae7e900370cbbe1903d434a Mon Sep 17 00:00:00 2001 From: xinfengkun Date: Fri, 15 Mar 2024 13:59:47 +0800 Subject: [PATCH] =?UTF-8?q?[630][adas]=20=E4=BF=AE=E5=A4=8D=E5=A4=84?= =?UTF-8?q?=E4=BA=8EPING=E7=8A=B6=E6=80=81=E6=97=B6=EF=BC=8C=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E5=81=9C=E6=AD=A2PING=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autopilot/MoGoAutopilotControlProvider.kt | 10 ++ .../autopilot/adapter/MoGoAdasListenerImpl.kt | 15 -- .../MoGoAdasMsgConnectStatusListenerImpl.kt | 149 +++++++++++++++--- .../hmi/ui/setting/DebugSettingView.kt | 141 ++++++++++------- .../mogo/eagle/core/data/app/AppConfigInfo.kt | 2 +- .../data/autopilot/AutopilotStatusInfo.kt | 10 +- .../eagle/core/data/constants/MoGoConfig.kt | 1 + .../call/cloud/CallerCloudCertManager.kt | 14 +- .../zhidao/support/adas/high/AdasChannel.java | 6 +- .../high/OnAdasConnectStatusListener.java | 13 ++ .../support/adas/high/OnAdasListener.java | 12 -- 11 files changed, 251 insertions(+), 122 deletions(-) diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt index fb5258738e..b8fbc960c6 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt @@ -30,6 +30,7 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotControlProvider import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_RAIN import com.mogo.eagle.core.function.api.map.collect.IMoGoMapDataCollectProvider import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager +import com.mogo.eagle.core.function.call.cloud.CallerCloudCertManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager import com.mogo.eagle.core.function.call.map.CallerMapDataCollectorManager @@ -125,6 +126,9 @@ class MoGoAutopilotControlProvider : .setConnectionMode(AdasOptions.IPC_CONNECTION_MODE.PING) .setPingAddressList(AdasManager.getInstance().pingAddressList) .setPassenger(false) + .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean(MoGoConfig.AUTOPILOT_CERTIFICATION, MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) + .setRootCrt(CallerCloudCertManager.getRootCrtF()) + .setDeviceCrt(CallerCloudCertManager.getDeviceCrtF()) .setUnableLaunchAutopilotGear(FunctionBuildConfig.unableLaunchAutopilotGear) // .setSubscribeInterfaceOptions(subscribeInterfaceOptions)// .build() @@ -253,6 +257,9 @@ class MoGoAutopilotControlProvider : .setConnectionMode(AdasOptions.IPC_CONNECTION_MODE.PING) .setPingAddressList(AdasManager.getInstance().pingAddressList) .setPassenger(false)// 乘客端直连工控机改为false + .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean(MoGoConfig.AUTOPILOT_CERTIFICATION, MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) + .setRootCrt(CallerCloudCertManager.getRootCrtF()) + .setDeviceCrt(CallerCloudCertManager.getDeviceCrtF()) .setUnableLaunchAutopilotGear(FunctionBuildConfig.unableLaunchAutopilotGear) .build() AdasManager.getInstance().create(mContext, options, MoGoAdasMsgConnectStatusListenerImpl()) @@ -311,6 +318,9 @@ class MoGoAutopilotControlProvider : // 设置IP地址 val options = AdasOptions.newBuilder() .setPassenger(false) + .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean(MoGoConfig.AUTOPILOT_CERTIFICATION, MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) + .setRootCrt(CallerCloudCertManager.getRootCrtF()) + .setDeviceCrt(CallerCloudCertManager.getDeviceCrtF()) .setConnectionMode(AdasOptions.IPC_CONNECTION_MODE.SPECIFIED) .setSpecifiedAddress(autoPilotIp) .build() diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt index de61dc577f..1b856b1ab8 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt @@ -369,20 +369,6 @@ class MoGoAdasListenerImpl : OnAdasListener { invokeAutopilotSNRequest(basicInfoReq) } - /** - * 域控证书认证状态 - * 启用认证需要配置 AdasOptions.setEnableCertification() - * 连接时启用认证 后才会有证认结果 - * ROOT证书异常会影响校验域控证书 - * PAD证书异常会影响域控端校验的证书校验,域控端证书校验失败将会断开连接,且并不会给出断开原因,ADAS LIB会执行重连操作(如果配置启用重连) - * 假如校验域控证书认证失败会主动断开连接,且不进行重连 - * - * @param status 域控证书认证结果{@link AdasConstants.CertificationStatus} - */ - override fun onCertification(status: AdasConstants.CertificationStatus) { - - } - //工控机基础配置信息 @ChainLog( linkChainLog = CHAIN_TYPE_STATUS, @@ -400,7 +386,6 @@ class MoGoAdasListenerImpl : OnAdasListener { AppConfigInfo.plateNumber = carConfigResp.plateNumber//车牌号 AppConfigInfo.iPCMacAddress = carConfigResp.macAddress//工控机MAC地址 AppConfigInfo.protocolVersionNumber = carConfigResp.protocolVersionValue//工控机协议版本 - AppConfigInfo.isConnectAutopilot = true invokeAutopilotCarConfigData(carConfigResp) } } diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt index c36c6cfd54..494f219b3e 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt @@ -1,5 +1,6 @@ package com.mogo.eagle.core.function.datacenter.autopilot.adapter +import android.text.TextUtils import com.mogo.commons.debug.DebugConfig.NET_MODE_DEMO import com.mogo.commons.debug.DebugConfig.NET_MODE_DEV import com.mogo.commons.debug.DebugConfig.NET_MODE_QA @@ -22,6 +23,7 @@ import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_D_C +import com.mogo.eagle.core.utilcode.util.AppUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.zhidao.support.adas.high.AdasManager import com.zhidao.support.adas.high.OnAdasConnectStatusListener @@ -34,6 +36,7 @@ import com.zhidao.support.adas.high.common.Constants.TERMINAL_ROLE.DRIVER import com.zhidao.support.adas.high.common.Constants.TERMINAL_ROLE.PASSENGER import com.zhjt.mogo.adas.data.AdasConstants import mogo.telematics.pad.MessagePad +import java.util.concurrent.atomic.AtomicBoolean /** * ADAS-SDK与工控机连接状态回调 @@ -52,9 +55,15 @@ class MoGoAdasMsgConnectStatusListenerImpl : @Volatile private var isFirstDisconnected = false//只有连接成功后断开连接才加入消息盒子 + private val isReceivedBasicInfoReq = AtomicBoolean(false)//是否接收到域控基础信息请求 + private val isSentBasicInfoReq = AtomicBoolean(false)//是否已回复域控基础信息请求 + + @Volatile + private var certificationResult = "" init { CallerCloudListenerManager.addListener(TAG, this) + CallerAutoPilotStatusListenerManager.addListener(TAG, this) CallerAutopilotActionsListenerManager.setConnected(AdasManager.getInstance().ipcConnectionStatus == AdasConstants.IpcConnectionStatus.CONNECTED) CallerParallelDrivingActionsListenerManager.setConnected(AdasManager.getInstance().ipcConnectionStatus == AdasConstants.IpcConnectionStatus.CONNECTED) } @@ -68,11 +77,11 @@ class MoGoAdasMsgConnectStatusListenerImpl : AdasManager.getInstance().ipcConnectedIp CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectPort = AdasManager.getInstance().ipcConnectedPort - CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectStatus = false - AppConfigInfo.isConnectAutopilot = false //与工控机断开连接,需要重置自动驾驶状态(包括上传至云平台缓存信息),等待连接成功后同步状态信息 CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().state = 0 CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().pilotmode = 0 + isReceivedBasicInfoReq.set(false) + isSentBasicInfoReq.set(false) } /** @@ -85,11 +94,16 @@ class MoGoAdasMsgConnectStatusListenerImpl : * {@link AdasConstants.IpcConnectionStatus#SERVER_DISCONNECTED} 服务端断开(如果服务端关闭时发送了原因将存在,如果服务端关闭时未发送将为null) */ override fun onConnectionIPCStatus(status: AdasConstants.IpcConnectionStatus, reason: String?) { - CallerAutopilotActionsListenerManager.setConnected(status == AdasConstants.IpcConnectionStatus.CONNECTED) - CallerParallelDrivingActionsListenerManager.setConnected(status == AdasConstants.IpcConnectionStatus.CONNECTED) - AppConfigInfo.connectStatusDescribe = reason + val isConnected = status == AdasConstants.IpcConnectionStatus.CONNECTED + CallerAutopilotActionsListenerManager.setConnected(isConnected) + CallerParallelDrivingActionsListenerManager.setConnected(isConnected) + CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectStatus = isConnected + AppConfigInfo.isConnectAutopilot = isConnected + + var connectStatusDescribe = "未连接" when (status) { AdasConstants.IpcConnectionStatus.DISCONNECTED -> { + connectStatusDescribe = "主动断开连接" CallerLogger.d( "$M_D_C$TAG", "未连接或主动断开连接(未连接:鹰眼首次启动时未调用连接函数【目前鹰眼默认启动就会调用连接函数】;主动断开连接:主动调用断开连接函数;)" @@ -98,7 +112,8 @@ class MoGoAdasMsgConnectStatusListenerImpl : } AdasConstants.IpcConnectionStatus.CONNECTED -> { - CallerLogger.d("$M_D_C$TAG", "已连接") + connectStatusDescribe = "已连接" + CallerLogger.d("$M_D_C$TAG", connectStatusDescribe) // 初始化自动驾驶状态信息 CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectIP = AdasManager.getInstance().ipcConnectedIp @@ -106,10 +121,6 @@ class MoGoAdasMsgConnectStatusListenerImpl : AdasManager.getInstance().ipcConnectedPort CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().version = AdasManager.getInstance().adasVersion - CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectStatus = true - AppConfigInfo.isConnectAutopilot = true - // 同步SN给工控机 - syncBasicInfoToAutopilot() //每次工控机连接成功后,需同步当前设置的美化模式状态 CallerAutoPilotControlManager.setDemoMode(FunctionBuildConfig.isDemoMode) //当连接状态是关闭美化模式时,同步给工控机 @@ -122,92 +133,157 @@ class MoGoAdasMsgConnectStatusListenerImpl : } AdasConstants.IpcConnectionStatus.CONNECTING -> { - CallerLogger.d("$M_D_C$TAG", "域控连接中") + connectStatusDescribe = "连接中" + CallerLogger.d("$M_D_C$TAG", connectStatusDescribe) connectToast("域控连接中") } AdasConstants.IpcConnectionStatus.RECONNECTING_TIMER -> { - CallerLogger.d("$M_D_C$TAG", "域控重连中(定时器)") + connectStatusDescribe = "重连中(定时器)" + CallerLogger.d("$M_D_C$TAG", connectStatusDescribe) connectToast("域控重连中") } AdasConstants.IpcConnectionStatus.RECONNECTING_NETWORK -> { - CallerLogger.d("$M_D_C$TAG", "域控重连中(网络监听)") + connectStatusDescribe = "重连中(网络监听)" + CallerLogger.d("$M_D_C$TAG", connectStatusDescribe) connectToast("域控重连中") } AdasConstants.IpcConnectionStatus.CONNECT_EXCEPTION -> { + connectStatusDescribe = + "连接异常(鹰眼与域控连接失败、无法连接、非正常断开等),原因:$reason" CallerLogger.d( "$M_D_C$TAG", - "连接异常(表示鹰眼与域控连接失败、无法连接、非正常断开等),原因:$reason" + connectStatusDescribe ) resetArgs() } AdasConstants.IpcConnectionStatus.ILLEGAL_ADDRESS -> { + connectStatusDescribe = + "非法地址(连接模式为指定地址时:表示当前鹰眼调用连接时传入的域控地址错误或不符合规则【不修改默认配置不会出现此问题】;连接模式为PING模式时:表示传入的PING地址列表存在问题)" CallerLogger.d( "$M_D_C$TAG", - "非法地址(连接模式为指定地址时:表示当前鹰眼调用连接时传入的域控地址错误或不符合规则【不修改默认配置不会出现此问题】;连接模式为PING模式时:表示传入的PING地址列表存在问题)" + connectStatusDescribe ) resetArgs() connectToast("非法域控地址") } AdasConstants.IpcConnectionStatus.SEARCH_ADDRESS -> { + connectStatusDescribe = "正在搜索域控地址" CallerLogger.d( "$M_D_C$TAG", - "正在搜索域控地址(表示当前鹰眼正在查找是否有可用的域控地址)" + connectStatusDescribe ) connectToast("正在搜索域控地址") } AdasConstants.IpcConnectionStatus.NOT_FOUND_ADDRESS -> { + connectStatusDescribe = + "找不到可用地址(域控地址列表中的全部地址均无法连通【不修改默认配置的情况下需要排查PAD是否连接车载路由器、工控机是否连接车载路由器、工控机是否开机等】)" CallerLogger.d( "$M_D_C$TAG", - "找不到可用地址(当前鹰眼配置的域控地址列表中的全部地址均无法PING通【不修改默认配置的情况下需要排查PAD是否连接车载路由器、工控机是否连接车载路由器、工控机是否开机等】)" + connectStatusDescribe ) resetArgs() } AdasConstants.IpcConnectionStatus.CERTIFICATION_FAILED -> { + connectStatusDescribe = + "域控证书认证异常(鹰眼端或鹰眼端和域控端启用认证后出现异常),原因$certificationResult" CallerLogger.d( "$M_D_C$TAG", - "认证异常(表示鹰眼端或鹰眼端和域控端启用认证后,认证出现异常。具体认证异常状态详情见认证状态CertificationStatus【鹰眼端验证域控证书失败会断开连接不进行重连;域控端验证鹰眼端证书失败会断开连接,但是由于域控断开并没有发送断开的原因所以鹰眼会自动重连,重连次数可配置为:用不重连、无限重连、指定次数重连】)" + "域控证书认证异常(鹰眼端或鹰眼端和域控端启用认证后,认证出现异常。具体认证异常状态详情见认证状态CertificationStatus【鹰眼端验证域控证书失败会断开连接不进行重连;域控端验证鹰眼端证书失败会断开连接,但是由于域控断开并没有发送断开的原因所以鹰眼会自动重连,重连次数可配置为:用不重连、无限重连、指定次数重连】)" ) resetArgs() } AdasConstants.IpcConnectionStatus.HEARTBEAT_TIMEOUT -> { + connectStatusDescribe = + "心跳超时(连接域控成功后在一段时间内未收到域控任何数据),超时时间:${reason}秒" CallerLogger.d( "$M_D_C$TAG", - "心跳超时(表示连接域控成功后在一段时间内未收到域控任何数据,默认4秒【可以配置】),超时时间:${reason}秒" + connectStatusDescribe ) resetArgs() } AdasConstants.IpcConnectionStatus.PROTOCOL_MISMATCH -> { + connectStatusDescribe = "協議不匹配(被连接的域控端非WebSocket协议【可能性非常低】)" CallerLogger.d( "$M_D_C$TAG", - "協議不匹配(表示被连接的服务端非WebSocket协议【可能性非常低】)" + connectStatusDescribe ) resetArgs() } AdasConstants.IpcConnectionStatus.SERVER_DISCONNECTED -> { + connectStatusDescribe = + "域控主动断开连接(域控主动发起断开WebSocket连接,目前主要原因有:1.证书认证失败;2.老版本MAP不支持多连接的情况下会踢掉客户端;),域控断开发送的消息:${reason}" CallerLogger.d( "$M_D_C$TAG", - "域控主动断开连接(表示域控主动发起断开WebSocket连接,目前主要原因有:1.证书认证失败;2.老版本MAP不支持多连接的情况下会踢掉客户端;),域控断开发送的消息:${reason}" + connectStatusDescribe ) resetArgs() } } + AppConfigInfo.connectStatusDescribe = connectStatusDescribe CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().ipcConnStatus = status - CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectStatusDescribe = reason + CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectStatusReason = reason CallerAutoPilotStatusListenerManager.invokeAutoPilotStatus() CallerAutoPilotStatusListenerManager.invokeAutoPilotIPCStatusChanged(status, reason) saveIntoMsgBox(status, reason) } + /** + * 域控证书认证状态 + * 启用认证需要配置 AdasOptions.setEnableCertification() + * 连接时启用认证 后才会有证认结果 + * ROOT证书异常会影响校验域控证书 + * PAD证书异常会影响域控端校验的证书校验,域控端证书校验失败将会断开连接,且并不会给出断开原因,ADAS LIB会执行重连操作(如果配置启用重连) + * 假如校验域控证书认证失败会主动断开连接,且不进行重连 + * + * @param status 域控证书认证结果{@link AdasConstants.CertificationStatus} + */ + override fun onCertification(status: AdasConstants.CertificationStatus) { + if (status == AdasConstants.CertificationStatus.TIMEOUT) { + certificationResult = ":认证超时"; + CallerLogger.d( + "$M_D_C$TAG", + "域控证书认证超时(表示域控未发送BasicInfoReq接口的数据【这种情况可能是连接出现了问题】)" + ) + } else { + if (status != AdasConstants.CertificationStatus.NOT_ENABLED) { + if (status == AdasConstants.CertificationStatus.CERTIFICATE_CHAIN_SUCCESS) { + CallerLogger.d( + "$M_D_C$TAG", + "域控证书链校验成功" + ) + } else if (status == AdasConstants.CertificationStatus.ROOT_CRT_ERROR) { + certificationResult = ":ROOT证书异常"; + CallerLogger.d( + "$M_D_C$TAG", + "ROOT证书异常(表示未传递证书,没有拿到ROOT证书)" + ) + } else if (status == AdasConstants.CertificationStatus.IPC_CRT_ERROR) { + certificationResult = ":域控证书异常"; + CallerLogger.d( + "$M_D_C$TAG", + "域控证书异常(表示域控发送了BasicInfoReq接口的数据但是未传递证书或证书解码失败【失败的可能性很低】)" + ) + } else if (status == AdasConstants.CertificationStatus.CERTIFICATE_CHAIN_FAILED) { + certificationResult = ":证书链校验失败"; + CallerLogger.d( + "$M_D_C$TAG", + "域控证书链校验失败(表示证书链未验证通过。证书不匹配、证书格式不正确)" + ) + } + } + } + } + private fun saveIntoMsgBox( status: AdasConstants.IpcConnectionStatus, reason: String? @@ -219,6 +295,7 @@ class MoGoAdasMsgConnectStatusListenerImpl : isFirstException = true isFirstDisconnected = true } + AdasConstants.IpcConnectionStatus.DISCONNECTED -> { if (isFirstDisconnected) { title = "连接异常" @@ -239,14 +316,22 @@ class MoGoAdasMsgConnectStatusListenerImpl : isFirstException = false } } + + AdasConstants.IpcConnectionStatus.CERTIFICATION_FAILED -> { + title = "连接异常" + content = "域控证书认证异常$certificationResult" + } + AdasConstants.IpcConnectionStatus.HEARTBEAT_TIMEOUT -> { title = "连接异常" content = "域控心跳超时" } + AdasConstants.IpcConnectionStatus.SERVER_DISCONNECTED -> { title = "连接异常" content = "域控主动断开连接" } + else -> {} } if (title.isNotEmpty() && content.isNotEmpty()) { @@ -267,7 +352,11 @@ class MoGoAdasMsgConnectStatusListenerImpl : * 工控机获取SN */ override fun onAutopilotSNRequest(basicInfoReq: MessagePad.BasicInfoReq) { - syncBasicInfoToAutopilot() + CallerLogger.d("$M_D_C$TAG", "收到域控基础信息请求"); + isReceivedBasicInfoReq.set(true) + if (!TextUtils.isEmpty(SharedPrefsMgr.getInstance().sn)) { + syncBasicInfoToAutopilot() + } } /** @@ -281,7 +370,9 @@ class MoGoAdasMsgConnectStatusListenerImpl : .sendBasicInfoResp( SharedPrefsMgr.getInstance().sn, getEnvironment(), - getTerminalRole() + getTerminalRole(), + AppUtils.getAppVersionCode(), + AppUtils.getAppVersionName() ) } else { // 乘客屏先不传sn @@ -289,9 +380,12 @@ class MoGoAdasMsgConnectStatusListenerImpl : .sendBasicInfoResp( "", getEnvironment(), - getTerminalRole() + getTerminalRole(), + AppUtils.getAppVersionCode(), + AppUtils.getAppVersionName() ) } + isSentBasicInfoReq.set(true) } private fun getEnvironment(): Int { @@ -313,7 +407,10 @@ class MoGoAdasMsgConnectStatusListenerImpl : } override fun tokenGot(token: String, sn: String) { - syncBasicInfoToAutopilot() + CallerLogger.d("$M_D_C$TAG", "SN获取成功=$sn"); + if (isReceivedBasicInfoReq.get() && !isSentBasicInfoReq.get()) {//已收到域控基础信息请求,但是之前SN没有所以还未回复,现在获取到SN后再进行回复 + syncBasicInfoToAutopilot() + } } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index 88c7e0146a..28b3b3734f 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -29,6 +29,7 @@ import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.commons.constants.SharedPrefsConstants import com.mogo.commons.debug.DebugConfig import com.mogo.commons.module.status.MogoStatusManager +import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.config.HmiBuildConfig @@ -49,6 +50,7 @@ import com.mogo.eagle.core.data.multidisplay.TelematicConstant import com.mogo.eagle.core.data.obu.MogoObuConst import com.mogo.eagle.core.data.obu.ObuStatusInfo import com.mogo.eagle.core.function.api.autopilot.* +import com.mogo.eagle.core.function.api.cloud.IMoGoCloudListener import com.mogo.eagle.core.function.api.datacenter.obu.IMoGoObuConnectListener import com.mogo.eagle.core.function.api.datacenter.obu.IMoGoObuInfoListener import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsFuncConfigListener @@ -58,6 +60,8 @@ import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion. import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_RAIN import com.mogo.eagle.core.function.api.setting.ISopSettingListener import com.mogo.eagle.core.function.call.autopilot.* +import com.mogo.eagle.core.function.call.cloud.CallerCloudCertManager +import com.mogo.eagle.core.function.call.cloud.CallerCloudListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager @@ -82,15 +86,12 @@ import com.mogo.eagle.core.utilcode.mogo.logger.LogLevel import com.mogo.eagle.core.utilcode.mogo.logger.Logger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.mogo.permissions.BackgrounderPermission -import com.mogo.commons.storage.SharedPrefsMgr -import com.mogo.eagle.core.function.api.cloud.IMoGoCloudListener -import com.mogo.eagle.core.function.call.cloud.CallerCloudCertManager -import com.mogo.eagle.core.function.call.cloud.CallerCloudListenerManager import com.mogo.eagle.core.utilcode.mogo.toast.TipToast import com.mogo.eagle.core.utilcode.util.* import com.mogo.map.MogoData.Companion.mogoMapData import com.mogo.map.uicontroller.VisualAngleMode import com.mogo.map.uicontroller.VisualAngleMode.* +import com.zhjt.mogo.adas.data.AdasConstants import com.zhjt.service.chain.ChainLog import kotlinx.android.synthetic.main.view_debug_setting.view.* import kotlinx.coroutines.* @@ -193,6 +194,8 @@ internal class DebugSettingView @JvmOverloads constructor( // 高精地图是否已缓存 private var isHDCached = false + private var isClickCheckedCbSsl = false//是否已经点击且选中证书认证按钮 + private var isFirstDownLoadCertHint = false init { LayoutInflater.from(context).inflate(R.layout.view_debug_setting, this, true) @@ -724,8 +727,8 @@ internal class DebugSettingView @JvmOverloads constructor( CallerAutoPilotControlManager.setDemoMode(FunctionBuildConfig.isDemoMode) CallerSopSettingManager.invokeDemoModeListener(isChecked) CallerHmiViewControlListenerManager.invokeFuncMode( - FUNC_MODE_DEMO, - FunctionBuildConfig.isDemoMode + FUNC_MODE_DEMO, + FunctionBuildConfig.isDemoMode ) if (!FunctionBuildConfig.isDemoMode) { //关闭美化模式时,通知工控机 @@ -1058,8 +1061,16 @@ internal class DebugSettingView @JvmOverloads constructor( ToastUtils.showLong("经纬度复制成功") } - val certTxt = if(CallerCloudCertManager.getRootCrtF().isNullOrEmpty()) "未下载证书" else "已下载证书" - tvCertFile.text = "证书状态: $certTxt" + val certTxt = + if (CallerCloudCertManager.getRootCrtF() + .isNullOrEmpty() + ) "未下载证书" else "已下载证书" + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + tvCertFile.text = Html.fromHtml("证书状态: $certTxt", Html.FROM_HTML_MODE_LEGACY) + } else { + tvCertFile.text = Html.fromHtml("证书状态: $certTxt") + } + //状态中心-后台优化状态 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { @@ -1272,27 +1283,49 @@ internal class DebugSettingView @JvmOverloads constructor( } } //是否启用证书认证 - cbSsl.isChecked = SharedPrefsMgr.getInstance().getBoolean(MoGoConfig.AUTOPILOT_CERTIFICATION,false) + cbSsl.isChecked = + SharedPrefsMgr.getInstance().getBoolean( + MoGoConfig.AUTOPILOT_CERTIFICATION, + MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE + ) cbSsl.setOnCheckedChangeListener { _, isChecked -> - cbSsl.isChecked = isChecked - SharedPrefsMgr.getInstance().putBoolean(MoGoConfig.AUTOPILOT_CERTIFICATION,isChecked) - //下载证书 - if(isChecked){ - if(CallerCloudCertManager.getRootCrtF().isNullOrEmpty()){ - CallerCloudCertManager.certFileDownLoad{ errorMsg -> + isClickCheckedCbSsl = isChecked +// 下载证书 + if (isChecked) { + if (CallerCloudCertManager.getRootCrtF().isNullOrEmpty()) { + if (!isFirstDownLoadCertHint) { + isFirstDownLoadCertHint = true + ToastUtils.showShort("证书文件不存在,正在下载") + } + cbSsl.isChecked = false + CallerCloudCertManager.certFileDownLoad { errorMsg -> ThreadUtils.runOnUiThread { ToastUtils.showShort(errorMsg) } } } } + SharedPrefsMgr.getInstance() + .putBoolean(MoGoConfig.AUTOPILOT_CERTIFICATION, cbSsl.isChecked) } } override fun authCrtFile(device: String, root: String) { super.authCrtFile(device, root) ThreadUtils.runOnUiThread { - tvCertFile.text = "证书状态: 已下载证书" + if (isClickCheckedCbSsl) { + cbSsl.isChecked = true + SharedPrefsMgr.getInstance() + .putBoolean(MoGoConfig.AUTOPILOT_CERTIFICATION, true) + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + tvCertFile.text = Html.fromHtml( + "证书状态: 已下载证书", + Html.FROM_HTML_MODE_LEGACY + ) + } else { + tvCertFile.text = Html.fromHtml("证书状态: 已下载证书") + } } } @@ -1426,10 +1459,10 @@ internal class DebugSettingView @JvmOverloads constructor( /** * 设置是否开启pre check, true-打开,false-关闭 */ - tbTraceEnable.isChecked = SharedPrefsMgr.getInstance().getBoolean("TRACE_ENABLE",true) + tbTraceEnable.isChecked = SharedPrefsMgr.getInstance().getBoolean("TRACE_ENABLE", true) tbTraceEnable.setOnCheckedChangeListener { _, isChecked -> - HmiActionLog.hmiAction(TAG + "TRACE_ENABLE",isChecked) - SharedPrefsMgr.getInstance().putBoolean("TRACE_ENABLE",isChecked) + HmiActionLog.hmiAction(TAG + "TRACE_ENABLE", isChecked) + SharedPrefsMgr.getInstance().putBoolean("TRACE_ENABLE", isChecked) CallerDevaToolsManager.setTraceEnable(isChecked) } @@ -1924,55 +1957,47 @@ internal class DebugSettingView @JvmOverloads constructor( } } - /** - * 自动驾驶状态回调 - */ - override fun onAutopilotStatusResponse(state: Int) { - setAutopilotConnectStatus() + override fun onAutopilotIpcConnectStatusChanged( + status: AdasConstants.IpcConnectionStatus, + reason: String? + ) { + setAutopilotConnectStatus(status) } /** * 设置工控机连接状态 */ - private fun setAutopilotConnectStatus() { - ThreadUtils.runOnUiThread { - tvAutopilotConnectStatus.text = Html.fromHtml( - "工控机连接状态:${ - if (AppConfigInfo.isConnectAutopilot) { - "正常" - } else { - "异常 原因:${ - if (AppConfigInfo.connectStatusDescribe.isNullOrEmpty()) { - "主动断开连接" - } else { - AppConfigInfo.connectStatusDescribe - } - }" - } - }" - ) + private fun setAutopilotConnectStatus(status: AdasConstants.IpcConnectionStatus = AdasConstants.IpcConnectionStatus.DISCONNECTED) { + val color = when (status) { + AdasConstants.IpcConnectionStatus.CONNECTED -> { + "" + } - if (AppConfigInfo.isConnectAutopilot) { + AdasConstants.IpcConnectionStatus.CONNECTING, + AdasConstants.IpcConnectionStatus.RECONNECTING_TIMER, + AdasConstants.IpcConnectionStatus.RECONNECTING_NETWORK, + AdasConstants.IpcConnectionStatus.SEARCH_ADDRESS -> { + "" + } + + else -> { + "" + } + } + val msg = Html.fromHtml("工控机连接状态:${color}${AppConfigInfo.connectStatusDescribe}") + ThreadUtils.runOnUiThread { + tvAutopilotConnectStatus.text = msg + if (status == AdasConstants.IpcConnectionStatus.CONNECTED || + status == AdasConstants.IpcConnectionStatus.CONNECTING || + status == AdasConstants.IpcConnectionStatus.RECONNECTING_TIMER || + status == AdasConstants.IpcConnectionStatus.RECONNECTING_NETWORK || + status == AdasConstants.IpcConnectionStatus.SEARCH_ADDRESS + ) { tvIpcConnectStatus.minLines = 1 } else { tvIpcConnectStatus.minLines = 4 } - - tvIpcConnectStatus.text = Html.fromHtml( - "工控机连接状态:${ - if (AppConfigInfo.isConnectAutopilot) { - "正常" - } else { - "异常 原因:${ - if (AppConfigInfo.connectStatusDescribe.isNullOrEmpty()) { - "主动断开连接" - } else { - AppConfigInfo.connectStatusDescribe - } - }" - } - }" - ) + tvIpcConnectStatus.text = msg //如果是乘客端,则不显示工控机连接状态 if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { tvIpcConnectStatus.visibility = View.GONE diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/app/AppConfigInfo.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/app/AppConfigInfo.kt index e97023a865..24755f3ee5 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/app/AppConfigInfo.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/app/AppConfigInfo.kt @@ -76,7 +76,7 @@ object AppConfigInfo { var isConnectAutopilot: Boolean = false //连接工控机状态文字描述 - var connectStatusDescribe: String? = null + var connectStatusDescribe: String = "未连接" // 是否OBU var isConnectObu: Boolean = false diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotStatusInfo.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotStatusInfo.kt index 5029ff9526..3a3b6d3e5d 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotStatusInfo.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotStatusInfo.kt @@ -23,9 +23,9 @@ open class AutopilotStatusInfo : Serializable, Cloneable { var connectStatus = false /** - * 工控机连接状态文字描述 + * 工控机连接状态返回的Reason */ - var connectStatusDescribe: String? = null + var connectStatusReason: String? = null var version: String? = null /** @@ -78,11 +78,11 @@ open class AutopilotStatusInfo : Serializable, Cloneable { var isArriveAtStation: Boolean = false override fun toString(): String { - return "connectIP=$connectIP, connectPort=$connectPort, " + - "connectStatus=$connectStatus, connectDescribe=$connectStatusDescribe, version=$version, dockVersion=$dockVersion," + + return "IPCConnectIP=$connectIP, IPCConnectPort=$connectPort, " + + "IPCConnected=$connectStatus, IPCConnectStatus=$ipcConnStatus, IPCConnectDescribe=$connectStatusReason, version=$version, dockVersion=$dockVersion," + " locationStatus=$locationStatus), locationLat=$locationLat, locationLon=$locationLon," + " satelliteTime=$satelliteTime, state=$state, " + - " pilotmode=$pilotmode, ipcConnStatus=$ipcConnStatus, autopilotControlParameters=$autopilotControlParameters" + " pilotmode=$pilotmode, autopilotControlParameters=$autopilotControlParameters" } public override fun clone(): AutopilotStatusInfo { diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MoGoConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MoGoConfig.kt index 5d877bf2a2..57ee41178b 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MoGoConfig.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MoGoConfig.kt @@ -13,6 +13,7 @@ object MoGoConfig { const val AUTOPILOT_IP = "AUTOPILOT_IP" //调试窗控制连接域控时是否启用认证存储key const val AUTOPILOT_CERTIFICATION = "AUTOPILOT_CERTIFICATION" + const val AUTOPILOT_CERTIFICATION_DEFAULT_VALUE = false // CMD全量日志抓取 const val CATCH_LOG = "CATCH_LOG" diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/cloud/CallerCloudCertManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/cloud/CallerCloudCertManager.kt index 0961d2c082..0209304d68 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/cloud/CallerCloudCertManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/cloud/CallerCloudCertManager.kt @@ -1,10 +1,12 @@ package com.mogo.eagle.core.function.call.cloud +import com.elegant.analytics.utils.Base64 import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.function.api.cloud.IMoGoCertProvider import com.mogo.eagle.core.function.call.base.CallerBase import com.zhjt.service.chain.ChainLog +import java.nio.charset.StandardCharsets object CallerCloudCertManager { @@ -25,10 +27,18 @@ object CallerCloudCertManager { } fun getDeviceCrtF(): String? { - return certProviderApi.getDeviceCrtF() + var crt = certProviderApi.getDeviceCrtF() + if (!crt.isNullOrEmpty()) { + crt = String(Base64.decode(crt, Base64.NO_WRAP), StandardCharsets.UTF_8) + } + return crt } fun getRootCrtF(): String? { - return certProviderApi.getRootCrtF() + var crt = certProviderApi.getRootCrtF() + if (!crt.isNullOrEmpty()) { + crt = String(Base64.decode(crt, Base64.NO_WRAP), StandardCharsets.UTF_8) + } + return crt } } \ No newline at end of file diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java index 76ad39b7f0..57ca479e82 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java @@ -590,8 +590,8 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec } } } - if (mAdasListener != null) { - mAdasListener.onCertification(result); + if (adasConnectStatusListener != null) { + adasConnectStatusListener.onCertification(result); } CupidLogUtils.log(TAG, "证书验证状态=" + result); if (result == AdasConstants.CertificationStatus.CERTIFICATE_CHAIN_SUCCESS) { @@ -633,7 +633,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec } String rootCrt = adasOptions.getRootCrt(); if (!TextUtils.isEmpty(rootCrt)) { - certification(rootCrt, basicInfoReq.getCertification()); + certification(false, rootCrt, basicInfoReq.getCertification()); } } else { IMsg iMsg = myMessageFactory.createMessage(messageType); diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasConnectStatusListener.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasConnectStatusListener.java index 049c670a63..12f2bcfb3e 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasConnectStatusListener.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasConnectStatusListener.java @@ -1,5 +1,6 @@ package com.zhidao.support.adas.high; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.zhidao.support.adas.high.bean.VersionCompatibility; @@ -23,6 +24,18 @@ public interface OnAdasConnectStatusListener { */ void onConnectionIPCStatus(AdasConstants.IpcConnectionStatus status, @Nullable String reason); + /** + * 域控证书认证状态 + * 启用认证需要配置 AdasOptions.setEnableCertification() + * 连接时启用认证 后才会有证认结果 + * ROOT证书异常会影响校验域控证书 + * PAD证书异常会影响域控端校验的证书校验,域控端证书校验失败将会断开连接,且并不会给出断开原因,ADAS LIB会执行重连操作(如果配置启用重连) + * 假如校验域控证书认证失败会主动断开连接,且不进行重连 + * + * @param status 域控证书认证结果{@link AdasConstants.CertificationStatus} + */ + void onCertification(@NonNull AdasConstants.CertificationStatus status); + /** * 与工控机版本的兼容性 * diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java index 205c062c41..d50e61c691 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java @@ -155,18 +155,6 @@ public interface OnAdasListener { */ void onBasicInfoReq(MessagePad.Header header, @NonNull MessagePad.BasicInfoReq basicInfoReq); - /** - * 域控证书认证状态 - * 启用认证需要配置 AdasOptions.setEnableCertification() - * 连接时启用认证 后才会有证认结果 - * ROOT证书异常会影响校验域控证书 - * PAD证书异常会影响域控端校验的证书校验,域控端证书校验失败将会断开连接,且并不会给出断开原因,ADAS LIB会执行重连操作(如果配置启用重连) - * 假如校验域控证书认证失败会主动断开连接,且不进行重连 - * - * @param status 域控证书认证结果{@link AdasConstants.CertificationStatus} - */ - void onCertification(@NonNull AdasConstants.CertificationStatus status); - /** * 车机基础信息应答 *