From efe3eb1eed19641ed79433e56f421b4e880880fc Mon Sep 17 00:00:00 2001 From: xinfengkun Date: Thu, 13 Jun 2024 11:41:25 +0800 Subject: [PATCH] =?UTF-8?q?[650][adas]=20=E4=B8=8B=E5=8F=91=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E8=87=AA=E9=A9=BE=E6=B7=BB=E5=8A=A0SessionID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/proto/message_pad.proto | 1 + .../zhidao/support/adas/high/AdasChannel.java | 15 +++++++++---- .../zhidao/support/adas/high/AdasManager.java | 2 +- .../support/adas/high/IAdasNetCommApi.java | 2 +- .../support/adas/high/protocol/MessageId.java | 22 +++++++++++++++++++ .../support/adas/high/protocol/RawPack.java | 15 ++++++++++--- 6 files changed, 48 insertions(+), 9 deletions(-) create mode 100644 libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/MessageId.java diff --git a/libraries/mogo-adas-data/src/main/proto/message_pad.proto b/libraries/mogo-adas-data/src/main/proto/message_pad.proto index 6792fd7f22..9041b2be32 100644 --- a/libraries/mogo-adas-data/src/main/proto/message_pad.proto +++ b/libraries/mogo-adas-data/src/main/proto/message_pad.proto @@ -448,6 +448,7 @@ message SetAutopilotModeReq uint32 mode = 1; //1: enter autopilot mode, 0: quit autopilot mode uint32 source = 2; //命令来源: 0: pad模拟, 1: pad业务, 2:aicloud, 3:魔方(清扫车MAP Version==332以及MAP Version>=350,其他车型目前未上线) RouteInfo routeInfo = 3; //自动驾驶路径信息 + uint64 sessionId = 4; //autopilot cmd session ID } // message definition for MsgTypeSetDemoModeReq 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 6460ecf0bf..b5580c806e 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 @@ -34,6 +34,7 @@ import com.zhidao.support.adas.high.common.RegexUtils; import com.zhidao.support.adas.high.common.autopilot.ability.AutopilotAbilityManager; import com.zhidao.support.adas.high.msg.IMsg; import com.zhidao.support.adas.high.msg.MyMessageFactory; +import com.zhidao.support.adas.high.protocol.MessageId; import com.zhidao.support.adas.high.protocol.PackData; import com.zhidao.support.adas.high.protocol.RawData; import com.zhidao.support.adas.high.protocol.RawPack; @@ -424,18 +425,22 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec * * -1L:添加到WS发送消息队列失败 */ private long sendPBMessage(MessageType msgType, byte[] data) { + return sendPBMessage(msgType, data, null); + } + + private long sendPBMessage(MessageType msgType, byte[] data, @Nullable MessageId messageId) { if (rawPack != null) { //司机屏工控机数据转发 if (adasOptions.isPassenger()) { if (onMultiDeviceListener != null) { - onMultiDeviceListener.onForwardingPassengerIPCMessage(rawPack.pack(msgType, data).bytes); + onMultiDeviceListener.onForwardingPassengerIPCMessage(rawPack.pack(msgType, data, null).bytes); } return 0L; } else { if (mSocket == null || !mSocket.isConnected()) { return -1L; } - PackData packData = rawPack.pack(msgType, data); + PackData packData = rawPack.pack(msgType, data, messageId); return sendWsMessage(packData.bytes) ? packData.msgId : -1L; } } @@ -1192,21 +1197,23 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec * @param mode 1: enter autopilot mode, 0: quit autopilot mode * @param source 命令来源: 0: pad模拟, 1: pad业务, 2:aicloud, 3:魔方(清扫车MAP Version==332以及MAP Version>=350,其他车型目前未上线) * @param routeInfo 自动驾驶路径信息 - * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID + * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID和SessionID * * >=0:表示添加到WS发送消息队列 * * =0:表示乘客屏模式添加到WS发送消息队列 * * -1L:添加到WS发送消息队列失败 */ @Override public long sendAutoPilotModeReq(int mode, int source, MessagePad.RouteInfo routeInfo) { + MessageId messageId = MessageId.build(MessageType.TYPE_SEND_SET_AUTOPILOT_MODE_REQ); MessagePad.SetAutopilotModeReq.Builder builder = MessagePad.SetAutopilotModeReq.newBuilder(); builder.setMode(mode); builder.setSource(source); if (routeInfo != null) builder.setRouteInfo(routeInfo); + builder.setSessionId(messageId.id); MessagePad.SetAutopilotModeReq req = builder.build(); if (autopilotReview != null) autopilotReview.onAutopilotCommandTrigger(req); - return sendPBMessage(MessageType.TYPE_SEND_SET_AUTOPILOT_MODE_REQ, req.toByteArray()); + return sendPBMessage(MessageType.TYPE_SEND_SET_AUTOPILOT_MODE_REQ, req.toByteArray(), messageId); } /** 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 f29f121e3c..fbcd3bbb85 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 @@ -396,7 +396,7 @@ public class AdasManager implements IAdasNetCommApi { * @param mode 1: enter autopilot mode, 0: quit autopilot mode * @param source 命令来源: 0: pad模拟, 1: pad业务, 2:aicloud, 3:魔方(清扫车MAP Version==332以及MAP Version>=350,其他车型目前未上线) * @param routeInfo 自动驾驶路径信息 - * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID + * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID和SessionID * * >=0:表示添加到WS发送消息队列 * * =0:表示乘客屏模式添加到WS发送消息队列 * * -1L:添加到WS发送消息队列失败 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 5ba39f8bf5..844067eab6 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 @@ -176,7 +176,7 @@ public interface IAdasNetCommApi { * @param mode 1: enter autopilot mode, 0: quit autopilot mode * @param source 命令来源: 0: pad模拟, 1: pad业务, 2:aicloud, 3:魔方(清扫车MAP Version==332以及MAP Version>=350,其他车型目前未上线) * @param routeInfo 自动驾驶路径信息 - * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID + * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID和SessionID * * >=0:表示添加到WS发送消息队列 * * =0:表示乘客屏模式添加到WS发送消息队列 * * -1L:添加到WS发送消息队列失败 diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/MessageId.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/MessageId.java new file mode 100644 index 0000000000..828350cde8 --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/MessageId.java @@ -0,0 +1,22 @@ +package com.zhidao.support.adas.high.protocol; + +import androidx.annotation.NonNull; + +import com.zhidao.support.adas.high.common.MessageIdGenerator; +import com.zhjt.mogo.adas.common.MessageType; + +public class MessageId { + public final long id; + public final long timeMillis; + + private MessageId(long id, long timeMillis) { + this.id = id; + this.timeMillis = timeMillis; + } + + public static MessageId build(@NonNull MessageType msgType) { + long timeMillis = System.currentTimeMillis(); + long msgId = MessageIdGenerator.getInstance().getId(timeMillis, msgType.typeCode); + return new MessageId(msgId, timeMillis); + } +} 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 f2348a4545..9aa5a46a7f 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 @@ -1,5 +1,7 @@ package com.zhidao.support.adas.high.protocol; +import androidx.annotation.Nullable; + import com.zhidao.support.adas.high.common.Constants; import com.zhidao.support.adas.high.common.MessageIdGenerator; import com.zhidao.support.adas.high.common.ReceivedAckManager; @@ -26,15 +28,22 @@ public class RawPack { } - public synchronized PackData pack(MessageType msgType, byte[] data) { + public synchronized PackData pack(MessageType msgType, @Nullable byte[] data, @Nullable MessageId messageId) { if (msgType == null) { return null; } - long timeMillis = System.currentTimeMillis(); MessagePad.MessageType type = msgType.typeCode; + long timeMillis; + long msgId; + if (messageId == null) { + timeMillis = System.currentTimeMillis(); + msgId = MessageIdGenerator.getInstance().getId(timeMillis, type); + } else { + timeMillis = messageId.timeMillis; + msgId = messageId.id; + } double time = timeMillis / 1000.0; boolean isNeedAck = msgType.timeoutMillis > 0; - long msgId = MessageIdGenerator.getInstance().getId(timeMillis, type); //封装Header MessagePad.Header.Builder headerBuilder = MessagePad.Header.newBuilder(); headerBuilder.setMsgID(msgId);//消息唯一ID,生成数据累加。从1开始,连接未重新初始化就一直累加