Pārlūkot izejas kodu

tcp信号获取操作

allen 4 gadi atpakaļ
vecāks
revīzija
c0eb47f48d

+ 10 - 0
common/build.gradle

@@ -226,6 +226,16 @@ dependencies {
      * netty
      */
     compile 'io.netty:netty-all:4.1.42.Final'
+
+    /**
+     * json
+     */
+    compile 'com.alibaba:fastjson:1.2.23'
+
+    /**
+     * google
+     */
+    compile 'com.google.guava:guava:23.0'
 }
 
 //tasks.withType(JavaCompile) {

+ 1 - 1
common/src/main/code/com/wdkl/ncs/android/lib/tcp/TcpClient.java

@@ -1,4 +1,4 @@
-package com.wdkl.ncs.android.lib.tcp;
+package com.wdkl.ncs.android.middleware.tcp;
 
 import io.netty.bootstrap.Bootstrap;
 import io.netty.channel.*;

+ 15 - 6
common/src/main/code/com/wdkl/ncs/android/lib/tcp/TcpClientHandler.java

@@ -1,15 +1,16 @@
-package com.wdkl.ncs.android.lib.tcp;
+package com.wdkl.ncs.android.middleware.tcp;
+
+import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel;
+import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel;
 
-import io.netty.bootstrap.Bootstrap;
-import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import io.netty.channel.ChannelHandler;
 import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.ChannelInboundHandlerAdapter;
 import io.netty.channel.SimpleChannelInboundHandler;
 import io.netty.handler.timeout.IdleState;
 import io.netty.handler.timeout.IdleStateEvent;
 import io.netty.util.CharsetUtil;
+import io.netty.util.ReferenceCountUtil;
 
 import java.util.concurrent.TimeUnit;
 
@@ -45,8 +46,16 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
 
     //读取String消息
     @Override
-    protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception {
-        System.out.println("channelRead0: read callback from server ===> " + s);
+    protected void channelRead0(ChannelHandlerContext ctx, String source) throws Exception {
+        //System.out.println("channelRead0: read callback from server ===> " + source);
+        TcpModel tcpModel = TcpModel.getModelByJson(source);
+
+        TcpModel responseTcpModel = DeviceChannel.handleTcpReceived(tcpModel);
+        if (responseTcpModel!=null){
+            ctx.writeAndFlush(responseTcpModel.toJson());
+        } else {
+            ReferenceCountUtil.release(source);
+        }
     }
 
     //写心跳包。没有消息发送时,每间隔一定时间会由此方法向服务端发送心跳

+ 64 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/DeviceChannel.java

@@ -0,0 +1,64 @@
+package com.wdkl.ncs.android.middleware.tcp.channel;
+
+import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel;
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction;
+
+public class DeviceChannel {
+    //通话中模拟
+    private static boolean calling = true;
+
+    public static TcpModel handleTcpReceived(TcpModel tcpModel){
+        TcpModel responseTcpModel = null;
+
+        switch (tcpModel.getType()){
+            case VOICE:
+                if (tcpModel.getAction()==TcpAction.VoiceAction.CALL){ //语音呼入
+                    //todo: 判断当前是否通话
+                    // 通话中
+                    if (calling){
+                        responseTcpModel = VoiceUtil.voiceCalling(tcpModel.getToId(), tcpModel.getFromId());
+                        return responseTcpModel;
+                    } else {
+                        responseTcpModel = VoiceUtil.voiceSuccess(tcpModel.getToId(), tcpModel.getFromId());
+                        //todo: 通话中界面展现,data中服务器传过来呼入名称;从接口重新获取左侧数据
+                        return responseTcpModel;
+                    }
+                } else if (tcpModel.getAction()==TcpAction.VoiceAction.ACCEPT){ //我方呼出,对方接受
+                    //todo: 通话中界面更新;建立数据通话
+                } else if (tcpModel.getAction()==TcpAction.VoiceAction.REJECT){ //我方呼出,对方拒绝
+                    //todo: 清掉呼出的TcpModel,通话中界面更新 --- 显示对方拒绝并停留3秒,结束至正常界面;更新左侧
+                } else if (tcpModel.getAction()==TcpAction.VoiceAction.CALLING){ //我方呼出,对方通话中
+                    //todo: 清掉呼出的TcpModel,通话中界面更新 --- 显示对方占线并停留3秒,结束至正常界面;更新左侧
+                } else if (tcpModel.getAction()==TcpAction.VoiceAction.FAILED){ //我方呼出,对方不在线,设备离线或其它错误
+                    //todo: 清掉呼出的TcpModel,通话中界面更新 --- 显示对方离线并停留3秒,结束至正常界面;更新左侧
+                } else if (tcpModel.getAction()==TcpAction.VoiceAction.HANDOFF){ //对方挂断,不论我方呼出或呼入
+                    //todo: 清掉呼出的TcpModel,通话中界面更新 --- 显示对方已挂断并停留3秒,结束至正常界面;更新左侧
+                }
+                break;
+            case VIDEO:
+                break;
+            case IM:
+                if (tcpModel.getAction()==TcpAction.IMAction.MSG){
+                    //todo: 从接口重新获取左侧数据;使用通话中界面,显示有语音留言,停留3秒,结束至正常界面
+                }
+                break;
+            case EVENT:
+                if (tcpModel.getAction()==TcpAction.EventAction.KEY_CLICK){
+                    //todo: 服务端通过data给出具体的事件名称放置data。从接口重新获取左侧数据;使用通话中界面,显示事件名称,停留3秒,结束至正常界面
+                }
+                break;
+            case DATA:
+                if (tcpModel.getAction()==TcpAction.DataAction.REFRESH){
+                    //todo: 通过data判断刷新何种数据
+                }
+                break;
+            case DEVICE:
+                if (tcpModel.getAction()== TcpAction.DeviceAction.RESTART){
+                    //todo:重启设备
+                }
+                break;
+        }
+
+        return responseTcpModel;
+    }
+}

+ 25 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/EventUtil.java

@@ -0,0 +1,25 @@
+package com.wdkl.ncs.android.middleware.tcp.channel;
+
+import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel;
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction;
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpType;
+
+public class EventUtil {
+    public static TcpModel eventKeyClick(Integer fromId, Integer toId){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.EVENT);
+        tcpModel.setAction(TcpAction.EventAction.KEY_CLICK);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        return tcpModel;
+    }
+
+    public static TcpModel eventResponse(Integer fromId, Integer toId){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.EVENT);
+        tcpModel.setAction(TcpAction.EventAction.RESPONSE);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        return tcpModel;
+    }
+}

