增加与服务端时间戳不一致的容错机制
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user