add websocket

This commit is contained in:
unknown
2020-10-26 12:00:51 +08:00
parent a6e8bddbc7
commit fc263810bf
28 changed files with 626 additions and 1 deletions

View File

@@ -0,0 +1,6 @@
package com.mogo.base.websocket;
public interface IMogoWebSocketInitCallBack {
void init();
}

View File

@@ -0,0 +1,27 @@
package com.mogo.base.websocket;
import com.mogo.commons.debug.DebugConfig;
public class WebSocketConstant {
private static final String HOST_DEV = "";
private static final String HOST_QA = "";
private static final String HOST_DEMO = "";
private static final String HOST_RELEASE = "";
public static String getSocketServer(){
switch (DebugConfig.getNetMode()){
case DebugConfig.NET_MODE_DEV:
return HOST_DEV;
case DebugConfig.NET_MODE_QA:
return HOST_QA;
case DebugConfig.NET_MODE_DEMO:
return HOST_DEMO;
case DebugConfig.NET_MODE_RELEASE:
default:
return HOST_RELEASE;
}
}
}

View File

@@ -0,0 +1,36 @@
package com.mogo.base.websocket;
import java.io.Serializable;
public class WebSocketData<T> 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;
}
}

View File

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

View File

@@ -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;
}
/**
* 管理消息分发
* <p>
* key - msgType
*/
private Map<Integer, List<IMogoOnWebSocketMessageListener>> mListeners = new ConcurrentHashMap<>();
/**
* 管理消息回执
* <p>
* key - msgId
*/
private Map<Long, IMogoMsgAckListener> 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<IMogoOnWebSocketMessageListener> 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<IMogoOnWebSocketMessageListener> listeners = mListeners.get(msgType);
if (listeners != null && !listeners.isEmpty()) {
Iterator<IMogoOnWebSocketMessageListener> 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;
}
}

View File

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