+ 25 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/ImUtil.java

@@ -0,0 +1,25 @@
+package com.wdkl.ncs.android.middleware.tcp.channel;
+
+import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel;
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction;
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpType;
+
+public class ImUtil {
+    public static TcpModel imMsg(Integer fromId, Integer toId){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.IM);
+        tcpModel.setAction(TcpAction.IMAction.MSG);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        return tcpModel;
+    }
+
+    public static TcpModel imRead(Integer fromId, Integer toId){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.IM);
+        tcpModel.setAction(TcpAction.IMAction.READ);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        return tcpModel;
+    }
+}

+ 70 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/VoiceUtil.java

@@ -0,0 +1,70 @@
+package com.wdkl.ncs.android.middleware.tcp.channel;
+
+import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel;
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction;
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpType;
+
+public class VoiceUtil {
+    public static TcpModel voiceCall(Integer fromId, Integer toId){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.VOICE);
+        tcpModel.setAction(TcpAction.VoiceAction.CALL);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        return tcpModel;
+    }
+
+    public static TcpModel voiceAccept(Integer fromId, Integer toId){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.VOICE);
+        tcpModel.setAction(TcpAction.VoiceAction.ACCEPT);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        return tcpModel;
+    }
+
+    public static TcpModel voiceReject(Integer fromId, Integer toId){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.VOICE);
+        tcpModel.setAction(TcpAction.VoiceAction.REJECT);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        return tcpModel;
+    }
+
+    public static TcpModel voiceCalling(Integer fromId, Integer toId){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.VOICE);
+        tcpModel.setAction(TcpAction.VoiceAction.CALLING);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        return tcpModel;
+    }
+
+    public static TcpModel voiceCancel(Integer fromId, Integer toId){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.VOICE);
+        tcpModel.setAction(TcpAction.VoiceAction.CANCEL);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        return tcpModel;
+    }
+
+    public static TcpModel voiceHandoff(Integer fromId, Integer toId){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.VOICE);
+        tcpModel.setAction(TcpAction.VoiceAction.HANDOFF);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        return tcpModel;
+    }
+
+    public static TcpModel voiceSuccess(Integer fromId, Integer toId){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.VOICE);
+        tcpModel.setAction(TcpAction.VoiceAction.SUCCESS);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        return tcpModel;
+    }
+}

+ 192 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/dto/TcpModel.java

