diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java index 5722e2b169..a87b053975 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java @@ -84,6 +84,7 @@ import com.zhidao.support.adas.high.OnAdasConnectStatusListener; import com.zhidao.support.adas.high.OnAdasListener; import com.zhidao.support.adas.high.OnMultiDeviceListener; import com.zhidao.support.adas.high.bean.VersionCompatibility; +import com.zhidao.support.adas.high.common.ByteUtil; import com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS; import com.zhidao.support.adas.high.common.CupidLogUtils; import com.zhidao.support.adas.high.common.ProtocolStatus; @@ -884,7 +885,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas @Override public void onMessageResponseClient(MogoProtocolMsg msg, String sign, Channel channel) { - Log.i("ddd", "dddd" + sign); + Log.i(TAG, "司机端连接成功=" + sign); AdasManager.getInstance().decoderRaw(msg.getBody()); } @@ -892,8 +893,10 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas public void onClientStatusConnectChanged(int statusCode, String sign, Channel channel) { if (statusCode == ConnectState.STATUS_CONNECT_SUCCESS) { connectStatus = IPC_CONNECTION_STATUS.CONNECTED; + AdasManager.getInstance().startDispatchHandler(); } else { connectStatus = IPC_CONNECTION_STATUS.DISCONNECTED; + AdasManager.getInstance().stopDispatchHandler(); } getHandler().sendEmptyMessage(WHAT_DRIVER_IP); onUpdateConnectStateView(); @@ -915,6 +918,8 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas NSDNettyManager.getInstance().startNSDNettyServerWithSN(this, new NettyServerListener() { @Override public void onMessageResponseServer(MogoProtocolMsg msg, Channel channel) { + AdasManager.getInstance().sendWsMessage(msg.getBody()); + } @Override @@ -937,32 +942,27 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas Log.i(TAG, "onChannelDisConnect channel=" + channel.id()); } }, "1234567"); - - } AdasManager.getInstance().create(options, this); - AdasManager.getInstance().setOnAdasListener(this); - if (BuildConfig.IS_CLIENT) { - /*—————————————作为乘客端———————————*/ - - } else { - /*—————————————作为司機端———————————*/ - AdasManager.getInstance().setOnMultiDeviceListener(new OnMultiDeviceListener() { - @Override - public void onForwardingIPCMessage(byte[] bytes) { - // 发送数据给乘客端 - if (NSDNettyManager.getInstance().isServerStart()) { - NSDNettyManager.getInstance().sendMsgToAllClients(new MogoProtocolMsg(NORMAL_DATA, bytes.length, bytes)); - } else { + AdasManager.getInstance().setOnMultiDeviceListener(new OnMultiDeviceListener() { + @Override + public void onForwardingDriverIPCMessage(byte[] bytes) { + // 发送数据给乘客端 + if (NSDNettyManager.getInstance().isServerStart()) { + NSDNettyManager.getInstance().sendMsgToAllClients(new MogoProtocolMsg(NORMAL_DATA, bytes.length, bytes)); + } else { // Log.d("dddd", "司机端Server未启动!"); - } - } - }); + } - - } + @Override + public void onForwardingPassengerIPCMessage(byte[] bytes) { + NSDNettyManager.getInstance() + .sendMogoProtocolMsgToServer(new MogoProtocolMsg(NORMAL_DATA, bytes.length, bytes), null); + Log.i(TAG, "乘客屏发送数据=" + ByteUtil.byteArrToHex(bytes)); + } + }); } @@ -1059,7 +1059,11 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas @Override public void onItemClick(int position, String data) { if (connectStatus != IPC_CONNECTION_STATUS.CONNECTED) { - showToastCenter("IPC 未连接"); + String msg = "未连接工控机"; + if (BuildConfig.IS_CLIENT) { + msg = "未连接司机端"; + } + showToastCenter(msg); return; } switch (data) { diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt index 5a33c42d23..e6cf7f95d6 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt @@ -47,6 +47,7 @@ import com.mogo.telematic.server.netty.NettyServerListener import com.mogo.telematic.server.netty.NettyTcpServer import com.zhidao.support.adas.high.AdasManager import com.zhidao.support.adas.high.AdasOptions +import com.zhidao.support.adas.high.OnMultiDeviceListener import com.zhidao.support.adas.high.common.Constants import com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS import com.zhidao.support.adas.high.common.CupidLogUtils @@ -155,9 +156,14 @@ class MoGoAutopilotProvider : // 监听ADAS-SDK获取到的工控机数据(乘客也需注册) AdasManager.getInstance().setOnAdasListener(MoGoAdasListenerImpl()) - // 司机端监听 - if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - AdasManager.getInstance().setOnMultiDeviceListener { bytes -> + // 乘客屏监听工控机基础信息回调 + if (!AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + CallerAutopilotCarConfigListenerManager.addListener(TAG, this) + } + AdasManager.getInstance().setOnMultiDeviceListener(object : OnMultiDeviceListener { + override fun onForwardingDriverIPCMessage(bytes: ByteArray?) { + if (bytes == null) + return // 发送数据给乘客端 if (NSDNettyManager.getInstance().isServerStart) { msgHandler.synWriteTime() @@ -167,9 +173,19 @@ class MoGoAutopilotProvider : CallerLogger.d("$M_ADAS_IMPL$TAG", "司机端Server未启动!") } } - } else {// 乘客屏监听工控机基础信息回调 - CallerAutopilotCarConfigListenerManager.addListener(TAG, this) - } + + override fun onForwardingPassengerIPCMessage(bytes: ByteArray?) { + if (bytes == null) + return + NSDNettyManager.getInstance() + .sendMogoProtocolMsgToServer( + MogoProtocolMsg(NORMAL_DATA, bytes.size, bytes), + null + ) + + } + + }); CallerLogger.i("$M_ADAS_IMPL$TAG", "initServer……") // 同步数据给工控机的服务 @@ -230,7 +246,8 @@ class MoGoAutopilotProvider : override fun startAutoPilot(controlParameters: AutopilotControlParameters) { if (AdasManager.getInstance().ipcConnectionStatus == IPC_CONNECTION_STATUS.CONNECTED) { - val invokeResult = AdasManager.getInstance().sendAutoPilotModeReq(1, 1, controlParameters.toRouteInfo()) + val invokeResult = AdasManager.getInstance() + .sendAutoPilotModeReq(1, 1, controlParameters.toRouteInfo()) invokeAutoPilotResult(if (invokeResult) "自动驾驶调用成功" else "自动驾驶调用失败, socket 或者 rawPack 可能为空") } else { invokeAutoPilotResult("车机与工控机链接失败,无法开启自动驾驶") @@ -364,9 +381,9 @@ class MoGoAutopilotProvider : * isEnable = false 关闭 */ override fun setRainMode(isEnable: Boolean) { - if(isEnable){ + if (isEnable) { AdasManager.getInstance().sendRainModeReq(1) - }else{ + } else { AdasManager.getInstance().sendRainModeReq(0) } } @@ -464,7 +481,8 @@ class MoGoAutopilotProvider : // 乘客屏才监听 AppConfigInfo.plateNumber = carConfigResp.plateNumber Log.d("liyz", "onAutopilotCarConfig 乘客屏Mac地址为 = ${carConfigResp.macAddress}") - CallerBindingcarManager.getBindingcarProvider().getBindingcarInfo(carConfigResp.macAddress, MoGoAiCloudClientConfig.getInstance().sn) + CallerBindingcarManager.getBindingcarProvider() + .getBindingcarInfo(carConfigResp.macAddress, MoGoAiCloudClientConfig.getInstance().sn) invokeNettyConnResult("乘客屏车牌号:${carConfigResp.plateNumber},Mac地址为:${carConfigResp.macAddress}") } diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/TeleMsgHandler.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/TeleMsgHandler.kt index 58109c2de8..724d6dbcfe 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/TeleMsgHandler.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/TeleMsgHandler.kt @@ -17,7 +17,6 @@ import com.mogo.telematic.MogoProtocolMsg import com.mogo.telematic.NSDNettyManager import com.mogo.telematic.client.status.ConnectState import com.zhidao.support.adas.high.AdasManager -import com.zhidao.support.adas.high.chain.AdasChain import com.zhjt.service.chain.ChainLog import com.zhjt.service.chain.TracingConstants import io.netty.channel.Channel @@ -59,9 +58,16 @@ class TeleMsgHandler : IMsgHandler { val carConfig = MessagePad.CarConfigResp.parseFrom(msg.body) AppConfigInfo.plateNumber = carConfig.plateNumber AppConfigInfo.iPCMacAddress = carConfig.macAddress - invokeNettyConnResult("司机屏发送给乘客屏配置信息为:${TextFormat.printer().escapingNonAscii(false).printToString(carConfig)}") + invokeNettyConnResult( + "司机屏发送给乘客屏配置信息为:${ + TextFormat.printer().escapingNonAscii(false).printToString(carConfig) + }" + ) Log.d("liyz", "TeleMsgHandler macAddress = " + carConfig.macAddress) - CallerBindingcarManager.getBindingcarProvider().getBindingcarInfo(carConfig.macAddress, MoGoAiCloudClientConfig.getInstance().sn) + CallerBindingcarManager.getBindingcarProvider().getBindingcarInfo( + carConfig.macAddress, + MoGoAiCloudClientConfig.getInstance().sn + ) } else -> { } @@ -89,6 +95,10 @@ class TeleMsgHandler : IMsgHandler { queryCarConfig() } } + //乘客端发送过来的工控机数据交给司机端adas转发到工控机 + MogoProtocolMsg.NORMAL_DATA -> { + AdasManager.getInstance().sendWsMessage(it.body) + } else -> { } } 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 84fc8dfe2d..5f12e90f58 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 @@ -227,24 +227,39 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec * @param data 数据 * @return boolean */ - private boolean sendWsMessage(MessagePad.MessageType msgType, byte[] data) { - if (mSocket != null && rawPack != null) { - ByteString byteString = rawPack.pack(msgType, data); - if (byteString != null) { - return mSocket.sendDataWebSocket(byteString); + private boolean sendPBMessage(MessagePad.MessageType msgType, byte[] data) { + if (rawPack != null) { + byte[] bytes = rawPack.pack(msgType, data); + //司机屏工控机数据转发 + if (adasOptions.isClient()) { + if (onMultiDeviceListener != null) + onMultiDeviceListener.onForwardingPassengerIPCMessage(bytes); + return true; + } else { + return sendWsMessage(bytes); } } return false; } + @Override + public boolean sendWsMessage(byte[] bytes) { + if (mSocket == null || bytes == null || bytes.length <= 0) { + return false; + } + ByteString byteString = ByteString.of(bytes); + return mSocket.sendDataWebSocket(byteString); + } + /** * 解析工控机发送过来PB的数据 + * 乘客屏数据解析 * * @param bytes 数据 */ @Override public void decoderRaw(byte[] bytes) { - if (bytes == null || bytes.length == 0) { + if (bytes == null || bytes.length <= 0) { return; } ByteString byteString = ByteString.of(bytes); @@ -396,9 +411,9 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec @Override public void onMessage(ByteString bytes) throws InvalidProtocolBufferException { decoderRaw(bytes); - //乘客屏数据分发 + //司机屏工控机数据转发 if (!adasOptions.isClient() && onMultiDeviceListener != null) { - onMultiDeviceListener.onForwardingIPCMessage(bytes.toByteArray()); + onMultiDeviceListener.onForwardingDriverIPCMessage(bytes.toByteArray()); } } @@ -621,7 +636,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec .setSn(sn) .setEnvironment(environment) .build(); - return sendWsMessage(MessageType.TYPE_SEND_BASIC_INFO_RESP.typeCode, resp.toByteArray()); + return sendPBMessage(MessageType.TYPE_SEND_BASIC_INFO_RESP.typeCode, resp.toByteArray()); } /** @@ -648,7 +663,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec if (routeInfo != null) builder.setRouteInfo(routeInfo); MessagePad.SetAutopilotModeReq req = builder.build(); - return sendWsMessage(MessageType.TYPE_SEND_SET_AUTOPILOT_MODE_REQ.typeCode, req.toByteArray()); + return sendPBMessage(MessageType.TYPE_SEND_SET_AUTOPILOT_MODE_REQ.typeCode, req.toByteArray()); } /** @@ -663,7 +678,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec .newBuilder() .setEnable(enable) .build(); - return sendWsMessage(MessageType.TYPE_SEND_SET_DEMO_MODE_REQ.typeCode, req.toByteArray()); + return sendPBMessage(MessageType.TYPE_SEND_SET_DEMO_MODE_REQ.typeCode, req.toByteArray()); } /** @@ -676,7 +691,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec MessagePad.CarConfigReq req = MessagePad.CarConfigReq .newBuilder() .build(); - return sendWsMessage(MessageType.TYPE_SEND_CAR_CONFIG_REQ.typeCode, req.toByteArray()); + return sendPBMessage(MessageType.TYPE_SEND_CAR_CONFIG_REQ.typeCode, req.toByteArray()); } /** @@ -706,7 +721,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec .setReason(reason) .setReasonID(reasonID) .build(); - return sendWsMessage(MessageType.TYPE_SEND_RECORD_CAUSE.typeCode, resp.toByteArray()); + return sendPBMessage(MessageType.TYPE_SEND_RECORD_CAUSE.typeCode, resp.toByteArray()); } @Override @@ -752,7 +767,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec .setIsRecord(isRecord) .setSustain(sustain) .build(); - return sendWsMessage(MessageType.TYPE_SEND_RECORD_DATA.typeCode, req.toByteArray()); + return sendPBMessage(MessageType.TYPE_SEND_RECORD_DATA.typeCode, req.toByteArray()); } /** @@ -767,7 +782,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec .newBuilder() .setSpeedLimit(speedLimit) .build(); - return sendWsMessage(MessageType.TYPE_SEND_SET_AUTOPILOT_SPEED_REQ.typeCode, req.toByteArray()); + return sendPBMessage(MessageType.TYPE_SEND_SET_AUTOPILOT_SPEED_REQ.typeCode, req.toByteArray()); } /** @@ -788,7 +803,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec MessagePad.GlobalPathReq req = MessagePad.GlobalPathReq .newBuilder() .build(); - return sendWsMessage(MessageType.TYPE_SEND_GLOBAL_PATH_REQ.typeCode, req.toByteArray()); + return sendPBMessage(MessageType.TYPE_SEND_GLOBAL_PATH_REQ.typeCode, req.toByteArray()); } /** @@ -834,7 +849,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec builder.setLaneDetail(laneDetail); builder.setTimestamp(timestamp); MessagePad.TrafficLightData req = builder.build(); - return sendWsMessage(MessageType.TYPE_SEND_TRAFFIC_LIGHT_DATA.typeCode, req.toByteArray()); + return sendPBMessage(MessageType.TYPE_SEND_TRAFFIC_LIGHT_DATA.typeCode, req.toByteArray()); } /** @@ -858,7 +873,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec MessagePad.SystemCmdReq.Builder builder = MessagePad.SystemCmdReq.newBuilder(); builder.setCmdType(type); MessagePad.SystemCmdReq req = builder.build(); - return sendWsMessage(MessageType.TYPE_SEND_SYSTEM_CMD_REQ.typeCode, req.toByteArray()); + return sendPBMessage(MessageType.TYPE_SEND_SYSTEM_CMD_REQ.typeCode, req.toByteArray()); } /** @@ -872,7 +887,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec MessagePad.TrajectoryDownloadReq.Builder builder = MessagePad.TrajectoryDownloadReq.newBuilder(); builder.setLine(line); MessagePad.TrajectoryDownloadReq req = builder.build(); - return sendWsMessage(MessageType.TYPE_SEND_TRAJECTORY_DOWNLOAD_REQ.typeCode, req.toByteArray()); + return sendPBMessage(MessageType.TYPE_SEND_TRAJECTORY_DOWNLOAD_REQ.typeCode, req.toByteArray()); } /** @@ -885,7 +900,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec MessagePad.StatusQueryReq req = MessagePad.StatusQueryReq .newBuilder() .build(); - return sendWsMessage(MessageType.TYPE_SEND_STATUS_QUERY_REQ.typeCode, req.toByteArray()); + return sendPBMessage(MessageType.TYPE_SEND_STATUS_QUERY_REQ.typeCode, req.toByteArray()); } @@ -901,7 +916,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec .newBuilder() .setEnable(enable) .build(); - return sendWsMessage(MessageType.TYPE_SEND_SET_RAIN_MODE_REQ.typeCode, req.toByteArray()); + return sendPBMessage(MessageType.TYPE_SEND_SET_RAIN_MODE_REQ.typeCode, req.toByteArray()); } } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java index b1bcf17274..95557b1d58 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java @@ -187,6 +187,20 @@ public class AdasManager implements IAdasNetCommApi { return null; } + /** + * 向工控机发送数据 + * + * @param bytes 数据 + * @return boolean + */ + @Override + public boolean sendWsMessage(byte[] bytes) { + if (mChannel != null) { + return mChannel.sendWsMessage(bytes); + } + return false; + } + /** * 解析工控机发送过来的数据 * 多设备时使用 diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java index 363854d6c8..977298a8f3 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java @@ -206,6 +206,14 @@ public interface IAdasNetCommApi { // TODO 需求暂停 待讨论 // boolean getRoutes(); + /** + * 向工控机发送数据 + * + * @param bytes 数据 + * @return boolean + */ + boolean sendWsMessage(byte[] bytes); + /** * 解析工控机发送过来的数据 * 多设备时使用 diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnMultiDeviceListener.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnMultiDeviceListener.java index 1206f837d6..9d0e09d787 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnMultiDeviceListener.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnMultiDeviceListener.java @@ -3,6 +3,7 @@ package com.zhidao.support.adas.high; /** * 多设备监听 * 服务端实现此监听,将工控机发送过来的数据通过其他方式传递出去 + * 客户端实现此监听,将乘客屏数据通过其他方式发送到乘客屏 */ public interface OnMultiDeviceListener { @@ -12,5 +13,13 @@ public interface OnMultiDeviceListener { * * @param bytes 数据 */ - void onForwardingIPCMessage(byte[] bytes); + void onForwardingDriverIPCMessage(byte[] bytes); + + /** + * 转发乘客屏 + * 如果是服务端此回调不会被调用 + * + * @param bytes + */ + void onForwardingPassengerIPCMessage(byte[] bytes); } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/RawPack.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/RawPack.java index e39b2e3f7e..f67ff800cb 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/RawPack.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/RawPack.java @@ -6,7 +6,6 @@ import com.zhidao.support.adas.high.common.Constants; import java.util.concurrent.atomic.AtomicLong; import mogo.telematics.pad.MessagePad; -import okio.ByteString; /** * 数据打包 @@ -25,7 +24,7 @@ public class RawPack { } - public synchronized ByteString pack(MessagePad.MessageType msgType, byte[] data) { + public synchronized byte[] pack(MessagePad.MessageType msgType, byte[] data) { if (msgType == null) { return null; } @@ -57,8 +56,7 @@ public class RawPack { if (data != null && data.length > 0) { System.arraycopy(data, 0, msg, messageProtocol.getOutHeaderLength() + header.length, data.length); } - return ByteString.of(msg); - + return msg; } /**