package hillfly.wifichat.model; import hillfly.wifichat.consts.IPMSGConst; import hillfly.wifichat.util.JsonUtils; import hillfly.wifichat.util.Logger; import java.util.Date; import org.json.JSONException; import org.json.JSONObject; import com.alibaba.fastjson.annotation.JSONField; /** * IPMSG协议抽象类 * <p> * 数据包编号:一般是取毫秒数。用来唯一地区别每个数据包; * <p> * SenderIMEI:指的是发送者的设备IMEI * <p> * 命令:指的是飞鸽协议中定义的一系列命令,具体见下文; * <p> * 附加数据:额外发送的数据 * * @see IPMSGConst * */ public class IPMSGProtocol { private static final Logger logger = Logger.getLogger(IPMSGProtocol.class); private static final String PACKETNO = "packetNo"; private static final String COMMANDNO = "commandNo"; private static final String ADDOBJECT = "addObject"; private static final String ADDSTR = "addStr"; private static final String ADDTYPE = "addType"; private String packetNo;// 数据包编号 private String senderIMEI; // 发送者IMEI private int commandNo; // 命令 private ADDITION_TYPE addType; // 附加数据类型 private Entity addObject; // 附加对象 private String addStr; // 附加信息 public IPMSGProtocol() { this.packetNo = getSeconds(); } public enum ADDITION_TYPE { USER, MSG, STRING } // 根据协议字符串初始化 public IPMSGProtocol(String paramProtocolJSON) { try { JSONObject protocolJSON = new JSONObject(paramProtocolJSON); packetNo = protocolJSON.getString(PACKETNO); commandNo = protocolJSON.getInt(COMMANDNO); senderIMEI = protocolJSON.getString(Users.IMEI); if (protocolJSON.has(ADDTYPE)) { // 若有附加信息 String addJSONStr = null; if (protocolJSON.has(ADDOBJECT)) { // 若为Entity类型 addJSONStr = protocolJSON.getString(ADDOBJECT); } else if (protocolJSON.has(ADDSTR)) { // 若为String类型 addJSONStr = protocolJSON.getString(ADDSTR); } switch (ADDITION_TYPE.valueOf(protocolJSON.getString(ADDTYPE))) { case USER: // 为用户数据 addObject = JsonUtils.getObject(addJSONStr, Users.class); break; case MSG: // 为消息数据 addObject = JsonUtils.getObject(addJSONStr, Message.class); break; case STRING: // 为String数据 addStr = addJSONStr; break; default: break; } } } catch (JSONException e) { e.printStackTrace(); logger.e("非标准JSON文本"); } } public IPMSGProtocol(String paramSenderIMEI, int paramCommandNo, Entity paramObject) { super(); this.packetNo = getSeconds(); this.senderIMEI = paramSenderIMEI; this.commandNo = paramCommandNo; this.addObject = paramObject; if (paramObject instanceof Message) { // 若为Message对象 this.addType = ADDITION_TYPE.MSG; } else if (paramObject instanceof Users) { // 若为NearByPeople对象 this.addType = ADDITION_TYPE.USER; } } public IPMSGProtocol(String paramSenderIMEI, int paramCommandNo, String paramStr) { super(); this.packetNo = getSeconds(); this.senderIMEI = paramSenderIMEI; this.commandNo = paramCommandNo; this.addStr = paramStr; this.addType = ADDITION_TYPE.STRING; } public IPMSGProtocol(String paramSenderIMEI, int paramCommandNo) { super(); this.packetNo = getSeconds(); this.senderIMEI = paramSenderIMEI; this.commandNo = paramCommandNo; } @JSONField(name = PACKETNO) public String getPacketNo() { return this.packetNo; } public void setPacketNo(String paramPacketNo) { this.packetNo = paramPacketNo; } @JSONField(name = Users.IMEI) public String getSenderIMEI() { return this.senderIMEI; } public void setSenderIMEI(String paramSenderIMEI) { this.senderIMEI = paramSenderIMEI; } @JSONField(name = ADDTYPE) public ADDITION_TYPE getAddType() { return this.addType; } public void setAddType(ADDITION_TYPE paramType) { this.addType = paramType; } @JSONField(name = COMMANDNO) public int getCommandNo() { return this.commandNo; } public void setCommandNo(int paramCommandNo) { this.commandNo = paramCommandNo; } @JSONField(name = ADDOBJECT) public Entity getAddObject() { return this.addObject; } public void setAddObject(Entity paramObject) { this.addObject = paramObject; } @JSONField(name = ADDSTR) public String getAddStr() { return this.addStr; } public void setAddStr(String paramStr) { this.addStr = paramStr; } // 输出协议JSON串 @JSONField(serialize = false) public String getProtocolJSON() { return JsonUtils.createJsonString(this); } // 得到数据包编号,毫秒数 @JSONField(serialize = false) private String getSeconds() { Date nowDate = new Date(); return Long.toString(nowDate.getTime()); } }