@@ -0,0 +1,192 @@
+package com.wdkl.ncs.android.middleware.tcp.dto;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.base.Strings;
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction;
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpType;
+import com.wdkl.ncs.android.middleware.model.dos.DeviceDO;
+import com.wdkl.ncs.android.middleware.model.dos.FrameDO;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * tcp传输对象
+ *
+ * @author allen
+ * 2021-03-30 11:49
+ */
+public class TcpModel implements Serializable {
+    /**
+     * TCP传输对象的类型
+     */
+    private TcpType type;
+    /**
+     * TCP传输对象类型的动作
+     */
+    private TcpAction action;
+
+    /**
+     * 来源设备id
+     */
+    private Integer fromId;
+    /**
+     * 目标设备id,呼叫分机或其它设备时需要。分机呼叫不需要
+     */
+    private Integer toId;
+
+    /**
+     * TCP传输对象的数据
+     */
+    private Object data;
+
+    public TcpType getType() {
+        return type;
+    }
+
+    public void setType(TcpType type) {
+        this.type = type;
+    }
+
+    public TcpAction getAction() {
+        return action;
+    }
+
+    public void setAction(TcpAction action) {
+        this.action = action;
+    }
+
+    public Integer getFromId() {
+        return fromId;
+    }
+
+    public void setFromId(Integer fromId) {
+        this.fromId = fromId;
+    }
+
+    public Integer getToId() {
+        return toId;
+    }
+
+    public void setToId(Integer toId) {
+        this.toId = toId;
+    }
+
+    public Object getData() {
+        return data;
+    }
+
+    public void setData(Object data) {
+        this.data = data;
+    }
+
+    public String toJson(){
+        return JSON.toJSONString(this);
+    }
+
+    public static TcpModel getModelByJson(String tcpModelJsonString){
+        if (Strings.isNullOrEmpty(tcpModelJsonString)){
+            return null;
+        }
+        TcpModel tcpModel = new TcpModel();
+
+        JSONObject jsonObject = JSON.parseObject(tcpModelJsonString);
+        String type = jsonObject.getString("type");
+        String action = jsonObject.getString("action");
+        Integer fromId = jsonObject.getInteger("from_id");
+        Integer toId = jsonObject.getInteger("to_id");
+        String dataString = jsonObject.getString("data");
+
+        TcpType tcpType = TcpType.fromString(type);
+        TcpAction tcpAction = null;
+        switch (tcpType){
+            case CALLBACK:
+                tcpAction = TcpAction.CallbackAction.fromString(action);
+                break;
+            case VOICE:
+                tcpAction = TcpAction.VoiceAction.fromString(action);
+                break;
+            case VIDEO:
+                tcpAction = TcpAction.VedioAction.fromString(action);
+                break;
+            case BROADCAST:
+                tcpAction = TcpAction.BroadcastAction.fromString(action);
+                break;
+            case DATA:
+                tcpAction = TcpAction.DataAction.fromString(action);
+                break;
+            case DEVICE:
+                tcpAction = TcpAction.DeviceAction.fromString(action);
+                break;
+            case TIME:
+                tcpAction = TcpAction.TimeAction.fromString(action);
+                break;
+            case EVENT:
+                tcpAction = TcpAction.EventAction.fromString(action);
+                break;
+        }
+
+        tcpModel.setType(tcpType);
+        tcpModel.setAction(tcpAction);
+        tcpModel.setToId(toId);
+        tcpModel.setFromId(fromId);
+        tcpModel.setData(dataString);
+
+        return tcpModel;
+    }
+
+    public static String callbackSuccess(){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.CALLBACK);
+        tcpModel.setAction(TcpAction.CallbackAction.SUCCESS);
+        return tcpModel.toJson();
+    }
+
+    public static String callbackFailed(){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.CALLBACK);
+        tcpModel.setAction(TcpAction.CallbackAction.FAILED);
+        return tcpModel.toJson();
+    }
+
+    /**
+     * 示例
+     * @param args
+     */
+    public static void main(String[] args) {
+        //创建对象示例
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.type = TcpType.VOICE;
+        tcpModel.action = TcpAction.VoiceAction.CALL;
+
+        Map map = new HashMap();
+
+        DeviceDO deviceDO = new DeviceDO();
+        deviceDO.setCode("123");
+        deviceDO.setEthMac("abcd");
+        map.put("device",deviceDO);
+
+        FrameDO frameDO = new FrameDO();
+        frameDO.setName("ok");
+        map.put("frame",frameDO);
+
+        tcpModel.setData(map);
+
+        System.out.println("enum show === " + tcpModel.action.getDescription() + " -- " + tcpModel.action.getName());
+
+        //要传输的json字符串
+        String jsonStr = tcpModel.toJson();
+        System.out.println("json show === " + jsonStr);
+
+        //获利传输的JSON字符串,转换为对象
+        TcpModel dTcpModel = TcpModel.getModelByJson(jsonStr);
+        //数据反转
+        String dataString = dTcpModel.getData().toString();
+        JSONObject dataJSON = JSON.parseObject(dataString);
+        DeviceDO dDeviceDO = JSON.parseObject(dataJSON.getString("device"),DeviceDO.class);
+
+        System.out.println("json de show === " + dTcpModel.action + " -- " + dDeviceDO.getEthMac());
+    }
+}

