diff --git a/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketData.java b/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketData.java index 098b700382..3a213991ea 100644 --- a/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketData.java +++ b/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketData.java @@ -12,6 +12,8 @@ public class WebSocketData implements Serializable { private String data; + private long utcTime; + public long getSeq() { return seq; } @@ -43,4 +45,12 @@ public class WebSocketData implements Serializable { public void setData(String data) { this.data = data; } + + public long getUtcTime() { + return utcTime; + } + + public void setUtcTime(long utcTime) { + this.utcTime = utcTime; + } } diff --git a/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketManager.java b/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketManager.java index a8a925f2ca..29e6bf9507 100644 --- a/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketManager.java +++ b/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketManager.java @@ -1,6 +1,7 @@ package com.mogo.base.websocket; import android.content.Context; +import android.os.SystemClock; import androidx.annotation.Keep; @@ -133,12 +134,13 @@ public class WebSocketManager implements IMogoWebSocketManager, ISocketMsgSettin Logger.d(TAG, "websocket sendMsg body = " + body); if (handlerThread != null) { WebSocketData webSocketData = new WebSocketData(); - webSocketData.setSeq(System.currentTimeMillis()); + webSocketData.setSeq(computeSendMsgTime()); webSocketData.setMsgType(listener.getUpLinkType().getMsgType()); webSocketData.setSn(Utils.getSn()); - webSocketData.setData(new Gson().toJson(body)); - Logger.d(TAG,"sendMsg : " + new Gson().toJson(webSocketData)); - handlerThread.sendMsg(new Gson().toJson(webSocketData)); + webSocketData.setData(GsonUtil.jsonFromObject(body)); + String msg = GsonUtil.jsonFromObject(webSocketData); + Logger.d(TAG,"sendMsg : " + msg); + handlerThread.sendMsg(msg); } } @@ -152,12 +154,38 @@ public class WebSocketManager implements IMogoWebSocketManager, ISocketMsgSettin Logger.d(TAG, "websocket onConnectOpen"); } + private long serverTime = 0; + private long receiveMsgTime = 0; + + /** + * 服务端会在ack数据中增加服务端的时间戳{@link #serverTime}, 收到消息时,记录收到消息的时间{@link #receiveMsgTime},收消息的时间用{@link SystemClock#elapsedRealtime()}可以避免系统时间改变造成的影响 + * 在发送数据时,使用serverTime+(elapseRealtime()-receiveMsgTime)计算发送数据时的时间戳,这个时间戳是基本相对服务端的时间戳为基准的时间,忽略了ack下发时的时间延迟 + * + * 如果{@link #serverTime}或{@link #receiveMsgTime}数据有异常,则使用{@link System#currentTimeMillis()}当做当前时间,作为容错 + * + * @return 基本相对服务端的时间戳为基准的时间 + */ + private long computeSendMsgTime(){ + long sendMsgTime = 0; + if (serverTime > 0 && receiveMsgTime > 0) { + sendMsgTime = serverTime + (SystemClock.elapsedRealtime() - receiveMsgTime); + }else{ + sendMsgTime = System.currentTimeMillis(); + } + return sendMsgTime; + } + @Override public void handleMessage(String message) { Logger.d(TAG, "websocket received msg = " + message); WebSocketData webSocketData = GsonUtil.objectFromJson(message, WebSocketData.class); int msgType = webSocketData.getMsgType(); Logger.d(TAG, "websocket received msg type = " + msgType); + if (webSocketData.getUtcTime() > 0) { + serverTime = webSocketData.getUtcTime(); + receiveMsgTime = SystemClock.elapsedRealtime(); + Logger.d(TAG, "设置serverTime"); + } //服务端下发数据返回,上传数据回执默认不返回 if (msgType == MSG_TYPE_DOWNLINK_CAR_DATA.getMsgType()) { List listeners = mListeners.get(msgType);