[抽离和司机端通讯]
This commit is contained in:
yangyakun
2024-06-03 11:52:35 +08:00
parent ab0ac7e72a
commit 8a5b9ee574
6 changed files with 138 additions and 98 deletions

View File

@@ -2,25 +2,16 @@ package com.mogo.och.bus.passenger.model
import android.annotation.SuppressLint
import android.content.Context
import android.media.AudioAttributes
import android.media.AudioFocusRequest
import android.media.AudioManager
import android.os.Build
import androidx.annotation.RequiresApi
import com.mogo.commons.voice.AIAssist
import com.mogo.commons.voice.IMogoVoiceCmdCallBack
import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener
import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager
import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager
import com.mogo.eagle.core.network.utils.GsonUtil
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
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.util.GsonUtils
import com.mogo.och.bus.passenger.bean.PM2RoutesResponse
@@ -30,12 +21,12 @@ import com.mogo.och.bus.passenger.callback.IDrivingInfoCallback
import com.mogo.och.bus.passenger.callback.ISpeedCallback
import com.mogo.och.bus.passenger.constant.BusPassengerConst
import com.mogo.och.bus.passenger.network.BusPassengerServiceManager
import com.mogo.och.common.module.biz.lansocket.IOchLanPassengerStatusListener
import com.mogo.och.common.module.biz.lansocket.LoginLanPassengerSocket
import com.mogo.och.common.module.biz.login.ILoginCallback
import com.mogo.och.common.module.biz.login.LoginStatusEnum
import com.mogo.och.common.module.biz.login.LoginStatusManager
import com.mogo.och.common.module.biz.login.OpenOrderStatusEnum
import com.mogo.och.common.module.constant.OchCommonConst
import com.mogo.och.common.module.manager.autopilot.autopilot.IOchAutopilotStatusListener
import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotStatusListenerManager
import com.mogo.och.common.module.manager.distance.IDistanceListener
@@ -43,14 +34,11 @@ import com.mogo.och.common.module.manager.distance.TrajectoryAndDistanceManager
import com.mogo.och.common.module.manager.loop.BizLoopManager
import com.mogo.och.common.module.manager.loop.LoopInfo
import com.mogo.och.common.module.manager.socket.cloud.AbnormalFactorsLoopManager
import com.mogo.och.common.module.manager.socket.cloud.OCHSocketMessageManager
import com.mogo.och.common.module.manager.socket.lan.ILanMessageListener
import com.mogo.och.common.module.manager.socket.lan.LanSocketManager
import com.mogo.och.common.module.manager.socket.lan.bean.AppConnectMsg
import com.mogo.och.common.module.manager.socket.lan.bean.BaseDPMsg
import com.mogo.och.common.module.manager.socket.lan.bean.DPMsgType
import com.mogo.och.common.module.manager.socket.lan.bean.TaskDetailsMsg
import com.mogo.och.common.module.network.OchCommonServiceCallback
import com.mogo.och.common.module.utils.DateTimeUtil
import com.mogo.och.common.module.utils.OCHThreadPoolManager
import com.mogo.och.common.module.utils.PinYinUtil
import com.mogo.och.data.bean.BusRoutesResult
@@ -62,7 +50,7 @@ object OrderModel {
private val TAG = OrderModel::class.java.simpleName
val TAG_LOOP_QUERY_BIND_LINE = "${TAG}_TAG_LOOP_QUERY_BIND_LINE"
private val TAG_LOOP_QUERY_BIND_LINE = "${TAG}_TAG_LOOP_QUERY_BIND_LINE"
private var mContext: Context? = null
@@ -95,8 +83,9 @@ object OrderModel {
TrajectoryAndDistanceManager.addDistanceListener(TAG, trajectoryListener)
AbnormalFactorsLoopManager.startLoopAbnormalFactors(mContext!!)
//司乘屏通信监听
CallerTelematicListenerManager.addListener(TAG, mReceivedMsgListener)
LanSocketManager.registerSocketMessageListener(DPMsgType.TYPE_COMMON.type,LanSocketManager.commonListener)
LanSocketManager.registerSocketMessageListener(DPMsgType.TYPE_TASK_DETAILS.type,taskDetailsMsgListener)
LoginLanPassengerSocket.addListener(TAG,driverSnListener)
}
fun releaseListeners(){
@@ -110,6 +99,10 @@ object OrderModel {
AbnormalFactorsLoopManager.stopLoopAbnormalFactors()
CallerTelematicListenerManager.removeListener(TAG)
BizLoopManager.removeLoopFunction(TAG_LOOP_QUERY_BIND_LINE)
LanSocketManager.unRegisterSocketMessageListener(DPMsgType.TYPE_COMMON.type,LanSocketManager.commonListener)
LanSocketManager.unRegisterSocketMessageListener(DPMsgType.TYPE_TASK_DETAILS.type,taskDetailsMsgListener)
LoginLanPassengerSocket.removeListener(TAG)
cleanStation("release")
}
@@ -174,8 +167,34 @@ object OrderModel {
}
}
private val mReceivedMsgListener: IReceivedMsgListener = object : IReceivedMsgListener {
override fun onReceivedServerSn(sn: String?) {
private val taskDetailsMsgListener = object : ILanMessageListener<TaskDetailsMsg> {
override fun target(): Class<TaskDetailsMsg> {
return TaskDetailsMsg::class.java
}
override fun onMsgReceived(taskDetailsMsg: TaskDetailsMsg?) {
taskDetailsMsg?.let {
if (it.msg?.isEmpty() == true){
clearLocalRouteResult()
return
}
val result = GsonUtils.fromJson(it.msg, BusTransferData::class.java)
mDrivingInfoCallback?.changeOperationStatus(result.loginStatus == 1)
if (result != null && result.routesResult == null) {
clearLocalRouteResult()
}
if (routesResult == null ||
(result != null && result.routesResult?.writeVersion!! > routesResult!!.writeVersion)
) { //已司机端传来的为准
routesResult = result.routesResult
updatePassengerRouteInfo(routesResult)
}
}
}
}
private val driverSnListener = object :IOchLanPassengerStatusListener{
override fun onDriverSnChagneListner(sn: String?) {
CallerLogger.d(
SceneConstant.M_BUS_P + TAG,
"onReceivedServerSn = $sn"
@@ -183,51 +202,6 @@ object OrderModel {
mDriverStatusCallback?.updateDriverSn(sn)
}
override fun onReceivedMsg(type: Int, byteArray: ByteArray) {
if (OchCommonConst.BUSINESS_STRING == type) {
val baseMsg = GsonUtils.fromJson(String(byteArray), BaseDPMsg::class.java)
CallerLogger.d(
SceneConstant.M_BUS_P + TAG,
"onReceivedMsg = " + GsonUtils.toJson(baseMsg)
)
if (baseMsg != null && baseMsg.type == DPMsgType.TYPE_COMMON.type) {
val msg = GsonUtils.fromJson(String(byteArray), AppConnectMsg::class.java)
if (msg != null && msg.isPlay) { //播报
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
speakTTS(msg.msg)
}
}
if (msg != null && msg.isViewShow) { //消息盒子显示内容
OCHSocketMessageManager.pushAppOperationalMsgBox(
DateTimeUtil.getCurrentTimeStamp(), msg.msg,
OCHSocketMessageManager.OPERATION_SYSTEM
)
}
}else if (baseMsg != null && baseMsg.type == DPMsgType.TYPE_TASK_DETAILS.type){
val msg = GsonUtils.fromJson(String(byteArray), TaskDetailsMsg::class.java)
Logger.d(SceneConstant.M_BUS_P + TAG, "onReceivedMsg = " + GsonUtils.toJson(msg))
if (msg == null || msg.msg?.isEmpty() == true){
clearLocalRouteResult()
return
}
val result = GsonUtils.fromJson(msg.msg, BusTransferData::class.java)
mDrivingInfoCallback?.changeOperationStatus(result.loginStatus == 1)
if (result != null && result.routesResult == null) {
clearLocalRouteResult()
}
if (routesResult == null ||
(result != null && result.routesResult?.writeVersion!! > routesResult!!.writeVersion)
) { //已司机端传来的为准
routesResult = result.routesResult
updatePassengerRouteInfo(routesResult)
}
}
}
}
}
@@ -472,36 +446,4 @@ object OrderModel {
}
}
@RequiresApi(Build.VERSION_CODES.O)
private fun speakTTS(msg: String) {
val mAudioManager = mContext?.getSystemService(Context.AUDIO_SERVICE) as AudioManager
val mAudioAttributes = AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA) //设置声音的用途
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) //设置声音的类型
.build()
val mAudioFocusRequest =
AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK) //设置焦点类型
.setAudioAttributes(mAudioAttributes) //设置声音属性
.setAcceptsDelayedFocusGain(false) //设置接受延迟获取焦点需要设置OnAudioFocusChangeListener来监听焦点的获取
.build()
mAudioManager.requestAudioFocus(mAudioFocusRequest) //抢占焦点
AIAssist.getInstance(mContext)
.speakTTSVoiceWithLevel(msg, AIAssist.LEVEL0, object : IMogoVoiceCmdCallBack {
override fun onSpeakEnd(speakText: String?) {
mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest)
}
override fun onSpeakError(speakText: String?, errorMsg: String?) {
mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest)
}
override fun onSpeakSelectTimeOut(speakText: String?) {
mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest)
}
})
}
}

