diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 54349e6..7abdbfc 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -23,6 +23,7 @@
+
diff --git a/foudations/mogo-socket/src/main/java/com/mogo/cloud/socket/SocketManager.java b/foudations/mogo-socket/src/main/java/com/mogo/cloud/socket/SocketManager.java
index a854ce2..072a5ed 100644
--- a/foudations/mogo-socket/src/main/java/com/mogo/cloud/socket/SocketManager.java
+++ b/foudations/mogo-socket/src/main/java/com/mogo/cloud/socket/SocketManager.java
@@ -26,6 +26,11 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import static com.mogo.cloud.httpdns.MogoHttpDnsConfig.HTTP_DNS_ENV_DEMO;
+import static com.mogo.cloud.httpdns.MogoHttpDnsConfig.HTTP_DNS_ENV_DEV;
+import static com.mogo.cloud.httpdns.MogoHttpDnsConfig.HTTP_DNS_ENV_QA;
+import static com.mogo.cloud.httpdns.MogoHttpDnsConfig.HTTP_DNS_ENV_RELEASE;
+
public class SocketManager implements IMogoCloudSocketManager, Callback {
private static final String TAG = "SocketManager";
@@ -176,12 +181,12 @@ public class SocketManager implements IMogoCloudSocketManager, Callback {
private Environment getEnvironment() {
switch (cloudClientConfig.getNetMode()) {
- case 1:
+ case HTTP_DNS_ENV_DEV:
return Environment.dev;
- case 2:
- case 4:
+ case HTTP_DNS_ENV_QA:
+ case HTTP_DNS_ENV_DEMO:
return Environment.qa;
- case 3:
+ case HTTP_DNS_ENV_RELEASE:
default:
return Environment.release;
}
diff --git a/modules/mogo-realtime/src/main/java/com/mogo/realtime/constant/SnapshotUploadInTime.java b/modules/mogo-realtime/src/main/java/com/mogo/realtime/constant/SnapshotUploadInTime.java
index 76dc0ca..2003736 100644
--- a/modules/mogo-realtime/src/main/java/com/mogo/realtime/constant/SnapshotUploadInTime.java
+++ b/modules/mogo-realtime/src/main/java/com/mogo/realtime/constant/SnapshotUploadInTime.java
@@ -1,43 +1,21 @@
package com.mogo.realtime.constant;
import android.content.Context;
-import android.os.SystemClock;
-import android.util.Log;
-import com.mogo.cloud.passport.MoGoAiCloudClient;
-import com.mogo.cloud.socket.IMogoCloudSocketOnMessageListener;
-import com.mogo.cloud.socket.MsgBody;
-import com.mogo.cloud.socket.SocketManager;
-import com.mogo.realtime.Interface.RealTimeApisHandler;
-import com.mogo.realtime.entity.ADASRecognizedResult;
import com.mogo.realtime.entity.CloudLocationInfo;
-import com.mogo.cloud.socket.WebSocketData;
-import com.mogo.realtime.location.LocationResult;
import com.mogo.realtime.location.MogoRTKLocation;
-import com.mogo.realtime.entity.OnePerSecondSendContent;
+import com.mogo.realtime.socket.IMogoCloudOnMsgListener;
import com.mogo.realtime.socket.SocketHandler;
-import com.mogo.realtime.util.MortonCode;
-import com.mogo.utils.network.utils.GsonUtil;
-import java.util.ArrayList;
import java.util.List;
-import static com.mogo.cloud.socket.WebSocketMsgType.MSG_TYPE_ACK;
-
/**
- * @author congtaowang
- * @since 2020/12/14
- *
- * 实时上报坐标、识别物体
+ *
*/
public class SnapshotUploadInTime implements MogoRTKLocation.RTKLocationListener {
private static final String TAG = "SnapshotUploadInTime";
-
private static volatile SnapshotUploadInTime sInstance;
- private Context mContext;
- private long serverTime = 0;
- private long receiveMsgTime = 0;
private SnapshotUploadInTime() {
}
@@ -57,13 +35,8 @@ public class SnapshotUploadInTime implements MogoRTKLocation.RTKLocationListener
sInstance = null;
}
- private Object readResolve() {
- // 阻止反序列化,必须实现 Serializable 接口
- return sInstance;
- }
-
- public void start(Context context, boolean useInner, String appId, IMogoCloudSocketOnMessageListener listener) {
- mContext = context.getApplicationContext();
+ //todo 检查是否需要配置 默认开始定位上报
+ public void start(Context context, boolean useInner, String appId, IMogoCloudOnMsgListener listener) {
MogoRTKLocation.getInstance().registerRTKLocationListener(this);
SocketHandler.getInstance().initSocket(context, useInner, appId, listener);
}
@@ -74,87 +47,7 @@ public class SnapshotUploadInTime implements MogoRTKLocation.RTKLocationListener
@Override
public void onLocationChanged(List cloudLocationInfos) {
- startSendCarLocationAndAdasRecognizedResult2Server(cloudLocationInfos);
+ SocketHandler.getInstance().sendMsg(cloudLocationInfos);
}
- private CloudLocationInfo mLastInfo;
-
- private void startSendCarLocationAndAdasRecognizedResult2Server(List cloudLocationInfo) {
- CloudLocationInfo lastInfo = null;
- // 如果数组内容不为空,就用数组最后一个值
- if (!cloudLocationInfo.isEmpty()) {
- lastInfo = cloudLocationInfo.get(cloudLocationInfo.size() - 1);
- mLastInfo = lastInfo;
- }
- if (lastInfo == null) {
- lastInfo = mLastInfo;
- }
- LocationResult locationResult = null;
- if (lastInfo != null) {
- // 定位点预测纠偏
- lastInfo = SimpleLocationCorrectStrategy.getInstance().correct(lastInfo);
- locationResult = new LocationResult();
- if (lastInfo != null) {
- locationResult.lastCoordinate = lastInfo;
- locationResult.mortonCode = MortonCode.wrapEncodeMorton(lastInfo.getLon(), lastInfo.getLat());
- }
- locationResult.coordinates = new ArrayList<>();
- locationResult.sn = MoGoAiCloudClient.getInstance().getAiCloudClientConfig().getSn();
- locationResult.coordinates.addAll(cloudLocationInfo);
- }
- List recognizedResults = RealTimeApisHandler.getInstance().getApis().getRecognizedResultManager().getLastADASRecognizedResult();//外显接口返回
- OnePerSecondSendContent content = new OnePerSecondSendContent();
- content.self = locationResult;
- content.adas = recognizedResults;
-
- if (content.self == null &&
- (content.adas == null || content.adas.isEmpty())) {
- Log.d(TAG, "no information 2 sent");
- return;
- }
- //发送socket msg
- WebSocketData webSocketData = new WebSocketData();
- webSocketData.setSeq(computeSendMsgTime());
- webSocketData.setSn(MoGoAiCloudClient.getInstance().getAiCloudClientConfig().getSn());
- webSocketData.setData(GsonUtil.jsonFromObject(content));
-// MogoLocation lastKnown = MogoApisHandler.getInstance().getApis().getMapServiceApi()
-// .getSingletonLocationClient(mContext)
-// .getLastKnowLocation();
-// if (lastKnown != null && !lastKnown.getCityCode().isEmpty()) {
-// webSocketData.setCityCode(lastKnown.getCityCode());
-// } else {
-// webSocketData.setCityCode(null);
-// }
- String msg = GsonUtil.jsonFromObject(webSocketData);
-
- int msgType = 0x040003; //低频数据
- if (cloudLocationInfo.size() > 2) {
- msgType = 0x040002; //高频数据
- }
- MsgBody msgBody = new MsgBody();
- msgBody.msgType(msgType);
- msgBody.content(msg);
- SocketManager.getInstance().sendMsg(msgBody, msgId -> {
-
- });
-
- }
-
- /**
- * 服务端会在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;
- if (serverTime > 0 && receiveMsgTime > 0) {
- sendMsgTime = serverTime + (SystemClock.elapsedRealtime() - receiveMsgTime);
- } else {
- sendMsgTime = System.currentTimeMillis();
- }
- return sendMsgTime;
- }
}
diff --git a/modules/mogo-realtime/src/main/java/com/mogo/realtime/entity/CloudRoadData.java b/modules/mogo-realtime/src/main/java/com/mogo/realtime/entity/CloudRoadData.java
new file mode 100644
index 0000000..f7dbead
--- /dev/null
+++ b/modules/mogo-realtime/src/main/java/com/mogo/realtime/entity/CloudRoadData.java
@@ -0,0 +1,240 @@
+package com.mogo.realtime.entity;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.text.TextUtils;
+
+import java.util.List;
+
+/**
+ * 云端道路数据
+ *
+ * @author tongchenfei
+ */
+public class CloudRoadData implements Parcelable {
+
+ public static final int FROM_MY_LOCATION = 1;
+ public static final int FROM_ADAS = 2;
+ public static final int FROM_ROAD_UNIT = 3;
+
+ /**
+ * 物体类型
+ */
+ private int type = -1;
+
+ private int fromType;
+
+ private double lat;
+ private double lon;
+
+ private String uuid;
+ private String sn;
+
+ private double speed;
+ private double heading;
+
+ private long systemTime;
+
+ /**
+ * 红绿灯状态 1红 2绿 3黄
+ */
+ private int lightStatus;//
+ /**
+ * 红绿灯剩余时间 读秒
+ */
+ private int lightLeftTime;
+ /**
+ * 视频流直播地址
+ */
+ private String rtmpUrl;//
+
+ private double distance;//距离
+
+ private List< CloudLocationInfo > coordinates;
+
+
+ public int getType() {
+ return type;
+ }
+
+ public void setType( int type ) {
+ this.type = type;
+ }
+
+ public double getLat() {
+ return lat;
+ }
+
+ public void setLat( double lat ) {
+ this.lat = lat;
+ }
+
+ public double getLon() {
+ return lon;
+ }
+
+ public void setLon( double lon ) {
+ this.lon = lon;
+ }
+
+ public double getSpeed() {
+ return speed;
+ }
+
+ public void setSpeed( double speed ) {
+ this.speed = speed;
+ }
+
+ public long getSystemTime() {
+ return systemTime;
+ }
+
+ public void setSystemTime( long systemTime ) {
+ this.systemTime = systemTime;
+ }
+
+ public int getLightStatus() {
+ return lightStatus;
+ }
+
+ public void setLightStatus( int lightStatus ) {
+ this.lightStatus = lightStatus;
+ }
+
+ public int getLightLeftTime() {
+ return lightLeftTime;
+ }
+
+ public void setLightLeftTime( int lightLeftTime ) {
+ this.lightLeftTime = lightLeftTime;
+ }
+
+ public String getRtmpUrl() {
+ return rtmpUrl;
+ }
+
+ public void setRtmpUrl( String rtmpUrl ) {
+ this.rtmpUrl = rtmpUrl;
+ }
+
+ public double getDistance() {
+ return distance * 1000;
+ }
+
+ public void setDistance( double distance ) {
+ this.distance = distance;
+ }
+
+ public List< CloudLocationInfo > getCoordinates() {
+ return coordinates;
+ }
+
+ public void setCoordinates( List< CloudLocationInfo > coordinates ) {
+ this.coordinates = coordinates;
+ }
+
+ public void setUuid( String uuid ) {
+ this.uuid = uuid;
+ }
+
+ public String getUuid() {
+ return uuid;
+ }
+
+ public String getSn() {
+ return sn;
+ }
+
+ public double getHeading() {
+ return heading;
+ }
+
+ public void setHeading( double heading ) {
+ this.heading = heading;
+ }
+
+ public String getUniqueKey() {
+ if ( !TextUtils.isEmpty( uuid ) ) {
+ return uuid;
+ }
+ return sn;
+ }
+
+ public int getFromType() {
+ return fromType;
+ }
+
+ public void setFromType( int fromType ) {
+ this.fromType = fromType;
+ }
+
+ public CloudRoadData() {
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel( Parcel dest, int flags ) {
+ dest.writeInt( this.type );
+ dest.writeInt( this.fromType );
+ dest.writeDouble( this.lat );
+ dest.writeDouble( this.lon );
+ dest.writeString( this.uuid );
+ dest.writeString( this.sn );
+ dest.writeDouble( this.speed );
+ dest.writeDouble( this.heading );
+ dest.writeLong( this.systemTime );
+ dest.writeInt( this.lightStatus );
+ dest.writeInt( this.lightLeftTime );
+ dest.writeString( this.rtmpUrl );
+ dest.writeDouble( this.distance );
+ dest.writeTypedList( this.coordinates );
+ }
+
+ protected CloudRoadData(Parcel in ) {
+ this.type = in.readInt();
+ this.fromType = in.readInt();
+ this.lat = in.readDouble();
+ this.lon = in.readDouble();
+ this.uuid = in.readString();
+ this.sn = in.readString();
+ this.speed = in.readDouble();
+ this.heading = in.readDouble();
+ this.systemTime = in.readLong();
+ this.lightStatus = in.readInt();
+ this.lightLeftTime = in.readInt();
+ this.rtmpUrl = in.readString();
+ this.distance = in.readDouble();
+ this.coordinates = in.createTypedArrayList( CloudLocationInfo.CREATOR );
+ }
+
+ public static final Creator CREATOR = new Creator() {
+ @Override
+ public CloudRoadData createFromParcel(Parcel source ) {
+ return new CloudRoadData( source );
+ }
+
+ @Override
+ public CloudRoadData[] newArray(int size ) {
+ return new CloudRoadData[size];
+ }
+ };
+
+ @Override
+ public boolean equals( Object o ) {
+ if ( this == o ) {
+ return true;
+ }
+ if ( o == null || getClass() != o.getClass() ) {
+ return false;
+ }
+ CloudRoadData that = (CloudRoadData) o;
+ return Double.compare( that.lat, lat ) == 0 &&
+ Double.compare( that.lon, lon ) == 0;
+ }
+
+
+}
diff --git a/modules/mogo-realtime/src/main/java/com/mogo/realtime/entity/MogoSnapshotSetData.java b/modules/mogo-realtime/src/main/java/com/mogo/realtime/entity/MogoSnapshotSetData.java
new file mode 100644
index 0000000..3f2db5a
--- /dev/null
+++ b/modules/mogo-realtime/src/main/java/com/mogo/realtime/entity/MogoSnapshotSetData.java
@@ -0,0 +1,151 @@
+package com.mogo.realtime.entity;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.List;
+
+public
+/*
+ * @author congtaowang
+ * @since 2020/10/26
+ *
+ * 描述
+ */
+class MogoSnapshotSetData implements Parcelable {
+
+ private String msgId;
+
+ private long time;
+
+ //过期时间
+ private long expire;
+
+ //总数据集合
+ private List allList;
+
+ // 近景adas数据
+ private List nearList;
+
+ //红绿灯
+ private CloudRoadData trafficLight;
+
+ //路边摄像头
+ private CloudRoadData camera;
+
+ // 自车速度 本地添加
+ public double curSpeed = 0.0;
+
+
+ @Override
+ public String toString() {
+ return "MogoSnapshotSetData{" +
+ "msgId='" + msgId + '\'' +
+ ", time=" + time +
+ ", expire=" + expire +
+ ", allList=" + allList +
+ ", nearList=" + nearList +
+ ", camera=" + camera +
+ ", curSpeed=" + curSpeed +
+ '}';
+ }
+
+ public String getMsgId() {
+ return msgId;
+ }
+
+ public void setMsgId(String msgId) {
+ this.msgId = msgId;
+ }
+
+ public long getTime() {
+ return time;
+ }
+
+ public void setTime(long time) {
+ this.time = time;
+ }
+
+ public long getExpire() {
+ return expire;
+ }
+
+ public void setExpire(long expire) {
+ this.expire = expire;
+ }
+
+ public List getAllList() {
+ return allList;
+ }
+
+ public void setAllList(List allList) {
+ this.allList = allList;
+ }
+
+ public CloudRoadData getTrafficLight() {
+ return trafficLight;
+ }
+
+ public void setTrafficLight(CloudRoadData trafficLight) {
+ this.trafficLight = trafficLight;
+ }
+
+ public CloudRoadData getCamera() {
+ return camera;
+ }
+
+ public void setCamera(CloudRoadData camera) {
+ this.camera = camera;
+ }
+
+ public List< CloudRoadData > getNearList() {
+ return nearList;
+ }
+
+ public void setNearList( List< CloudRoadData > nearList ) {
+ this.nearList = nearList;
+ }
+
+ public MogoSnapshotSetData() {
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel( Parcel dest, int flags ) {
+ dest.writeString( this.msgId );
+ dest.writeLong( this.time );
+ dest.writeLong( this.expire );
+ dest.writeTypedList( this.allList );
+ dest.writeTypedList( this.nearList );
+ dest.writeParcelable( this.trafficLight, flags );
+ dest.writeParcelable( this.camera, flags );
+ dest.writeDouble( this.curSpeed );
+ }
+
+ protected MogoSnapshotSetData(Parcel in ) {
+ this.msgId = in.readString();
+ this.time = in.readLong();
+ this.expire = in.readLong();
+ this.allList = in.createTypedArrayList( CloudRoadData.CREATOR );
+ this.nearList = in.createTypedArrayList( CloudRoadData.CREATOR );
+ this.trafficLight = in.readParcelable( CloudRoadData.class.getClassLoader() );
+ this.camera = in.readParcelable( CloudRoadData.class.getClassLoader() );
+ this.curSpeed = in.readDouble();
+ }
+
+ public static final Creator CREATOR = new Creator() {
+ @Override
+ public MogoSnapshotSetData createFromParcel(Parcel source ) {
+ return new MogoSnapshotSetData( source );
+ }
+
+ @Override
+ public MogoSnapshotSetData[] newArray(int size ) {
+ return new MogoSnapshotSetData[size];
+ }
+ };
+}
diff --git a/modules/mogo-realtime/src/main/java/com/mogo/realtime/entity/OnePerSecondSendContent.java b/modules/mogo-realtime/src/main/java/com/mogo/realtime/entity/OnePerSecondSendContent.java
index 671cec0..4d6b4f6 100644
--- a/modules/mogo-realtime/src/main/java/com/mogo/realtime/entity/OnePerSecondSendContent.java
+++ b/modules/mogo-realtime/src/main/java/com/mogo/realtime/entity/OnePerSecondSendContent.java
@@ -1,8 +1,6 @@
package com.mogo.realtime.entity;
-import com.mogo.realtime.location.LocationResult;
-
import java.util.List;
public
diff --git a/modules/mogo-realtime/src/main/java/com/mogo/realtime/location/LocationResult.java b/modules/mogo-realtime/src/main/java/com/mogo/realtime/location/LocationResult.java
deleted file mode 100644
index fb8ff9f..0000000
--- a/modules/mogo-realtime/src/main/java/com/mogo/realtime/location/LocationResult.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.mogo.realtime.location;
-
-import com.mogo.realtime.entity.CloudLocationInfo;
-
-import java.util.List;
-
-public
-/**
- * @author congtaowang
- * @since 2020/10/25
- *
- * 自车定位信息
- */
-class LocationResult {
-
- /**
- * sn
- */
- public String sn;
-
- /**
- * 最后一个定位点的莫顿码
- */
- public long mortonCode;
-
- /**
- * 最后一个定位点
- */
- public CloudLocationInfo lastCoordinate;
-
- /**
- * 1s 内的连续定位点
- */
- public List< CloudLocationInfo > coordinates;
-}
diff --git a/modules/mogo-realtime/src/main/java/com/mogo/realtime/location/MogoRTKLocation.java b/modules/mogo-realtime/src/main/java/com/mogo/realtime/location/MogoRTKLocation.java
index 38c57fe..97a64f8 100644
--- a/modules/mogo-realtime/src/main/java/com/mogo/realtime/location/MogoRTKLocation.java
+++ b/modules/mogo-realtime/src/main/java/com/mogo/realtime/location/MogoRTKLocation.java
@@ -46,8 +46,6 @@ public class MogoRTKLocation {
if (msg.what == MSG_DATA_CHANGED) {
mHandler.sendEmptyMessageDelayed(MSG_DATA_CHANGED, uploadDelay);
sendLocationData();
-
-// Logger.d(TAG,"handleMessage开始发送消息");
}
}
};
diff --git a/modules/mogo-realtime/src/main/java/com/mogo/realtime/socket/IMogoCloudOnMsgListener.java b/modules/mogo-realtime/src/main/java/com/mogo/realtime/socket/IMogoCloudOnMsgListener.java
new file mode 100644
index 0000000..ba641f1
--- /dev/null
+++ b/modules/mogo-realtime/src/main/java/com/mogo/realtime/socket/IMogoCloudOnMsgListener.java
@@ -0,0 +1,8 @@
+package com.mogo.realtime.socket;
+
+import com.mogo.realtime.entity.MogoSnapshotSetData;
+
+public interface IMogoCloudOnMsgListener {
+
+ void onMsgReceived(MogoSnapshotSetData mogoSnapshotSetData);
+}
diff --git a/modules/mogo-realtime/src/main/java/com/mogo/realtime/socket/SocketHandler.java b/modules/mogo-realtime/src/main/java/com/mogo/realtime/socket/SocketHandler.java
index 0d9127a..9dec21d 100644
--- a/modules/mogo-realtime/src/main/java/com/mogo/realtime/socket/SocketHandler.java
+++ b/modules/mogo-realtime/src/main/java/com/mogo/realtime/socket/SocketHandler.java
@@ -2,26 +2,42 @@ package com.mogo.realtime.socket;
import android.content.Context;
import android.os.SystemClock;
+import android.util.Log;
+import com.mogo.cloud.passport.MoGoAiCloudClient;
import com.mogo.cloud.socket.IMogoCloudSocketOnMessageListener;
+import com.mogo.cloud.socket.MsgBody;
import com.mogo.cloud.socket.SocketManager;
import com.mogo.cloud.socket.WebSocketData;
+import com.mogo.realtime.Interface.RealTimeApisHandler;
+import com.mogo.realtime.constant.SimpleLocationCorrectStrategy;
+import com.mogo.realtime.entity.ADASRecognizedResult;
+import com.mogo.realtime.entity.CloudLocationInfo;
+import com.mogo.realtime.entity.LocationResult;
+import com.mogo.realtime.entity.MogoSnapshotSetData;
+import com.mogo.realtime.entity.OnePerSecondSendContent;
+import com.mogo.realtime.util.MortonCode;
import com.mogo.utils.network.utils.GsonUtil;
+import java.util.ArrayList;
import java.util.List;
import static com.mogo.cloud.socket.WebSocketMsgType.MSG_TYPE_ACK;
+import static com.mogo.cloud.socket.WebSocketMsgType.MSG_TYPE_DOWNLINK_CAR_DATA;
+import static com.mogo.cloud.socket.WebSocketMsgType.MSG_TYPE_UPLINK_CAR_DATA;
/**
- * @author liujing
- * @description 描述
- * @since: 2021/1/22
+ *
*/
public class SocketHandler {
+
+ private static final String TAG = "SocketHandler";
private static volatile SocketHandler mInstance;
+
private long serverTime = 0;
private long receiveMsgTime = 0;
- private List listenerList;
+ private CloudLocationInfo mLastInfo;
+ private final List listenerList = new ArrayList<>();
public static SocketHandler getInstance() {
if (mInstance == null) {
@@ -37,27 +53,23 @@ public class SocketHandler {
/*
* useInner: 是否注册自己内部的监听
* */
- public void initSocket(Context context, boolean useInner, String appId, IMogoCloudSocketOnMessageListener listener) {
+ public void initSocket(Context context, boolean useInner, String appId, IMogoCloudOnMsgListener listener) {
SocketManager.getInstance().init(context, appId);
- if (useInner) {
- SocketManager.getInstance().registerOnMessageListener(0x040002, onMessageListener);
- SocketManager.getInstance().registerOnMessageListener(0x040003, onMessageListener);
- } else {
- SocketManager.getInstance().registerOnMessageListener(0x040002, listener);
- SocketManager.getInstance().registerOnMessageListener(0x040003, listener);
+ SocketManager.getInstance().registerOnMessageListener(0x040002, onMessageListener);
+ SocketManager.getInstance().registerOnMessageListener(0x040003, onMessageListener);
+ if (listener != null && !listenerList.contains(listener)) {
listenerList.add(listener);
}
}
- private final IMogoCloudSocketOnMessageListener onMessageListener = new IMogoCloudSocketOnMessageListener() {
+ private final IMogoCloudSocketOnMessageListener onMessageListener = new IMogoCloudSocketOnMessageListener() {
@Override
- public Class target() {
- return String.class;
+ public Class target() {
+ return WebSocketData.class;
}
@Override
- public void onMsgReceived(String message) {
- WebSocketData webSocketData = GsonUtil.objectFromJson(message, WebSocketData.class);
+ public void onMsgReceived(WebSocketData webSocketData) {
int msgType = webSocketData.getMsgType();
if (msgType == MSG_TYPE_ACK.getMsgType()) {
if (webSocketData.getUtcTime() > 0) {
@@ -70,17 +82,93 @@ public class SocketHandler {
}
}
}
+ if (msgType == MSG_TYPE_DOWNLINK_CAR_DATA.getMsgType()) {
+ MogoSnapshotSetData data = GsonUtil.objectFromJson(webSocketData.getData(), MogoSnapshotSetData.class);
+ if (data == null) {
+ Log.e(TAG, "onMsgReceived MogoSnapshotSetData == null ");
+ return;
+ }
+ for (IMogoCloudOnMsgListener listener : listenerList) {
+ listener.onMsgReceived(data);
+ }
+ }
}
};
- public void stop() {
- //todo
-// MogoRTKLocation.getInstance().unregisterRTKLocationListener();
-// MogoRTKLocation.getInstance().stop();
- for (int i = 0; i < listenerList.size(); i++) {
- SocketManager.getInstance().unregisterOnMessageListener(0x040002, listenerList.get(i));
- SocketManager.getInstance().unregisterOnMessageListener(0x040003, listenerList.get(i));
+ public void sendMsg(List cloudLocationInfo) {
+ CloudLocationInfo lastInfo = null;
+ // 如果数组内容不为空,就用数组最后一个值
+ if (!cloudLocationInfo.isEmpty()) {
+ lastInfo = cloudLocationInfo.get(cloudLocationInfo.size() - 1);
+ mLastInfo = lastInfo;
}
+ if (lastInfo == null) {
+ lastInfo = mLastInfo;
+ }
+ LocationResult locationResult = null;
+ if (lastInfo != null) {
+ // 定位点预测纠偏
+ lastInfo = SimpleLocationCorrectStrategy.getInstance().correct(lastInfo);
+ locationResult = new LocationResult();
+ if (lastInfo != null) {
+ locationResult.lastCoordinate = lastInfo;
+ locationResult.mortonCode = MortonCode.wrapEncodeMorton(lastInfo.getLon(), lastInfo.getLat());
+ }
+ locationResult.coordinates = new ArrayList<>();
+ locationResult.sn = MoGoAiCloudClient.getInstance().getAiCloudClientConfig().getSn();
+ locationResult.coordinates.addAll(cloudLocationInfo);
+ }
+ List recognizedResults = RealTimeApisHandler.getInstance().getApis().getRecognizedResultManager().getLastADASRecognizedResult();//外显接口返回
+ OnePerSecondSendContent content = new OnePerSecondSendContent();
+ content.self = locationResult;
+ content.adas = recognizedResults;
+
+ if (content.self == null &&
+ (content.adas == null || content.adas.isEmpty())) {
+ Log.d(TAG, "no information to sent");
+ return;
+ }
+ WebSocketData webSocketData = new WebSocketData();
+ webSocketData.setMsgType(MSG_TYPE_UPLINK_CAR_DATA.getMsgType());
+ webSocketData.setSeq(computeSendMsgTime());
+ webSocketData.setSn(MoGoAiCloudClient.getInstance().getAiCloudClientConfig().getSn());
+ webSocketData.setData(GsonUtil.jsonFromObject(content));
+ String msg = GsonUtil.jsonFromObject(webSocketData);
+
+ int msgType = 0x040003; //低频数据
+ if (cloudLocationInfo.size() > 2) {
+ msgType = 0x040002; //高频数据
+ }
+ MsgBody msgBody = new MsgBody();
+ msgBody.msgType(msgType);
+ msgBody.content(msg);
+ SocketManager.getInstance().sendMsg(msgBody, msgId -> {
+
+ });
+ }
+
+ public void stop() {
+ SocketManager.getInstance().unregisterOnMessageListener(0x040002, onMessageListener);
+ SocketManager.getInstance().unregisterOnMessageListener(0x040003, onMessageListener);
+ listenerList.clear();
+ }
+
+ /**
+ * 服务端会在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;
+ if (serverTime > 0 && receiveMsgTime > 0) {
+ sendMsgTime = serverTime + (SystemClock.elapsedRealtime() - receiveMsgTime);
+ } else {
+ sendMsgTime = System.currentTimeMillis();
+ }
+ return sendMsgTime;
}
}