增加与服务端时间戳不一致的容错机制

This commit is contained in:
tongchenfei
2020-11-26 16:35:13 +08:00
parent 87498bf5ff
commit 5b8957e7ce
2 changed files with 42 additions and 4 deletions

View File

@@ -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;
}
}

View File

@@ -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<IMogoOnWebSocketMessageListener> listeners = mListeners.get(msgType);