implements Serializable {
+
+ private long seq;
+
+ private int msgType;
+
+ private T t;
+
+ public long getSeq() {
+ return seq;
+ }
+
+ public void setSeq(long seq) {
+ this.seq = seq;
+ }
+
+ public int getMsgType() {
+ return msgType;
+ }
+
+ public void setMsgType(int msgType) {
+ this.msgType = msgType;
+ }
+
+ public T getT() {
+ return t;
+ }
+
+ public void setT(T t) {
+ this.t = t;
+ }
+}
diff --git a/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketHandlerThread.java b/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketHandlerThread.java
new file mode 100644
index 0000000000..e26eb49929
--- /dev/null
+++ b/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketHandlerThread.java
@@ -0,0 +1,39 @@
+package com.mogo.base.websocket;
+
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Message;
+
+import com.mogo.utils.logger.Logger;
+import com.mogo.websocket.SocketClient;
+
+public class WebSocketHandlerThread extends HandlerThread {
+
+ private Handler mHandler;
+ private String tag;
+
+ private static final int MSG_SEND = 1;
+
+ public WebSocketHandlerThread(String name) {
+ super(name);
+ tag = name;
+ mHandler = new Handler(this.getLooper()) {
+ @Override
+ public void handleMessage(Message msg) {
+ super.handleMessage(msg);
+ if (msg.what == MSG_SEND) {
+ Logger.d(tag, "WebSocketHandlerThread handleMessage = %d", msg.obj.toString());
+ SocketClient.getInstance().getClientProxy().sendMessage(msg.obj.toString());
+ }
+ }
+ };
+ }
+
+ public void sendMsg(String msg) {
+ Message message = new Message();
+ message.what = MSG_SEND;
+ message.obj = msg;
+ mHandler.sendMessage(message);
+ }
+
+}
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
new file mode 100644
index 0000000000..948b9d5208
--- /dev/null
+++ b/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketManager.java
@@ -0,0 +1,179 @@
+package com.mogo.base.websocket;
+
+import android.content.Context;
+
+import androidx.annotation.Keep;
+
+import com.google.gson.Gson;
+import com.mogo.commons.network.Utils;
+import com.mogo.service.connection.IMogoMsgAckListener;
+import com.mogo.service.connection.IMogoOnWebSocketMessageListener;
+import com.mogo.service.connection.IMogoWebSocketManager;
+import com.mogo.utils.logger.Logger;
+import com.mogo.utils.network.utils.GsonUtil;
+import com.mogo.websocket.ISocketMsgCallBack;
+import com.mogo.websocket.ISocketMsgSetting;
+import com.mogo.websocket.SocketClient;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import static com.mogo.service.connection.WebSocketMsgType.MSG_TYPE_SERVER;
+
+@Keep
+public class WebSocketManager implements IMogoWebSocketManager, ISocketMsgSetting, ISocketMsgCallBack {
+
+ private static final String TAG = "WebSocketManager-sdk";
+
+ private static volatile WebSocketManager sInstance;
+ private WebSocketHandlerThread handlerThread;
+
+ public WebSocketManager(Context context) {
+ handlerThread = new WebSocketHandlerThread(TAG);
+ handlerThread.start();
+ }
+
+ @Keep
+ public static WebSocketManager getInstance(Context context) {
+ if (sInstance == null) {
+ synchronized (WebSocketManager.class) {
+ if (sInstance == null) {
+ sInstance = new WebSocketManager(context);
+ }
+ }
+ }
+ return sInstance;
+ }
+
+ /**
+ * 管理消息分发
+ *
+ * key - msgType
+ */
+ private Map> mListeners = new ConcurrentHashMap<>();
+
+ /**
+ * 管理消息回执
+ *
+ * key - msgId
+ */
+ private Map mAckListeners = new ConcurrentHashMap<>();
+
+ @Override
+ public void init(Context context, String appId) {
+ SocketClient.getInstance().getClientProxy().initSocketServer(WebSocketConstant.getSocketServer());
+ SocketClient.getInstance().getClientProxy().getMessageSettings(this);
+ SocketClient.getInstance().getClientProxy().addISocketMsgCallBack(this);
+ SocketClient.getInstance().getClientProxy().startConnect();
+ }
+
+ @Override
+ public void registerOnWebSocketMessageListener(IMogoOnWebSocketMessageListener listener) {
+ if (listener.getType() == null) {
+ Logger.w(TAG, "websocket registerListener msgType is not exist");
+ return;
+ }
+ int msgType = listener.getType().getMsgType();
+ if (mListeners.containsKey(msgType)) {
+ Logger.w(TAG, "websocket msgType %d is exist.", msgType);
+ }
+ if (!mListeners.containsKey(msgType)) {
+ mListeners.put(msgType, new ArrayList<>());
+ }
+ mListeners.get(msgType).add(listener);
+ Logger.d(TAG, "websocket add listener success");
+ }
+
+ @Override
+ public void unregisterOnWebSocketMessageListener(IMogoOnWebSocketMessageListener listener) {
+ if (listener == null) {
+ return;
+ }
+ if (listener.getType() == null) {
+ Logger.w(TAG, "websocket unregisterListener msgType is not exist");
+ return;
+ }
+ int msgType = listener.getType().getMsgType();
+ if (!mListeners.containsKey(msgType)) {
+ return;
+ }
+ List listeners = mListeners.get(msgType);
+ if (listeners != null && listeners.contains(listener)) {
+ listeners.remove(listener);
+ Logger.d(TAG, "websocket remove listener success");
+ }
+ }
+
+ @Override
+ public void sendMsg(Object body, IMogoOnWebSocketMessageListener listener) {
+ Logger.d(TAG, "websocket sendMsg body = %d , listener = %d ", body, listener);
+ if (handlerThread != null) {
+ WebSocketData webSocketData = new WebSocketData();
+ webSocketData.setSeq(System.currentTimeMillis());
+ webSocketData.setMsgType(listener.getType().getMsgType());
+ webSocketData.setT(body);
+ handlerThread.sendMsg(new Gson().toJson(webSocketData));
+ }
+ }
+
+ @Override
+ public void init(Context context) {
+
+ }
+
+ @Override
+ public void onConnectOpen() {
+ Logger.d(TAG, "websocket onConnectOpen");
+ }
+
+ @Override
+ public void handleMessage(String message) {
+ Logger.d(TAG, "websocket received msg = %d ", message);
+ WebSocketData webSocketData = GsonUtil.objectFromJson(message, WebSocketData.class);
+ int msgType = webSocketData.getMsgType();
+ Logger.d(TAG, "websocket received msg type = %d", msgType);
+ //服务端下发数据返回,上传数据回执默认不返回
+ if (msgType == MSG_TYPE_SERVER.getMsgType()) {
+ List listeners = mListeners.get(msgType);
+ if (listeners != null && !listeners.isEmpty()) {
+ Iterator iterator = listeners.iterator();
+ while (iterator.hasNext()) {
+ IMogoOnWebSocketMessageListener listener = iterator.next();
+ if (listener != null) {
+ Logger.d(TAG, "received msgId = %s, content = %s", webSocketData.getSeq(), webSocketData.getT().toString());
+ listener.onMsgReceived(webSocketData.getT());
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onConnectClose() {
+ Logger.d(TAG, "websocket ready to reconnect");
+ SocketClient.getInstance().getClientProxy().reConnect();
+ }
+
+ @Override
+ public void handleError(Exception e) {
+ Logger.e(TAG, "websocket handleError : %d", e.getMessage());
+ }
+
+ @Override
+ public String getHandShakeMsg() {
+ WebSocketShakeHandsData webSocketShakeHandData = new WebSocketShakeHandsData(
+ System.currentTimeMillis(),
+ Utils.getSn(),
+ true
+ );
+ return GsonUtil.jsonFromObject(webSocketShakeHandData);
+ }
+
+ @Override
+ public String getHeartBeatMsg() {
+ return null;
+ }
+}
diff --git a/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketShakeHandsData.java b/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketShakeHandsData.java
new file mode 100644
index 0000000000..9ac94d62ae
--- /dev/null
+++ b/foudations/mogo-base-websocket-sdk/src/main/java/com/mogo/base/websocket/WebSocketShakeHandsData.java
@@ -0,0 +1,55 @@
+package com.mogo.base.websocket;
+
+import java.io.Serializable;
+
+public class WebSocketShakeHandsData implements Serializable {
+
+ public WebSocketShakeHandsData(){
+
+ }
+
+ public WebSocketShakeHandsData(long seq, String sn, boolean bind) {
+ this.seq = seq;
+ this.sn = sn;
+ this.bind = bind;
+ }
+
+ /**
+ * 请求序列号
+ */
+ private long seq;
+
+ /**
+ * 车机sn
+ */
+ private String sn;
+
+ /**
+ * 是否申请通道绑定
+ */
+ private boolean bind;
+
+ public long getSeq() {
+ return seq;
+ }
+
+ public void setSeq(long seq) {
+ this.seq = seq;
+ }
+
+ public String getSn() {
+ return sn;
+ }
+
+ public void setSn(String sn) {
+ this.sn = sn;
+ }
+
+ public boolean isBind() {
+ return bind;
+ }
+
+ public void setBind(boolean bind) {
+ this.bind = bind;
+ }
+}
diff --git a/foudations/mogo-base-websocket-sdk/src/test/java/com/mogo/mogo_base_websocket_sdk/ExampleUnitTest.java b/foudations/mogo-base-websocket-sdk/src/test/java/com/mogo/mogo_base_websocket_sdk/ExampleUnitTest.java
new file mode 100644
index 0000000000..36ec8a5bae
--- /dev/null
+++ b/foudations/mogo-base-websocket-sdk/src/test/java/com/mogo/mogo_base_websocket_sdk/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.mogo.mogo_base_websocket_sdk;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
index 98d245ce8e..20a7a16067 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -60,6 +60,7 @@ MOGO_MODULE_V2X_VERSION=2.0.0
# 基础服务实现:passport、socket、location
MOGO_BASE_SERVICES_APK_VERSION = 2.0.0
MOGO_BASE_SERVICES_SDK_VERSION = 2.0.0
+MOGO_BASE_WEBSOCKET_SDK_VERSION = 1.0.0
## 工程外部模块
# 探路
MOGO_MODULE_TANLU_VERSION=2.0.0
diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java b/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java
index f6e0f9ee03..b33adead45 100644
--- a/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java
+++ b/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java
@@ -8,6 +8,7 @@ import com.mogo.service.analytics.IMogoAnalytics;
import com.mogo.service.auth.IMogoAuthManager;
import com.mogo.service.cardmanager.IMogoCardManager;
import com.mogo.service.connection.IMogoSocketManager;
+import com.mogo.service.connection.IMogoWebSocketManager;
import com.mogo.service.datamanager.IMogoDataManager;
import com.mogo.service.entrance.IMogoEntranceButtonController;
import com.mogo.service.eventpanel.IEventPanelProvider;
@@ -69,6 +70,11 @@ public interface IMogoServiceApis extends IProvider {
*/
IMogoSocketManager getSocketManagerApi( Context context );
+ /**
+ * 获取WebSocket操作api
+ */
+ IMogoWebSocketManager getWebSocketManagerApi( Context context );
+
/**
* 大而全的数据管理接口
*
diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java b/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java
index 8184350abf..90110ecd81 100644
--- a/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java
+++ b/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java
@@ -51,6 +51,12 @@ public class MogoServicePaths {
@Deprecated
public static final String PATH_SOCKET_MANAGER = "/socket/manager";
+ /**
+ * WebSocket 长链
+ */
+ @Deprecated
+ public static final String PATH_WEB_SOCKET_MANAGER = "/websocket/manager";
+
/**
* 状态管理接口
*/
diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/connection/IMogoOnWebSocketMessageListener.java b/services/mogo-service-api/src/main/java/com/mogo/service/connection/IMogoOnWebSocketMessageListener.java
new file mode 100644
index 0000000000..fb3bcb0769
--- /dev/null
+++ b/services/mogo-service-api/src/main/java/com/mogo/service/connection/IMogoOnWebSocketMessageListener.java
@@ -0,0 +1,13 @@
+package com.mogo.service.connection;
+
+/**
+ * 消息回调
+ */
+public interface IMogoOnWebSocketMessageListener< T > {
+
+ WebSocketMsgType getType();
+
+ void onMsgReceived(T obj);
+
+ void onError(String errorMsg);
+}
diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/connection/IMogoWebSocketManager.java b/services/mogo-service-api/src/main/java/com/mogo/service/connection/IMogoWebSocketManager.java
new file mode 100644
index 0000000000..1409b2b2c3
--- /dev/null
+++ b/services/mogo-service-api/src/main/java/com/mogo/service/connection/IMogoWebSocketManager.java
@@ -0,0 +1,38 @@
+package com.mogo.service.connection;
+
+import android.content.Context;
+
+import com.alibaba.android.arouter.facade.template.IProvider;
+
+public interface IMogoWebSocketManager extends IProvider {
+
+ /**
+ * 初始化,各模块不用关心
+ *
+ * @param context 上下文
+ * @param appId 一般为包名,不参与通道的建立,一般用于发消息
+ */
+ void init( Context context, String appId );
+
+ /**
+ * 注册消息监听
+ *
+ * @param listener 回调
+ */
+ void registerOnWebSocketMessageListener(IMogoOnWebSocketMessageListener listener );
+
+ /**
+ * 注销消息监听
+ *
+ */
+ void unregisterOnWebSocketMessageListener(IMogoOnWebSocketMessageListener listener );
+
+ /**
+ * 发送消息
+ *
+ * @param body 消息体
+ * @param listener 回执监听
+ */
+ void sendMsg( T body, IMogoOnWebSocketMessageListener listener );
+
+}
diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/connection/WebSocketMsgType.java b/services/mogo-service-api/src/main/java/com/mogo/service/connection/WebSocketMsgType.java
new file mode 100644
index 0000000000..5718ac44bc
--- /dev/null
+++ b/services/mogo-service-api/src/main/java/com/mogo/service/connection/WebSocketMsgType.java
@@ -0,0 +1,24 @@
+package com.mogo.service.connection;
+
+public enum WebSocketMsgType {
+
+ MSG_TYPE_SELF(0,"自车数据"),
+ MSG_TYPE_ADAS(1,"ADAS数据"),
+ MSG_TYPE_SERVER(2,"服务端下发车辆信息");
+
+ private int msgType;
+ private String msg;
+
+ WebSocketMsgType(int msgType, String msg) {
+ this.msgType = msgType;
+ this.msg = msg;
+ }
+
+ public int getMsgType() {
+ return msgType;
+ }
+
+ public void setMsgType(int msgType) {
+ this.msgType = msgType;
+ }
+}
diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java b/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java
index 36f61a534f..a1b5529e3a 100644
--- a/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java
+++ b/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java
@@ -12,6 +12,7 @@ import com.mogo.service.analytics.IMogoAnalytics;
import com.mogo.service.auth.IMogoAuthManager;
import com.mogo.service.cardmanager.IMogoCardManager;
import com.mogo.service.connection.IMogoSocketManager;
+import com.mogo.service.connection.IMogoWebSocketManager;
import com.mogo.service.datamanager.IMogoDataManager;
import com.mogo.service.entrance.IMogoEntranceButtonController;
import com.mogo.service.eventpanel.IEventPanelProvider;
@@ -72,6 +73,11 @@ public class MogoServiceApis implements IMogoServiceApis {
return getApiInstance( IMogoSocketManager.class, MogoServicePaths.PATH_SOCKET_MANAGER );
}
+ @Override
+ public IMogoWebSocketManager getWebSocketManagerApi(Context context) {
+ return getApiInstance( IMogoWebSocketManager.class, MogoServicePaths.PATH_WEB_SOCKET_MANAGER );
+ }
+
@Override
public IMogoFragmentManager getFragmentManagerApi() {
return SingletonsHolder.get( IMogoFragmentManager.class );
diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/connection/MogoWebSocketManager.java b/services/mogo-service/src/main/java/com/mogo/service/impl/connection/MogoWebSocketManager.java
new file mode 100644
index 0000000000..7073fcad5e
--- /dev/null
+++ b/services/mogo-service/src/main/java/com/mogo/service/impl/connection/MogoWebSocketManager.java
@@ -0,0 +1,63 @@
+package com.mogo.service.impl.connection;
+
+import android.content.Context;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.mogo.service.connection.IMogoOnWebSocketMessageListener;
+import com.mogo.service.connection.IMogoWebSocketManager;
+import com.mogo.utils.logger.Logger;
+
+import java.lang.reflect.Method;
+
+import static com.mogo.service.MogoServicePaths.PATH_WEB_SOCKET_MANAGER;
+
+@Route(path = PATH_WEB_SOCKET_MANAGER)
+public class MogoWebSocketManager implements IMogoWebSocketManager {
+
+ private static final String TAG = "MogoWebSocketManager";
+ private IMogoWebSocketManager mDelegate;
+
+ @Override
+ public void init(Context context, String appId) {
+ if (mDelegate != null) {
+ mDelegate.init(context, appId);
+ }
+ }
+
+ @Override
+ public void registerOnWebSocketMessageListener(int msgType, IMogoOnWebSocketMessageListener listener) {
+ if (mDelegate != null) {
+ mDelegate.registerOnWebSocketMessageListener(msgType, listener);
+ }
+ }
+
+ @Override
+ public void unregisterOnWebSocketMessageListener(int msgType, IMogoOnWebSocketMessageListener listener) {
+ if (mDelegate != null) {
+ mDelegate.unregisterOnWebSocketMessageListener(msgType, listener);
+ }
+ }
+
+ @Override
+ public void sendMsg(Object body, IMogoOnWebSocketMessageListener listener) {
+ if (mDelegate != null) {
+ mDelegate.sendMsg(body, listener);
+ }
+ }
+
+ @Override
+ public void init(Context context) {
+ try {
+ Class> clazz = Class.forName("com.mogo.base.websocket.WebSocketManager");
+ Method getInstanceMethod = clazz.getMethod("getInstance", Context.class);
+ getInstanceMethod.setAccessible(true);
+ mDelegate = (IMogoWebSocketManager) getInstanceMethod.invoke(null, context);
+ } catch (Exception e) {
+ Logger.e(TAG, e, "error.");
+ }
+
+ if (mDelegate != null) {
+ mDelegate.init(context);
+ }
+ }
+}
diff --git a/settings.gradle b/settings.gradle
index 2521b83254..a72b2bd046 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,3 +1,4 @@
+include ':foudations:mogo-base-websocket-sdk'
include ':tts:tts-base'
include ':tts:tts-di'
include ':tts:tts-zhi'