diff --git a/.idea/gradle.xml b/.idea/gradle.xml index a973a8c831..08a4035b99 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -88,6 +88,7 @@ diff --git a/.idea/misc.xml b/.idea/misc.xml index 2db9aab721..3b62eef43d 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -4,7 +4,7 @@ - + diff --git a/foudations/mogo-base-websocket-sdk/build.gradle b/foudations/mogo-base-websocket-sdk/build.gradle index bc4cc643de..30bfc4afea 100644 --- a/foudations/mogo-base-websocket-sdk/build.gradle +++ b/foudations/mogo-base-websocket-sdk/build.gradle @@ -30,7 +30,7 @@ dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) implementation rootProject.ext.dependencies.arouter - implementation "com.mogo.module.carchatting:module-carchatt-socket:1.1.1" + implementation "com.mogo.module.carchatting:module-carchatt-socket:1.1.2" if (Boolean.valueOf(RELEASE)) { implementation rootProject.ext.dependencies.mogoutils diff --git a/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketConstant.java b/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketConstant.java index 7d080b3254..a34166a694 100644 --- a/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketConstant.java +++ b/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketConstant.java @@ -5,13 +5,21 @@ import com.mogo.commons.debug.DebugConfig; public class WebSocketConstant { - private static final String HOST_DEV = "ws://62.234.196.121:14001/ws"; - private static final String HOST_QA = "ws://62.234.196.121:14001/ws"; - private static final String HOST_DEMO = "ws://62.234.196.121:14001/ws"; - private static final String HOST_RELEASE = "ws://62.234.196.121:14001/ws"; + private static final String HOST_DEV = "ws://62.234.196.121"; + private static final String HOST_QA = "ws://62.234.196.121"; + private static final String HOST_DEMO = "ws://62.234.196.121"; + private static final String HOST_RELEASE = "ws://62.234.196.121"; +// private static final String PORT = ":14001/ws"; + public static final String PORT = ":4003/ws"; + public static final String PROTOCOL = "ws://"; - public static String getSocketServer(){ - switch (DebugConfig.getNetMode()){ + private static final String DOMAIN_DEV = "dzt-city.zhidaozhixing.com"; + private static final String DOMAIN_QA = "dzt-city.zhidaozhixing.com"; + private static final String DOMAIN_DEMO = "dzt-city.zhidaozhixing.com"; + private static final String DOMAIN_RELEASE = "dzt-city.zhidaozhixing.com"; + + public static String getSocketServer() { + switch (DebugConfig.getNetMode()) { case DebugConfig.NET_MODE_DEV: return HOST_DEV; case DebugConfig.NET_MODE_QA: @@ -21,7 +29,25 @@ public class WebSocketConstant { case DebugConfig.NET_MODE_RELEASE: default: return HOST_RELEASE; - } } + + public static String getDomain(){ + switch (DebugConfig.getNetMode()) { + case DebugConfig.NET_MODE_DEV: + return DOMAIN_DEV; + case DebugConfig.NET_MODE_QA: + return DOMAIN_QA; + case DebugConfig.NET_MODE_DEMO: + return DOMAIN_DEMO; + case DebugConfig.NET_MODE_RELEASE: + default: + return DOMAIN_RELEASE; + } + } + +// public static String getSocketPort() { +// return PORT; +// } + } 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/WebSocketDnsManager.java b/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketDnsManager.java index c8851ee786..52b33f2d5c 100644 --- a/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketDnsManager.java +++ b/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketDnsManager.java @@ -27,28 +27,30 @@ public class WebSocketDnsManager { public void getHttpDnsIp(WebSocketDns webSocketDns) { this.webSocketDns = webSocketDns; IMogoHttpDns mogoHttpDns = ARouter.getInstance().navigation(IMogoHttpDns.class); - ThreadPoolService.execute(() -> mogoHttpDns.getHttpDnsIp(WebSocketConstant.getSocketServer(), true, ip -> { + ThreadPoolService.execute(() -> mogoHttpDns.getHttpDnsIp(WebSocketConstant.getDomain(), false, ip -> { Logger.d(TAG, "getHttpDnsIp ip : " + ip + " , 得到Dns IP,准备回调 初始化webSocket"); this.cacheIp = ip; - this.webSocketDns.getDnsIp(cacheIp != null ? cacheIp : WebSocketConstant.getSocketServer()); + this.webSocketDns.getDnsIp((cacheIp != null ? + WebSocketConstant.PROTOCOL + ip + WebSocketConstant.PORT : + WebSocketConstant.getSocketServer() + WebSocketConstant.PORT)); })); - mogoHttpDns.addHttpDnsTtlCallback(WebSocketConstant.getSocketServer(), () -> { + mogoHttpDns.addHttpDnsTtlCallback(WebSocketConstant.getDomain(), () -> { Logger.d(TAG, "ttl callBack ,ready to getCache Dns IP"); - String dnsCacheIp = mogoHttpDns.getCachedHttpDnsIps(WebSocketConstant.getSocketServer()); + String dnsCacheIp = mogoHttpDns.getCachedHttpDnsIps(WebSocketConstant.getDomain()); if (dnsCacheIp == null) { return; } Logger.d(TAG, "获取缓存Dns IP : " + dnsCacheIp + " , 原缓存 IP : " + cacheIp); if (cacheIp != null && !cacheIp.equals(dnsCacheIp)) { - this.webSocketDns.ttlIp(dnsCacheIp); + this.webSocketDns.ttlIp(dnsCacheIp + WebSocketConstant.PORT); } }); } public interface WebSocketDns { - void getDnsIp(String ip); + void getDnsIp(String url); - void ttlIp(String ip); + void ttlIp(String url); } } 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 1e9fe4263b..d0c73c3d4a 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; @@ -22,6 +23,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import static com.mogo.service.connection.WebSocketMsgType.MSG_TYPE_ACK; import static com.mogo.service.connection.WebSocketMsgType.MSG_TYPE_DOWNLINK_CAR_DATA; @Keep @@ -70,18 +72,18 @@ public class WebSocketManager implements IMogoWebSocketManager, ISocketMsgSettin public void init(Context context, String appId) { WebSocketDnsManager.getInstance().getHttpDnsIp(new WebSocketDnsManager.WebSocketDns() { @Override - public void getDnsIp(String ip) { - Logger.d(TAG,"getDnsIp ip : " + ip); - initWebSocket(ip); + public void getDnsIp(String url) { + Logger.d(TAG,"getDnsIp url : " + url); + initWebSocket(url); } @Override - public void ttlIp(String ip) { - Logger.d(TAG,"ttlIp ip : " + ip); + public void ttlIp(String url) { + Logger.d(TAG,"ttlIp url : " + url); SocketClient.getInstance().getClientProxy().stop(); SocketClient.getInstance().getClientProxy().disConnect(); - Logger.d(TAG,"ready to re initWebSocket : " + ip); - initWebSocket(ip); + Logger.d(TAG,"ready to re initWebSocket : " + url); + initWebSocket(url); } }); } @@ -133,12 +135,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 +155,34 @@ 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 (msgType == MSG_TYPE_DOWNLINK_CAR_DATA.getMsgType()) { List listeners = mListeners.get(msgType); @@ -172,6 +197,12 @@ public class WebSocketManager implements IMogoWebSocketManager, ISocketMsgSettin } } } + } else if (msgType == MSG_TYPE_ACK.getMsgType()) { + if (webSocketData.getUtcTime() > 0) { + serverTime = webSocketData.getUtcTime(); + receiveMsgTime = SystemClock.elapsedRealtime(); + Logger.d(TAG, "设置serverTime"); + } } } diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/CloudLocationInfo.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/CloudLocationInfo.java index e6ea7dcfdd..02f0b43109 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/CloudLocationInfo.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/entity/CloudLocationInfo.java @@ -3,6 +3,8 @@ package com.mogo.module.common.entity; import android.os.Parcel; import android.os.Parcelable; +import java.util.Objects; + /** * 云端定位信息和自车定位信息 * @@ -17,7 +19,17 @@ public class CloudLocationInfo implements Parcelable { private double alt; private double speed; - public CloudLocationInfo(){ + public CloudLocationInfo() { + } + + public CloudLocationInfo(CloudLocationInfo info) { + this.lat = info.getLat(); + this.lon = info.getLon(); + this.heading = info.getHeading(); + this.systemTime = System.currentTimeMillis(); + this.satelliteTime = System.currentTimeMillis(); + this.alt = info.alt; + this.speed = info.speed; } protected CloudLocationInfo(Parcel in) { @@ -126,4 +138,27 @@ public class CloudLocationInfo implements Parcelable { ", speed=" + speed + '}'; } + + public String print() { + return "CloudLocation{ lon: " + lon + " lat: " + lat + " heading: " + heading + " speed: " + + speed+"}"; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + CloudLocationInfo that = (CloudLocationInfo) o; + return Double.compare(that.lat, lat) == 0 && + Double.compare(that.lon, lon) == 0; + } + + @Override + public int hashCode() { + return Objects.hash(lat, lon); + } } diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java index 1d9dc7439e..4931a6515f 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java @@ -17,6 +17,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintSet; +import androidx.constraintlayout.widget.Group; import com.alibaba.android.arouter.launcher.ARouter; import com.bumptech.glide.request.RequestOptions; @@ -257,7 +258,7 @@ public class EntranceFragment extends MvpFragment { mApis.getSearchManagerApi().goSettings(); @@ -268,8 +269,19 @@ public class EntranceFragment extends MvpFragment{ + if (groupFix.getVisibility() == View.VISIBLE) { + groupFix.setVisibility(View.GONE); + }else{ + groupFix.setVisibility(View.VISIBLE); + } + return true; + }); } + groupFix = findViewById(R.id.groupFix); + ConstraintLayout rootView = findViewById(R.id.module_entrance_id_top_motion_layout); if (rootView != null) { TopViewAnimHelper.getInstance().init(rootView); @@ -347,8 +359,6 @@ public class EntranceFragment extends MvpFragment{ + try { + String times = etTimes.getText().toString().trim(); + int fixTime = Integer.parseInt(times); + Logger.d(TAG, "修改上报时间间隔: " + times + " fixTime: " + fixTime); + if(fixTime > 0) { + Intent intent = new Intent("com.mogo.launcher.action.FIX_UPLOAT_DELAY"); + intent.putExtra("fixTime", fixTime); + getContext().sendBroadcast(intent); + TipToast.tip("已经发送修改广播"); + }else{ + TipToast.tip("fixTime为0,不发送广播"); + } + } catch (Exception e) { + TipToast.tip("fixTime异常"); + e.printStackTrace(); + } + }); } + private EditText etTimes; + private Group groupFix; + private void enterVrMode(){ tvEnterVrMode.setVisibility(View.GONE); mMove2CurrentLocation.setVisibility(View.GONE); @@ -444,6 +476,7 @@ public class EntranceFragment extends MvpFragment + + +