+ 271 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/enums/TcpAction.java

@@ -0,0 +1,271 @@
+package com.wdkl.ncs.android.middleware.tcp.enums;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * TCP传输类型的动作
+ *
+ * @author allen
+ * 2021-03-30 15:30
+ */
+public interface TcpAction {
+    String getName();
+    String getDescription();
+
+    enum CallbackAction implements TcpAction {
+        SUCCESS("同步"),
+        FAILED("失败");
+        private String description;
+        CallbackAction(String description){
+            this.description = description;
+        }
+        public String getDescription() {
+            return description;
+        }
+
+        public String getName(){
+            return this.name();
+        }
+
+        private final static Map<String , CallbackAction> ENUM_MAP = new HashMap<String, CallbackAction>();
+        static {
+            for(CallbackAction v : values()) {
+                ENUM_MAP.put(v.toString() , v);
+            }
+        }
+        public static CallbackAction fromString(String v) {
+            CallbackAction userOptionEnum = ENUM_MAP.get(v);
+            return userOptionEnum == null ? SUCCESS :userOptionEnum;
+        }
+    }
+
+    enum VoiceAction implements TcpAction {
+        CALL("呼叫"),
+        ACCEPT("接受呼叫"),
+        REJECT("拒绝"),
+        CALLING("通话中"),
+        CANCEL("取消"),
+        TRANSFER("转接"),
+        HANDOFF("挂断"),
+        SUCCESS("呼叫成功"),
+        FAILED("呼叫失败"),
+        MSG_READ("语音留言已读"),
+        MSG("语音留言");
+
+        private String description;
+        VoiceAction(String description){
+            this.description = description;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+
+        public String getName(){
+            return this.name();
+        }
+
+        private final static Map<String , VoiceAction> ENUM_MAP = new HashMap<String, VoiceAction>();
+        static {
+            for(VoiceAction v : values()) {
+                ENUM_MAP.put(v.toString() , v);
+            }
+        }
+        public static VoiceAction fromString(String v) {
+            VoiceAction userOptionEnum = ENUM_MAP.get(v);
+            return userOptionEnum == null ? CALL :userOptionEnum;
+        }
+    }
+
+    enum VedioAction implements TcpAction {
+        CALL("呼叫"),
+        CANCEL("取消");
+
+        private String description;
+        VedioAction(String description){
+            this.description = description;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+
+        public String getName(){
+            return this.name();
+        }
+
+        private final static Map<String , VedioAction> ENUM_MAP = new HashMap<String, VedioAction>();
+        static {
+            for(VedioAction v : values()) {
+                ENUM_MAP.put(v.toString() , v);
+            }
+        }
+        public static VedioAction fromString(String v) {
+            VedioAction userOptionEnum = ENUM_MAP.get(v);
+            return userOptionEnum == null ? CALL :userOptionEnum;
+        }
+    }
+
+    enum IMAction implements TcpAction {
+        MSG("留言"),
+        RECEIVE("接收"),
+        READ("已读");
+
+        private String description;
+        IMAction(String description){
+            this.description = description;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+
+        public String getName(){
+            return this.name();
+        }
+
+        private final static Map<String , IMAction> ENUM_MAP = new HashMap<String, IMAction>();
+        static {
+            for(IMAction v : values()) {
+                ENUM_MAP.put(v.toString() , v);
+            }
+        }
+        public static IMAction fromString(String v) {
+            IMAction userOptionEnum = ENUM_MAP.get(v);
+            return userOptionEnum == null ? RECEIVE :userOptionEnum;
+        }
+
+    }
+
+    enum DeviceAction implements TcpAction {
+        RESTART("重启");
+        private String description;
+        DeviceAction(String description){
+            this.description = description;
+        }
+        public String getDescription() {
+            return description;
+        }
+
+        public String getName(){
+            return this.name();
+        }
+
+        private final static Map<String , DeviceAction> ENUM_MAP = new HashMap<String, DeviceAction>();
+        static {
+            for(DeviceAction v : values()) {
+                ENUM_MAP.put(v.toString() , v);
+            }
+        }
+        public static DeviceAction fromString(String v) {
+            DeviceAction userOptionEnum = ENUM_MAP.get(v);
+            return userOptionEnum == null ? RESTART :userOptionEnum;
+        }
+    }
+
+    enum EventAction implements TcpAction {
+        KEY_CLICK("按键事件"),
+        RESPONSE("已响应");
+        private String description;
+        EventAction(String description){
+            this.description = description;
+        }
+        public String getDescription() {
+            return description;
+        }
+
+        public String getName(){
+            return this.name();
+        }
+
+        private final static Map<String , EventAction> ENUM_MAP = new HashMap<String, EventAction>();
+        static {
+            for(EventAction v : values()) {
+                ENUM_MAP.put(v.toString() , v);
+            }
+        }
+        public static EventAction fromString(String v) {
+            EventAction userOptionEnum = ENUM_MAP.get(v);
+            return userOptionEnum == null ? KEY_CLICK :userOptionEnum;
+        }
+    }
+
+    enum DataAction implements TcpAction {
+        REFRESH("刷新数据");
+        private String description;
+        DataAction(String description){
+            this.description = description;
+        }
+        public String getDescription() {
+            return description;
+        }
+
+        public String getName(){
+            return this.name();
+        }
+
+        private final static Map<String , DataAction> ENUM_MAP = new HashMap<String, DataAction>();
+        static {
+            for(DataAction v : values()) {
+                ENUM_MAP.put(v.toString() , v);
+            }
+        }
+        public static DataAction fromString(String v) {
+            DataAction userOptionEnum = ENUM_MAP.get(v);
+            return userOptionEnum == null ? REFRESH :userOptionEnum;
+        }
+    }
+
+    enum BroadcastAction implements TcpAction {
+        START("开始");
+        private String description;
+        BroadcastAction(String description){
+            this.description = description;
+        }
+        public String getDescription() {
+            return description;
+        }
+
+        public String getName(){
+            return this.name();
+        }
+
+        private final static Map<String , BroadcastAction> ENUM_MAP = new HashMap<String, BroadcastAction>();
+        static {
+            for(BroadcastAction v : values()) {
+                ENUM_MAP.put(v.toString() , v);
+            }
+        }
+        public static BroadcastAction fromString(String v) {
+            BroadcastAction userOptionEnum = ENUM_MAP.get(v);
+            return userOptionEnum == null ? START :userOptionEnum;
+        }
+    }
+
+    enum TimeAction implements TcpAction {
+        SYNC("同步");
+        private String description;
+        TimeAction(String description){
+            this.description = description;
+        }
+        public String getDescription() {
+            return description;
+        }
+
+        public String getName(){
+            return this.name();
+        }
+
+        private final static Map<String , TimeAction> ENUM_MAP = new HashMap<String, TimeAction>();
+        static {
+            for(TimeAction v : values()) {
+                ENUM_MAP.put(v.toString() , v);
+            }
+        }
+        public static TimeAction fromString(String v) {
+            TimeAction userOptionEnum = ENUM_MAP.get(v);
+            return userOptionEnum == null ? SYNC :userOptionEnum;
+        }
+    }
+}

+ 38 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/enums/TcpType.java

@@ -0,0 +1,38 @@
+package com.wdkl.ncs.android.middleware.tcp.enums;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * TCP传输对象的类型
+ */
+public enum TcpType {
+    CALLBACK("TCP反馈"),
+    VOICE("语音"),
+    VIDEO("视频"),
+    IM("留言"),
+    DEVICE("设备"),
+    DATA("数据"),
+    EVENT("事件"),
+    BROADCAST("广播"),
+    TIME("时间");
+
+    private String description;
+    TcpType(String description){
+        this.description = description;
+    }
+    public String getDescription() {
+        return description;
+    }
+
+    private final static Map<String , TcpType> ENUM_MAP = new HashMap<String, TcpType>();
+    static {
+        for(TcpType v : values()) {
+            ENUM_MAP.put(v.toString() , v);
+        }
+    }
+    public static TcpType fromString(String v) {
+        TcpType userOptionEnum = ENUM_MAP.get(v);
+        return userOptionEnum == null ? CALLBACK :userOptionEnum;
+    }
+}