View File

@@ -0,0 +1,8 @@
package com.mogo.och.common.module.biz.lansocket;
public interface IOchLanPassengerStatusListener {
default void onDriverSnChagneListner(String sn) {
}
}

View File

@@ -23,10 +23,11 @@ import com.mogo.och.common.module.manager.socket.lan.bean.EnvType
import com.mogo.och.common.module.manager.socket.lan.bean.ProjectType
import com.mogo.och.common.module.manager.socket.lan.bean.ScreenType
import com.mogo.och.common.module.manager.socket.lan.bean.VehicleType
import com.mogo.och.common.module.utils.CallerBase
import java.lang.StringBuilder
import kotlin.properties.Delegates
object LoginLanPassengerSocket : IReceivedMsgListener {
object LoginLanPassengerSocket : IReceivedMsgListener, CallerBase<IOchLanPassengerStatusListener>() {
private const val TAG = "LoginLanSocket"
var driverSn: String by Delegates.observable("") { _, oldV, newV ->
@@ -38,6 +39,9 @@ object LoginLanPassengerSocket : IReceivedMsgListener {
if(newV.isNotEmpty()){
OchChainLogManager.writeChainLogNetLanSocketConnect("局域网socket链接状态","sn 变化 已连接 sn${newV}")
}
M_LISTENERS.forEach {
it.value.onDriverSnChagneListner(newV)
}
}
}
@@ -169,5 +173,7 @@ object LoginLanPassengerSocket : IReceivedMsgListener {
driverSn = sn ?: ""
}
override fun doSomeAfterAddListener(tag: String, listener: IOchLanPassengerStatusListener) {
listener.onDriverSnChagneListner(driverSn)
}
}

View File

@@ -1,16 +1,49 @@
package com.mogo.och.common.module.manager.socket.lan
import android.content.Context
import android.media.AudioAttributes
import android.media.AudioFocusRequest
import android.media.AudioManager
import android.os.Build
import androidx.annotation.RequiresApi
import com.mogo.commons.AbsMogoApplication
import com.mogo.commons.voice.AIAssist
import com.mogo.commons.voice.IMogoVoiceCmdCallBack
import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.och.common.module.constant.OchCommonConst
import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
import com.mogo.och.common.module.manager.socket.cloud.OCHSocketMessageManager
import com.mogo.och.common.module.manager.socket.lan.bean.AppConnectMsg
import com.mogo.och.common.module.manager.socket.lan.bean.BaseDPMsg
import com.mogo.och.common.module.utils.DateTimeUtil
object LanSocketManager : LanSocketManagerJava() {
private const val TAG = "LanSocketManager"
val commonListener = object : ILanMessageListener<AppConnectMsg> {
override fun target(): Class<AppConnectMsg> {
return AppConnectMsg::class.java
}
override fun onMsgReceived(first: AppConnectMsg?) {
first?.let {
if (it.isPlay) { //播报
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
speakTTS(it.msg)
}
}
if (it.isViewShow) { //消息盒子显示内容
OCHSocketMessageManager.pushAppOperationalMsgBox(
DateTimeUtil.getCurrentTimeStamp(), it.msg,
OCHSocketMessageManager.OPERATION_SYSTEM
)
}
}
}
}
fun load(){
OchChainLogManager.writeChainLogInit("初始化信息","初始局域网监听和发送封装")
@@ -37,4 +70,38 @@ object LanSocketManager : LanSocketManagerJava() {
OchChainLogManager.writeChainLogLanSocket("收到数据","type:${type},byteArray:${String(byteArray)}","receive");
super.onReceivedMsg(type, byteArray)
}
@RequiresApi(Build.VERSION_CODES.O)
private fun speakTTS(msg: String) {
val mContext = AbsMogoApplication.getApp()
val mAudioManager = mContext?.getSystemService(Context.AUDIO_SERVICE) as AudioManager
val mAudioAttributes = AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA) //设置声音的用途
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) //设置声音的类型
.build()
val mAudioFocusRequest =
AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK) //设置焦点类型
.setAudioAttributes(mAudioAttributes) //设置声音属性
.setAcceptsDelayedFocusGain(false) //设置接受延迟获取焦点需要设置OnAudioFocusChangeListener来监听焦点的获取
.build()
mAudioManager.requestAudioFocus(mAudioFocusRequest) //抢占焦点
AIAssist.getInstance(mContext)
.speakTTSVoiceWithLevel(msg, AIAssist.LEVEL0, object : IMogoVoiceCmdCallBack {
override fun onSpeakEnd(speakText: String?) {
mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest)
}
override fun onSpeakError(speakText: String?, errorMsg: String?) {
mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest)
}
override fun onSpeakSelectTimeOut(speakText: String?) {
mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest)
}
})
}
}

View File

@@ -43,6 +43,15 @@ public class LanSocketManagerJava implements IReceivedMsgListener {
}
}
public void unRegisterSocketMessageListener(int msgType, ILanMessageListener mogoOnMessageListener){
List<ILanMessageListener> listenerJavas = mListeners.get(msgType);
if (listenerJavas!=null) {
if(listenerJavas.contains(mogoOnMessageListener)){
listenerJavas.remove(mogoOnMessageListener);
}
}
}
@Override
public void onReceivedMsg(int type, @NonNull byte[] byteArray) {
if (OchCommonConst.BUSINESS_STRING == type) {

View File

@@ -5,11 +5,18 @@ import android.text.TextUtils;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;
public class FieldUtils {
private static Map<Class,String> errorField = new HashMap();
public static Field getDeclaredField(final Class<?> cls, final String fieldName, final
boolean forceAccess) {
if(errorField.containsKey(cls)&&errorField.containsValue(fieldName)){
return null;
}
if (cls == null || TextUtils.isEmpty(fieldName)) {
return null;
}
@@ -25,6 +32,7 @@ public class FieldUtils {
}
return field;
} catch (final Exception e) {
errorField.put(cls,fieldName);
e.printStackTrace();
}
return null;