From ee16db5e1cbc1c27bdbc1984567b5e61a3d005dd Mon Sep 17 00:00:00 2001
From: lizhanwei <Dana_Lee1016@126.com>
Date: 星期一, 17 二月 2020 23:36:27 +0800
Subject: [PATCH] 提交协议库
---
im_lib/src/main/java/com/safeluck/aykj/decoder/BinMessageCoder.java | 30
im_lib/src/main/java/com/safeluck/aykj/decoder/BCDCoder.java | 18
im_lib/src/main/java/com/safeluck/aykj/annotation/Length.java | 34 +
im_lib/src/main/java/com/safeluck/aykj/decoder/BaseDecoder.java | 23
im_lib/src/main/java/com/safeluck/aykj/message/ParseException.java | 15
im_lib/src/main/java/com/safeluck/aykj/decoder/DefaultHexCoder.java | 18
app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/JWD.java | 19
im_lib/src/main/java/com/safeluck/aykj/decoder/BcdDateTimeCoder.java | 26
im_lib/src/main/java/com/anyun/im_lib/netty/NettyTcpClient.java | 18
im_lib/src/main/java/com/safeluck/aykj/annotation/BcdDateTime.java | 16
im_lib/src/main/java/com/safeluck/aykj/decoder/Int16LECoder.java | 42 +
im_lib/src/main/java/com/safeluck/aykj/decoder/GBKStringDecoder.java | 63 +
app/src/main/java/safeluck/drive/evaluation/platformMessage/utils/MessageManager.java | 63 +
im_lib/src/main/java/com/safeluck/aykj/annotation/BcdDate.java | 16
im_lib/src/main/java/com/safeluck/aykj/decoder/Int16Coder.java | 29
im_lib/src/main/java/com/safeluck/aykj/decoder/UTF8StringDecoder.java | 37 +
im_lib/src/main/java/com/safeluck/aykj/decoder/Int32LECoder.java | 39 +
im_lib/src/main/java/com/safeluck/aykj/decoder/BcdDateCoder.java | 28
im_lib/src/main/java/com/safeluck/aykj/annotation/Int16LE.java | 18
im_lib/src/main/java/com/safeluck/aykj/decoder/BitStateCoder.java | 45 +
im_lib/src/main/java/com/safeluck/aykj/annotation/Int32LE.java | 17
app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/Param0104.java | 14
app/src/main/java/safeluck/drive/evaluation/platformMessage/JKRegisterMessage.java | 31
app/src/main/java/safeluck/drive/evaluation/fragment/TcpFragment.java | 62 +
app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/JWDCoder.java | 29
im_lib/src/main/java/com/safeluck/aykj/decoder/BytesCoder.java | 19
app/src/main/java/safeluck/drive/evaluation/platformMessage/ServerCommonRsp.java | 8
im_lib/src/main/java/com/safeluck/aykj/annotation/Int16.java | 20
im_lib/src/main/java/com/safeluck/aykj/annotation/Int32.java | 20
im_lib/src/main/java/com/safeluck/aykj/annotation/Message.java | 15
im_lib/src/main/java/com/safeluck/aykj/annotation/BitState.java | 15
app/src/main/java/safeluck/drive/evaluation/im/MessageProcessor.java | 10
im_lib/src/main/java/com/safeluck/aykj/annotation/UTF8.java | 14
app/src/main/java/safeluck/drive/evaluation/platformMessage/JKClientCommonMessage.java | 26
app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/PhoneCoder.java | 29
app/src/main/java/safeluck/drive/evaluation/platformMessage/utils/MessageEscaper.java | 85 ++
im_lib/src/main/java/com/safeluck/aykj/decoder/Int32Coder.java | 33
app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/Phone.java | 19
im_lib/src/main/java/com/safeluck/aykj/annotation/GBK.java | 15
im_lib/src/main/java/com/safeluck/aykj/utils/BitState.java | 56 +
im_lib/src/main/java/com/safeluck/aykj/decoder/ByteCoder.java | 24
im_lib/src/main/java/com/safeluck/aykj/annotation/AnnotationRegister.java | 58 +
im_lib/src/main/java/com/safeluck/aykj/annotation/Bytes.java | 14
im_lib/src/main/java/com/safeluck/aykj/annotation/Order.java | 15
im_lib/src/main/java/com/safeluck/aykj/annotation/Ascii.java | 14
app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/Param8103.java | 14
app/src/main/java/safeluck/drive/evaluation/platformMessage/JK2019MessageBase.java | 167 ++++
im_lib/src/main/java/com/safeluck/aykj/utils/ArrayUtils.java | 15
im_lib/src/main/java/com/safeluck/aykj/annotation/Int8.java | 16
im_lib/src/main/java/com/safeluck/aykj/annotation/Hex.java | 14
im_lib/src/main/java/com/safeluck/aykj/decoder/IMessageCoder.java | 13
im_lib/src/main/java/com/safeluck/aykj/message/BinMessageBase.java | 397 +++++++++++
im_lib/src/main/java/com/safeluck/aykj/annotation/FromEnd.java | 17
im_lib/src/main/java/com/safeluck/aykj/utils/BytesUtils.java | 110 +++
54 files changed, 2,006 insertions(+), 16 deletions(-)
diff --git a/app/src/main/java/safeluck/drive/evaluation/fragment/TcpFragment.java b/app/src/main/java/safeluck/drive/evaluation/fragment/TcpFragment.java
index 9eecc59..03fb5f8 100644
--- a/app/src/main/java/safeluck/drive/evaluation/fragment/TcpFragment.java
+++ b/app/src/main/java/safeluck/drive/evaluation/fragment/TcpFragment.java
@@ -16,12 +16,18 @@
import androidx.lifecycle.Observer;
import com.anyun.exam.lib.util.Speaker;
+import com.anyun.im_lib.util.ByteUtil;
import com.google.android.material.textfield.TextInputEditText;
+import com.safeluck.aykj.utils.BytesUtils;
import me.yokeyword.fragmentation.SupportFragment;
import safeluck.drive.evaluation.DB.criterias.CriteriaForI;
import safeluck.drive.evaluation.DB.criterias.viewmodel.CriteriaIViewModel;
import safeluck.drive.evaluation.R;
+import safeluck.drive.evaluation.im.MessageProcessor;
+import safeluck.drive.evaluation.platformMessage.GainStuMessage;
+import safeluck.drive.evaluation.platformMessage.JKClientCommonMessage;
+import safeluck.drive.evaluation.platformMessage.JKRegisterMessage;
import safeluck.drive.evaluation.platformMessage.RegisterMessage;
import safeluck.drive.evaluation.im.IMSClientBootstrap;
@@ -103,8 +109,9 @@
String userId = "100002";
String token = "token_" + userId;
- String hosts = "[{\"host\":\"47.93.80.84\", \"port\":12125}]";
-// String hosts = "[{\"host\":\"192.168.31.77\", \"port\":12125}]";
+// String hosts = "[{\"host\":\"47.93.80.84\", \"port\":12125}]";
+// String hosts = "[{\"host\":\"47.93.157.103\", \"port\":2020}]";
+ String hosts = "[{\"host\":\"192.168.31.77\", \"port\":12125}]";
IMSClientBootstrap.getInstance().init(userId,token,hosts,1);
break;
@@ -122,12 +129,51 @@
//娓呴櫎app_status 琛�
// OneTimeWorkRequest oneTimeWorkRequest = new OneTimeWorkRequest.Builder(AppStatusInitWork.class).build();
// WorkManager.getInstance(_mActivity).enqueue(oneTimeWorkRequest);
- RegisterMessage registerMessage = new RegisterMessage((short)0x802);
- registerMessage.setCityid((short) 1);
- registerMessage.setProviceId((short)23);
- registerMessage.setImei("460123874561");
- registerMessage.setModel("123");
- registerMessage.setSn("2019101500000001");
+// RegisterMessage registerMessage = new RegisterMessage((short)0x802);
+// registerMessage.setCityid((short) 1);
+// registerMessage.setProviceId((short)23);
+// registerMessage.setImei("460123874561");
+// registerMessage.setModel("123");
+// registerMessage.setSn("2019101500000001");
+
+
+// GainStuMessage gainStuMessage = new GainStuMessage((short) 0x201);
+// gainStuMessage.setId("123456789");
+// gainStuMessage.setExamaCourse((short) 0);
+// MessageProcessor.getInstance().sendMessage(gainStuMessage.toBytes());
+
+ ByteUtil.str2Bcd("13021245");
+ String strbcd=ByteUtil.bcd2Str(ByteUtil.str2Bcd("13021245"));
+ Log.i(TAG, "onClick: strbcd="+strbcd);
+
+ JKRegisterMessage jkRegisterMessage = new JKRegisterMessage();
+ jkRegisterMessage.setMessageLen(55);
+// jkRegisterMessage.phone = "13021245";
+ jkRegisterMessage.phone = "0008618513021245";
+ jkRegisterMessage.proviceid = 23;
+ jkRegisterMessage.messageId = 0x100;
+ jkRegisterMessage.protocalVer = 235;
+ jkRegisterMessage.cityid = 1;
+ jkRegisterMessage.imei = "460123874561";
+ jkRegisterMessage.model = "123";
+ jkRegisterMessage.sn = "0314200100000004";
+
+ Log.i(TAG, "onClick: msg len "+jkRegisterMessage.getMessageLen()+" "+ jkRegisterMessage.props.value);
+ byte[] str = jkRegisterMessage.toBytes();
+ MessageProcessor.getInstance().sendMessage(str);
+ Log.i(TAG, "onClick: "+ BytesUtils.bytesToHexString(str)+" ============");
+
+ JKClientCommonMessage jkClientCommonMessage =new JKClientCommonMessage();
+ jkClientCommonMessage.setMessageLen(5);
+ jkClientCommonMessage.messageId = 0x8100;
+ jkClientCommonMessage.protocalVer = 235;
+// jkClientCommonMessage.phone = "13021245";
+ jkClientCommonMessage.respMessageId = "8001";
+ jkClientCommonMessage.respNo = 15;
+ jkClientCommonMessage.result =1;
+ String str1 = jkClientCommonMessage.toString();
+
+ Log.i(TAG, "onClick1: "+ str1+" ============");
break;
}
}
diff --git a/app/src/main/java/safeluck/drive/evaluation/im/MessageProcessor.java b/app/src/main/java/safeluck/drive/evaluation/im/MessageProcessor.java
index a38cf10..73a3a7f 100644
--- a/app/src/main/java/safeluck/drive/evaluation/im/MessageProcessor.java
+++ b/app/src/main/java/safeluck/drive/evaluation/im/MessageProcessor.java
@@ -2,9 +2,12 @@
import android.util.Log;
+import com.anyun.exam.lib.MyLog;
import com.anyun.im_lib.util.ByteUtil;
+import safeluck.drive.evaluation.platformMessage.PlatFormConstant;
import safeluck.drive.evaluation.platformMessage.RegisterResp;
+import safeluck.drive.evaluation.platformMessage.ServerCommonRsp;
import safeluck.drive.evaluation.util.CThreadPoolExecutor;
import safeluck.drive.evaluation.util.Utils;
@@ -49,6 +52,13 @@
case (short) 0x8100:
RegisterResp registerResp = new RegisterResp(datas);
break;
+ case (short) 0x8001://鏈嶅姟鍣ㄧ 閫氱敤搴旂瓟
+ ServerCommonRsp serverCommonRsp = new ServerCommonRsp(datas);
+ if (serverCommonRsp.getResult() == PlatFormConstant.SUCCESS){
+ MyLog.i(PlatFormConstant.TAG,"纭"+serverCommonRsp.getMsgId()+"娑堟伅鎴愬姛");
+ }
+ break;
+
}
}
diff --git a/app/src/main/java/safeluck/drive/evaluation/platformMessage/JK2019MessageBase.java b/app/src/main/java/safeluck/drive/evaluation/platformMessage/JK2019MessageBase.java
new file mode 100644
index 0000000..e10896b
--- /dev/null
+++ b/app/src/main/java/safeluck/drive/evaluation/platformMessage/JK2019MessageBase.java
@@ -0,0 +1,167 @@
+package safeluck.drive.evaluation.platformMessage;
+
+
+import android.util.Log;
+
+import com.safeluck.aykj.annotation.AnnotationRegister;
+import com.safeluck.aykj.annotation.Int16;
+import com.safeluck.aykj.annotation.Int8;
+import com.safeluck.aykj.annotation.Length;
+import com.safeluck.aykj.annotation.Order;
+import com.safeluck.aykj.decoder.BitStateCoder;
+import com.safeluck.aykj.decoder.Int16Coder;
+import com.safeluck.aykj.message.BinMessageBase;
+import com.safeluck.aykj.utils.BitState;
+import com.safeluck.aykj.utils.BytesUtils;
+
+import safeluck.drive.evaluation.platformMessage.decoder.JWD;
+import safeluck.drive.evaluation.platformMessage.decoder.JWDCoder;
+import safeluck.drive.evaluation.platformMessage.decoder.Phone;
+import safeluck.drive.evaluation.platformMessage.decoder.PhoneCoder;
+
+public class JK2019MessageBase extends BinMessageBase {
+ static {
+ AnnotationRegister.register(JWD.class, new JWDCoder());
+ AnnotationRegister.register(Phone.class, new PhoneCoder());
+
+ }
+ static Int16Coder coder = new Int16Coder();
+ public JK2019MessageBase()
+ {
+ this.messageNo = getMessageNo();
+ String message_name = this.getClass().getSimpleName();
+ if(message_name.startsWith("JTMessage"))
+ {
+ String message_id = message_name.substring(9,13);
+ if(message_id.equals("Unkn") ){
+ return;
+ }
+ this.messageId= coder.decode(message_id);
+ }
+ this.setMultiPacket(false);
+ this.registerDisableField("totalPacket");
+ this.registerDisableField("packetNo");
+ }
+
+
+ @Override
+ public void parse(String hex){
+
+ BitStateCoder coder = new BitStateCoder();
+ this.props = coder.decode(hex.substring(8,12));
+ if(this.isMultiPacket())
+ {
+ this.removeDisableField("totalPacket");
+ this.removeDisableField("packetNo");
+ }
+ super.parse(hex);
+ }
+
+ @Override
+ public String toString()
+ {
+ if(!this.isMultiPacket())
+ {
+ this.registerDisableField("totalPacket");
+ this.registerDisableField("packetNo");
+ }
+ //璁$畻娑堟伅浣撻暱搴�
+ String hex = super.toString();
+ Log.i(PlatFormConstant.TAG, "toString: 娑堟伅浣撻暱搴︼細"+hex);
+ int message_head_len = 19;
+ if(this.isMultiPacket())
+ {
+ message_head_len+=4;
+ }
+// int len1 = this.getMessageLen();
+ int len2 = hex.length()/2-message_head_len;
+ this.setMessageLen(len2);
+ //璁$畻鏍¢獙
+ hex = super.toString();
+ byte[] bytes = BytesUtils.hexStringToBytes(hex);
+ bytes[bytes.length - 2] = BytesUtils.xor(bytes,1,bytes.length -2);
+
+
+ return BytesUtils.bytesToHexString(bytes);
+ }
+ @Order(1)
+ @Int8
+ public int head=0x7E;
+ @Order(2)
+ @Int8
+ public int protocalVer=0x80;
+ @Order(3)
+ @Int16
+ public int messageId;
+ @Order(4)
+ @Length(2)
+ @com.safeluck.aykj.annotation.BitState
+ public BitState props = new BitState((byte) 0);
+ @Order(5)
+ @Phone
+ public String phone;
+ @Order(6)
+ @Int16
+ public int messageNo;
+ @Order(7)
+ @Int8
+ public int reserved = 0;
+ @Order(8)
+ @Int16
+ public int totalPacket;
+ @Order(9)
+ @Int16
+ public int packetNo;
+
+
+ @Order(Integer.MAX_VALUE-10001)
+ @Int8
+ public int checksum;
+ @Order(Integer.MAX_VALUE-10000)
+ @Int8
+ public int end=0x7E;
+
+ /**
+ * 鏄惁娑堟伅缁忚繃鍒嗗寘澶勭悊
+ * @param b
+ */
+ public void setMultiPacket(boolean b)
+ {
+ this.props.set(13,b);
+ }
+ public boolean isMultiPacket()
+ {
+ return this.props.get(13);
+ }
+
+ /**
+ * 鑾峰彇灞炴�т腑鐨勬秷鎭綋闀垮害
+ * @return
+ */
+ public int getMessageLen()
+ {
+ BitState state = new BitState((short)this.props.value);
+ for (int i = 0; i < 10; i++)
+ {
+ state.set(10 + i, false);
+ }
+ return (int) state.value;
+ }
+
+ /**
+ * 璁剧疆灞炴�т腑鐨勬秷鎭綋闀垮害
+ * @param len
+ */
+ public void setMessageLen(int len)
+ {
+ BitState state = new BitState((short)len);
+
+ for (int i = 0; i < 10; i++)
+ {
+ this.props.set(i, state.get(i));
+ }
+ }
+
+
+
+}
diff --git a/app/src/main/java/safeluck/drive/evaluation/platformMessage/JKClientCommonMessage.java b/app/src/main/java/safeluck/drive/evaluation/platformMessage/JKClientCommonMessage.java
new file mode 100644
index 0000000..007b2fc
--- /dev/null
+++ b/app/src/main/java/safeluck/drive/evaluation/platformMessage/JKClientCommonMessage.java
@@ -0,0 +1,26 @@
+package safeluck.drive.evaluation.platformMessage;
+
+import com.safeluck.aykj.annotation.Hex;
+import com.safeluck.aykj.annotation.Int16;
+import com.safeluck.aykj.annotation.Int8;
+import com.safeluck.aykj.annotation.Length;
+import com.safeluck.aykj.annotation.Order;
+
+public class JKClientCommonMessage extends JK2019MessageBase {
+
+ public static int SUCCESS=0;
+ public static int FAIL=1;
+ public static int ERROR_MSG=2;
+ public static int NOT_SUPPORT=3;
+
+ @Order(1)
+ @Int16
+ public int respNo;
+ @Order(2)
+ @Length(2)
+ @Hex
+ public String respMessageId;
+ @Order(3)
+ @Int8
+ public int result;
+}
diff --git a/app/src/main/java/safeluck/drive/evaluation/platformMessage/JKRegisterMessage.java b/app/src/main/java/safeluck/drive/evaluation/platformMessage/JKRegisterMessage.java
new file mode 100644
index 0000000..28684cb
--- /dev/null
+++ b/app/src/main/java/safeluck/drive/evaluation/platformMessage/JKRegisterMessage.java
@@ -0,0 +1,31 @@
+package safeluck.drive.evaluation.platformMessage;
+
+
+import com.safeluck.aykj.annotation.Ascii;
+import com.safeluck.aykj.annotation.Int16;
+import com.safeluck.aykj.annotation.Length;
+import com.safeluck.aykj.annotation.Order;
+
+public class JKRegisterMessage extends JK2019MessageBase {
+
+ @Order(1)
+ @Int16
+ public int proviceid;
+ @Order(2)
+ @Int16
+ public int cityid;
+
+ @Order(3)
+ @Length(20)
+ @Ascii
+ public String model;
+ @Order(4)
+ @Length(16)
+ @Ascii
+ public String sn;
+ @Order(5)
+ @Length(15)
+ @Ascii
+ public String imei;
+
+}
diff --git a/app/src/main/java/safeluck/drive/evaluation/platformMessage/ServerCommonRsp.java b/app/src/main/java/safeluck/drive/evaluation/platformMessage/ServerCommonRsp.java
index f902c37..eb311ec 100644
--- a/app/src/main/java/safeluck/drive/evaluation/platformMessage/ServerCommonRsp.java
+++ b/app/src/main/java/safeluck/drive/evaluation/platformMessage/ServerCommonRsp.java
@@ -49,4 +49,12 @@
public short getResult() {
return result;
}
+
+ public short getMsgId() {
+ return msgId;
+ }
+
+ public short getMsg_serial_num() {
+ return msg_serial_num;
+ }
}
diff --git a/app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/JWD.java b/app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/JWD.java
new file mode 100644
index 0000000..892fdb5
--- /dev/null
+++ b/app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/JWD.java
@@ -0,0 +1,19 @@
+package safeluck.drive.evaluation.platformMessage.decoder;
+
+import com.safeluck.aykj.annotation.Length;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by zw on 2017/6/15.
+ */
+
+@Length(4)
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD})
+public @interface JWD {
+// Class<? extends IMessageCoder<?>>[] coder() default Int32Coder.class;
+}
\ No newline at end of file
diff --git a/app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/JWDCoder.java b/app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/JWDCoder.java
new file mode 100644
index 0000000..b326b3f
--- /dev/null
+++ b/app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/JWDCoder.java
@@ -0,0 +1,29 @@
+package safeluck.drive.evaluation.platformMessage.decoder;
+
+import com.safeluck.aykj.decoder.BaseDecoder;
+import com.safeluck.aykj.decoder.Int32Coder;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * Created by zw on 2017/6/15.
+ */
+
+public class JWDCoder extends BaseDecoder<Double> {
+ Int32Coder coder = new Int32Coder();
+ @Override
+ public Double decode(String str) {
+ double ret = coder.decode(str);
+ double x = ret / 1000000;
+ BigDecimal bg = new BigDecimal(x);
+ double f1 = bg.setScale(6, BigDecimal.ROUND_HALF_UP).doubleValue();
+ return f1;
+ }
+
+ @Override
+ public String encode(Double str) {
+ int jwd = (int)(str * 1000000);
+ return coder.encode(jwd);
+ }
+}
diff --git a/app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/Param0104.java b/app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/Param0104.java
new file mode 100644
index 0000000..7b08e78
--- /dev/null
+++ b/app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/Param0104.java
@@ -0,0 +1,14 @@
+package safeluck.drive.evaluation.platformMessage.decoder;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by shiyu on 2016/12/28.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD,ElementType.TYPE})
+public @interface Param0104 {
+}
diff --git a/app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/Param8103.java b/app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/Param8103.java
new file mode 100644
index 0000000..d65ee7b
--- /dev/null
+++ b/app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/Param8103.java
@@ -0,0 +1,14 @@
+package safeluck.drive.evaluation.platformMessage.decoder;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by shiyu on 2016/12/28.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD,ElementType.TYPE})
+public @interface Param8103 {
+}
diff --git a/app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/Phone.java b/app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/Phone.java
new file mode 100644
index 0000000..64ea167
--- /dev/null
+++ b/app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/Phone.java
@@ -0,0 +1,19 @@
+package safeluck.drive.evaluation.platformMessage.decoder;
+
+import com.safeluck.aykj.annotation.Length;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by zw on 2017/6/15.
+ */
+
+@Length(8)
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD})
+public @interface Phone {
+// Class<? extends IMessageCoder<?>>[] coder() default Int32Coder.class;
+}
\ No newline at end of file
diff --git a/app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/PhoneCoder.java b/app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/PhoneCoder.java
new file mode 100644
index 0000000..184a749
--- /dev/null
+++ b/app/src/main/java/safeluck/drive/evaluation/platformMessage/decoder/PhoneCoder.java
@@ -0,0 +1,29 @@
+package safeluck.drive.evaluation.platformMessage.decoder;
+
+
+import android.util.Log;
+
+import com.anyun.im_lib.util.ByteUtil;
+import com.safeluck.aykj.decoder.BaseDecoder;
+import com.safeluck.aykj.utils.BytesUtils;
+
+public class PhoneCoder extends BaseDecoder<String> {
+ private static final String TAG = "PhoneCoder";
+ @Override
+ public String decode(String str) {
+ return str.substring(8);
+ }
+
+ @Override
+ public String encode(String str) {
+ Log.i(TAG, "encode: "+str);
+ if(str==null||"".equalsIgnoreCase(str))
+ {
+// str ="00000000000";
+ str ="0000000000000000";
+ }
+ byte[] bcdBytes = ByteUtil.str2Bcd(str);
+// return "00000"+str;
+ return BytesUtils.bytesToHexString(bcdBytes);
+ }
+}
diff --git a/app/src/main/java/safeluck/drive/evaluation/platformMessage/utils/MessageEscaper.java b/app/src/main/java/safeluck/drive/evaluation/platformMessage/utils/MessageEscaper.java
new file mode 100644
index 0000000..1ef040e
--- /dev/null
+++ b/app/src/main/java/safeluck/drive/evaluation/platformMessage/utils/MessageEscaper.java
@@ -0,0 +1,85 @@
+package safeluck.drive.evaluation.platformMessage.utils;
+
+
+import com.safeluck.aykj.utils.ArrayUtils;
+
+/**
+ * Created by zw on 2017/7/8.
+ * 钃濈墮鍗忚杞箟
+ */
+
+public class MessageEscaper {
+
+ public byte[] escape(byte[] source_bytes)
+ {
+ byte[] return_bytes = new byte[source_bytes.length*2];
+
+ int size = source_bytes.length;
+ int pos = 0;
+ for (int i = 0; i < size; i++)
+ {
+ if (i == 0||i==size-1)
+ {
+ return_bytes[pos++] = source_bytes[i];
+ continue;
+ }
+ if (source_bytes[i] == 0x7d)
+ {
+ return_bytes[pos++] = 0x7d;
+ return_bytes[pos++] = 0x01;
+ }
+ else if (source_bytes[i] == 0x7e)
+ {
+ return_bytes[pos++] = 0x7d;
+ return_bytes[pos++] = 0x02;
+ }
+ else
+ {
+ return_bytes[pos++] = source_bytes[i];
+ }
+ }
+
+ return ArrayUtils.subArray(return_bytes,0,pos);
+
+
+ }
+
+ public byte[] unescape(byte[] cmd_bytes)
+ {
+ //杞箟杩樺師
+ int len = cmd_bytes.length;
+ byte[] return_bytes = new byte[cmd_bytes.length];
+
+ //int len = ByteHelper.HexString2Byte(cmd, cmd_bytes);
+ int pos = 0;
+ for (int i = 0; i < len; i++)
+ {
+ if (i == len - 1)
+ {
+ return_bytes[pos++] = cmd_bytes[i];
+ continue;
+ }
+
+ if (cmd_bytes[i] == 0x7d && cmd_bytes[i + 1] == 0x02)
+ {
+ return_bytes[pos++] = 0x7e;
+ i++;
+ continue;
+ }
+ else if (cmd_bytes[i] == 0x7d && cmd_bytes[i + 1] == 0x01)
+ {
+ return_bytes[pos++] = 0x7d;
+ i++;
+ continue;
+ }
+ else
+ {
+ return_bytes[pos++] = cmd_bytes[i];
+ }
+ }
+ return ArrayUtils.subArray(return_bytes,0,pos);
+
+
+ }
+
+}
diff --git a/app/src/main/java/safeluck/drive/evaluation/platformMessage/utils/MessageManager.java b/app/src/main/java/safeluck/drive/evaluation/platformMessage/utils/MessageManager.java
new file mode 100644
index 0000000..8f4a78d
--- /dev/null
+++ b/app/src/main/java/safeluck/drive/evaluation/platformMessage/utils/MessageManager.java
@@ -0,0 +1,63 @@
+//package safeluck.drive.evaluation.platformMessage.utils;
+//
+//import com.safeluck.aykj.decoder.BitStateCoder;
+//import com.safeluck.aykj.decoder.Int16Coder;
+//import com.safeluck.aykj.utils.BitState;
+//
+//import safeluck.drive.evaluation.platformMessage.JK2019MessageBase;
+//
+///**
+// * Created by zhouwei on 2016/12/7.
+// */
+//
+//public final class MessageManager {
+//
+// public static JK2019MessageBase get(String cmd) {
+// String head = cmd.substring(4,8);
+// String classname = "aykj.message.jt808_2016.server.JTMessage"+head;
+// if("0900".equals(head)||"8900".equals(head))
+// classname = "aykj.message.jt808_2016.JTMessage"+head;
+// Class c = null;
+// try {
+// c = Class.forName(classname);
+// } catch (ClassNotFoundException e) {
+// classname = "aykj.message.jt808_2016.device.JTMessage"+head;
+// try {
+// c = Class.forName(classname);
+// } catch (ClassNotFoundException e1) {
+//// c = JTMessageUnknown.class;
+// }
+// }
+// try {
+//
+// JK2019MessageBase ret = (JK2019MessageBase)c.newInstance();
+// ret.parse(cmd);
+// if(ret.messageId==0x8900||ret.messageId==0x0900){
+//// JTMessageExtend ext = (JTMessageExtend)ret;
+// if(ret.messageId==0x8900)
+//// classname = "aykj.message.jt808_2016.server.ExtendMessage"+ String.format("%04X", ext.extend_id);
+// else
+//// classname = "aykj.message.jt808_2016.device.ExtendMessage"+ String.format("%04X", ext.extend_id);
+// try {
+// c = Class.forName(classname);
+// } catch (ClassNotFoundException e) {
+// classname = "aykj.message.jt808_2016.device.JTMessage"+head;
+// try {
+// c = Class.forName(classname);
+// } catch (ClassNotFoundException e1) {
+//// c = JTMessageUnknown.class;
+// }
+// }
+//
+// JK2019MessageBase ext_ret = (JK2019MessageBase)c.newInstance();
+// ext_ret.parse(cmd);
+// ret = ext_ret;
+// }
+// return ret;
+// } catch (InstantiationException e) {
+// throw new RuntimeException(e);
+// } catch (IllegalAccessException e) {
+// throw new RuntimeException(e);
+// }
+// }
+//}
diff --git a/im_lib/src/main/java/com/anyun/im_lib/netty/NettyTcpClient.java b/im_lib/src/main/java/com/anyun/im_lib/netty/NettyTcpClient.java
index 9b233a5..11be1ce 100644
--- a/im_lib/src/main/java/com/anyun/im_lib/netty/NettyTcpClient.java
+++ b/im_lib/src/main/java/com/anyun/im_lib/netty/NettyTcpClient.java
@@ -12,6 +12,7 @@
import com.anyun.im_lib.listener.IMSConnectStatusCallback;
import com.anyun.im_lib.listener.OnEventListener;
import com.anyun.im_lib.util.ByteUtil;
+import com.safeluck.aykj.utils.BytesUtils;
import java.nio.ByteBuffer;
import java.util.Vector;
@@ -218,14 +219,14 @@
imsConnectStatusCallback.onConnected();
}
// TODO: 2019/12/12 杩炴帴鎴愬姛 锛屽彂閫佹彙鎵嬫秷鎭紙闇�瑕佺殑璇濃�斺�旓級
- try {
- ByteBuf byteBuf = ByteBufAllocator.DEFAULT.ioBuffer();
- byteBuf.writeBytes(mOnEventListener.getRegisterMessage());
- Log.i(TAG, "鍙戦�佹秷鎭�: "+ ByteUtil.byte2HexStr(mOnEventListener.getRegisterMessage()));
- channel.writeAndFlush(byteBuf);
- } catch (Exception e) {
- Log.i(TAG, "鍙戦�佹秷鎭け璐ワ紝reason="+e.getMessage()+"\t");
- }
+// try {
+// ByteBuf byteBuf = ByteBufAllocator.DEFAULT.ioBuffer();
+// byteBuf.writeBytes(mOnEventListener.getRegisterMessage());
+// Log.i(TAG, "鍙戦�佹秷鎭�: "+ ByteUtil.byte2HexStr(mOnEventListener.getRegisterMessage()));
+// channel.writeAndFlush(byteBuf);
+// } catch (Exception e) {
+// Log.i(TAG, "鍙戦�佹秷鎭け璐ワ紝reason="+e.getMessage()+"\t");
+// }
break;
case IMSConfig.CONNECT_STATE_FAILURE:
default:
@@ -331,6 +332,7 @@
Log.i(TAG, "sendMsg fail,channel涓虹┖"+msg);
}
try {
+ Log.i(TAG, "sendMsg: "+ BytesUtils.bytesToHexString(msg));
ByteBuf byteBuf = ByteBufAllocator.DEFAULT.ioBuffer();
byteBuf.writeBytes(msg);
channel.writeAndFlush(byteBuf);
diff --git a/im_lib/src/main/java/com/safeluck/aykj/annotation/AnnotationRegister.java b/im_lib/src/main/java/com/safeluck/aykj/annotation/AnnotationRegister.java
new file mode 100644
index 0000000..5180fa0
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/annotation/AnnotationRegister.java
@@ -0,0 +1,58 @@
+package com.safeluck.aykj.annotation;
+
+import com.safeluck.aykj.decoder.*;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+public final class AnnotationRegister {
+
+ static HashMap hashMap = new HashMap();
+
+ static
+ {
+ register(Int16.class,new Int16Coder());
+ register(Int32.class,new Int32Coder());
+ register(Int8.class,new ByteCoder());
+ register(GBK.class,new GBKStringDecoder());
+ register(Ascii.class,new GBKStringDecoder());
+
+ register(BitState.class,new BitStateCoder());
+ register(Hex.class,new DefaultHexCoder());
+ register(UTF8.class,new UTF8StringDecoder());
+ register(Bytes.class,new BytesCoder());
+ register(Message.class,new BinMessageCoder());
+ register(BcdDate.class,new BcdDateCoder());
+ register(BcdDateTime.class,new BcdDateTimeCoder());
+ register(Int16LE.class,new Int16LECoder());
+ register(Int32LE.class,new Int32LECoder());
+
+
+ }
+
+ public static void register(Class annotation, IMessageCoder<?> coder)
+ {
+ hashMap.put(annotation,coder);
+ }
+ public static IMessageCoder getCoder(Class annotation)
+ {
+ IMessageCoder decoder = (IMessageCoder)hashMap.get(annotation);
+ if(decoder instanceof BaseDecoder)
+ {
+ BaseDecoder baseDecoder = (BaseDecoder)decoder;
+ if(!baseDecoder.isSingleton)
+ {
+ try {
+ decoder = decoder.getClass().newInstance();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+ return decoder;
+ }
+
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/annotation/Ascii.java b/im_lib/src/main/java/com/safeluck/aykj/annotation/Ascii.java
new file mode 100644
index 0000000..3edb73a
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/annotation/Ascii.java
@@ -0,0 +1,14 @@
+package com.safeluck.aykj.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD,ElementType.TYPE})
+public @interface Ascii {
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/annotation/BcdDate.java b/im_lib/src/main/java/com/safeluck/aykj/annotation/BcdDate.java
new file mode 100644
index 0000000..dd52925
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/annotation/BcdDate.java
@@ -0,0 +1,16 @@
+package com.safeluck.aykj.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by zw on 2017/6/15.
+ */
+@Length(3)
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD})
+public @interface BcdDate {
+// Class<? extends IMessageCoder<?>>[] coder() default Int32Coder.class;
+}
\ No newline at end of file
diff --git a/im_lib/src/main/java/com/safeluck/aykj/annotation/BcdDateTime.java b/im_lib/src/main/java/com/safeluck/aykj/annotation/BcdDateTime.java
new file mode 100644
index 0000000..f4c4874
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/annotation/BcdDateTime.java
@@ -0,0 +1,16 @@
+package com.safeluck.aykj.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by zw on 2017/6/15.
+ */
+@Length(6)
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD})
+public @interface BcdDateTime {
+// Class<? extends IMessageCoder<?>>[] coder() default Int32Coder.class;
+}
\ No newline at end of file
diff --git a/im_lib/src/main/java/com/safeluck/aykj/annotation/BitState.java b/im_lib/src/main/java/com/safeluck/aykj/annotation/BitState.java
new file mode 100644
index 0000000..fe1b872
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/annotation/BitState.java
@@ -0,0 +1,15 @@
+package com.safeluck.aykj.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD})
+public @interface BitState {
+// Class<? extends IMessageCoder<?>>[] coder() default Int32Coder.class;
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/annotation/Bytes.java b/im_lib/src/main/java/com/safeluck/aykj/annotation/Bytes.java
new file mode 100644
index 0000000..d6e79e0
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/annotation/Bytes.java
@@ -0,0 +1,14 @@
+package com.safeluck.aykj.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD,ElementType.TYPE})
+public @interface Bytes {
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/annotation/FromEnd.java b/im_lib/src/main/java/com/safeluck/aykj/annotation/FromEnd.java
new file mode 100644
index 0000000..80de160
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/annotation/FromEnd.java
@@ -0,0 +1,17 @@
+package com.safeluck.aykj.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by zw on 2017/7/11.
+ * 浠庣粨灏惧紑濮嬭В鏋愯�屼笉鏄粠寮�澶�
+ */
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD})
+public @interface FromEnd {
+ int value();
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/annotation/GBK.java b/im_lib/src/main/java/com/safeluck/aykj/annotation/GBK.java
new file mode 100644
index 0000000..7a23503
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/annotation/GBK.java
@@ -0,0 +1,15 @@
+package com.safeluck.aykj.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD,ElementType.TYPE})
+public @interface GBK {
+
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/annotation/Hex.java b/im_lib/src/main/java/com/safeluck/aykj/annotation/Hex.java
new file mode 100644
index 0000000..1e90e5d
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/annotation/Hex.java
@@ -0,0 +1,14 @@
+package com.safeluck.aykj.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD,ElementType.TYPE})
+public @interface Hex {
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/annotation/Int16.java b/im_lib/src/main/java/com/safeluck/aykj/annotation/Int16.java
new file mode 100644
index 0000000..33f3bf9
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/annotation/Int16.java
@@ -0,0 +1,20 @@
+package com.safeluck.aykj.annotation;
+
+import com.safeluck.aykj.decoder.IMessageCoder;
+import com.safeluck.aykj.decoder.Int16Coder;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+
+@Length(2)
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD,ElementType.TYPE})
+public @interface Int16 {
+// Class<? extends IMessageCoder<?>>[] coder() default Int16Coder.class;
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/annotation/Int16LE.java b/im_lib/src/main/java/com/safeluck/aykj/annotation/Int16LE.java
new file mode 100644
index 0000000..9de1c03
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/annotation/Int16LE.java
@@ -0,0 +1,18 @@
+package com.safeluck.aykj.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ * 灏忕妯″紡 浣庝綅鍦ㄥ墠
+ */
+
+@Length(2)
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD,ElementType.TYPE})
+public @interface Int16LE {
+// Class<? extends IMessageCoder<?>>[] coder() default Int16Coder.class;
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/annotation/Int32.java b/im_lib/src/main/java/com/safeluck/aykj/annotation/Int32.java
new file mode 100644
index 0000000..22109af
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/annotation/Int32.java
@@ -0,0 +1,20 @@
+package com.safeluck.aykj.annotation;
+
+import com.safeluck.aykj.decoder.IMessageCoder;
+import com.safeluck.aykj.decoder.Int16Coder;
+import com.safeluck.aykj.decoder.Int32Coder;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+@Length(4)
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD})
+public @interface Int32 {
+// Class<? extends IMessageCoder<?>>[] coder() default Int32Coder.class;
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/annotation/Int32LE.java b/im_lib/src/main/java/com/safeluck/aykj/annotation/Int32LE.java
new file mode 100644
index 0000000..467a386
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/annotation/Int32LE.java
@@ -0,0 +1,17 @@
+package com.safeluck.aykj.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ * 灏忕妯″紡 浣庝綅鍦ㄥ墠
+ */
+@Length(4)
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD})
+public @interface Int32LE {
+// Class<? extends IMessageCoder<?>>[] coder() default Int32Coder.class;
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/annotation/Int8.java b/im_lib/src/main/java/com/safeluck/aykj/annotation/Int8.java
new file mode 100644
index 0000000..b31da17
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/annotation/Int8.java
@@ -0,0 +1,16 @@
+package com.safeluck.aykj.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+@Length(1)
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD,ElementType.TYPE})
+public @interface Int8 {
+// Class<? extends IMessageCoder<?>>[] coder() default Int16Coder.class;
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/annotation/Length.java b/im_lib/src/main/java/com/safeluck/aykj/annotation/Length.java
new file mode 100644
index 0000000..08c2070
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/annotation/Length.java
@@ -0,0 +1,34 @@
+package com.safeluck.aykj.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD,ElementType.TYPE})
+public @interface Length {
+ int value() default 0;
+ String lengthField() default "";
+
+ /**
+ * 濡傛灉闀垮害涓嶈冻鐨勫~鍏呮柟鍚�
+ * @return
+ */
+ PaddingWay paddingWay() default PaddingWay.RIGHT;
+
+ /**
+ * 闀垮害涓嶈冻鐨勫~鍏呭瓧绗�
+ * @return
+ */
+ byte paddingByte() default 0x00;
+ enum PaddingWay {
+ LEFT,RIGHT;
+ }
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/annotation/Message.java b/im_lib/src/main/java/com/safeluck/aykj/annotation/Message.java
new file mode 100644
index 0000000..ce4af10
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/annotation/Message.java
@@ -0,0 +1,15 @@
+package com.safeluck.aykj.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD,ElementType.TYPE})
+public @interface Message {
+
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/annotation/Order.java b/im_lib/src/main/java/com/safeluck/aykj/annotation/Order.java
new file mode 100644
index 0000000..d1031fb
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/annotation/Order.java
@@ -0,0 +1,15 @@
+package com.safeluck.aykj.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD})
+public @interface Order {
+ int value() default -1;
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/annotation/UTF8.java b/im_lib/src/main/java/com/safeluck/aykj/annotation/UTF8.java
new file mode 100644
index 0000000..a1bc563
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/annotation/UTF8.java
@@ -0,0 +1,14 @@
+package com.safeluck.aykj.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD,ElementType.TYPE})
+public @interface UTF8 {
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/decoder/BCDCoder.java b/im_lib/src/main/java/com/safeluck/aykj/decoder/BCDCoder.java
new file mode 100644
index 0000000..ac843fe
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/decoder/BCDCoder.java
@@ -0,0 +1,18 @@
+package com.safeluck.aykj.decoder;
+
+import com.safeluck.aykj.utils.BytesUtils;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+//public class BCDCoder implements IMessageCoder<String> {
+// @Override
+// public String decode(String str) {
+// return Integer.valueOf(str, 16).intValue();
+// }
+//
+// @Override
+// public String encode(String i) {
+// return BytesUtils.toHexString(i.byteValue());
+// }
+//}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/decoder/BaseDecoder.java b/im_lib/src/main/java/com/safeluck/aykj/decoder/BaseDecoder.java
new file mode 100644
index 0000000..421e899
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/decoder/BaseDecoder.java
@@ -0,0 +1,23 @@
+package com.safeluck.aykj.decoder;
+
+
+/**
+ * Created by zhouwei on 2016/12/20.
+ */
+
+public abstract class BaseDecoder<T> implements IMessageCoder<T> {
+ public boolean isSingleton = true;
+
+ protected Class<? extends T> fieldClass;
+
+
+ @Override
+ public Class<? extends T> getFieldClass() {
+ return fieldClass;
+ }
+
+ @Override
+ public void setFieldClass(Class<? extends T> value) {
+ fieldClass =value;
+ }
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/decoder/BcdDateCoder.java b/im_lib/src/main/java/com/safeluck/aykj/decoder/BcdDateCoder.java
new file mode 100644
index 0000000..41a672a
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/decoder/BcdDateCoder.java
@@ -0,0 +1,28 @@
+package com.safeluck.aykj.decoder;
+
+import com.safeluck.aykj.utils.BitState;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Created by zw on 2017/6/15.
+ */
+
+public class BcdDateCoder extends BaseDecoder<Date> {
+ SimpleDateFormat f= new SimpleDateFormat("yyMMdd");
+ @Override
+ public Date decode(String date) {
+ try {
+ return f.parse(date);
+ } catch (ParseException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public String encode(Date date) {
+ return f.format(date);
+ }
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/decoder/BcdDateTimeCoder.java b/im_lib/src/main/java/com/safeluck/aykj/decoder/BcdDateTimeCoder.java
new file mode 100644
index 0000000..fed57fc
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/decoder/BcdDateTimeCoder.java
@@ -0,0 +1,26 @@
+package com.safeluck.aykj.decoder;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Created by zw on 2017/6/15.
+ */
+
+public class BcdDateTimeCoder extends BaseDecoder<Date> {
+ SimpleDateFormat f= new SimpleDateFormat("yyMMddHHmmss");
+ @Override
+ public Date decode(String date) {
+ try {
+ return f.parse(date);
+ } catch (ParseException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public String encode(Date date) {
+ return f.format(date);
+ }
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/decoder/BinMessageCoder.java b/im_lib/src/main/java/com/safeluck/aykj/decoder/BinMessageCoder.java
new file mode 100644
index 0000000..7061af6
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/decoder/BinMessageCoder.java
@@ -0,0 +1,30 @@
+package com.safeluck.aykj.decoder;
+
+import com.safeluck.aykj.message.BinMessageBase;
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+public class BinMessageCoder extends BaseDecoder<BinMessageBase> {
+
+ public BinMessageCoder()
+ {
+ this.isSingleton = false;
+ }
+ @Override
+ public BinMessageBase decode(String str) {
+ try {
+ BinMessageBase messageBase = this.fieldClass.newInstance();
+ messageBase.parse(str);
+ return messageBase;
+ } catch (Exception ex)
+ {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ @Override
+ public String encode(BinMessageBase i) {
+ return i.toString();
+ }
+
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/decoder/BitStateCoder.java b/im_lib/src/main/java/com/safeluck/aykj/decoder/BitStateCoder.java
new file mode 100644
index 0000000..943a25f
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/decoder/BitStateCoder.java
@@ -0,0 +1,45 @@
+package com.safeluck.aykj.decoder;
+
+import com.safeluck.aykj.utils.BitState;
+import com.safeluck.aykj.utils.BytesUtils;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+public class BitStateCoder extends BaseDecoder<BitState> {
+ Int16Coder int16Coder = new Int16Coder();
+ Int32Coder int32Coder = new Int32Coder();
+ @Override
+ public BitState decode(String str) {
+ if(str.length()==2)
+ {
+ return new BitState(Byte.valueOf(str,16));
+ }
+ if(str.length()==4)
+ {
+ return new BitState(Short.valueOf(str,16));
+ }
+ if(str.length()==8)
+ {
+ return new BitState(Integer.valueOf(str,16));
+ }
+ throw new RuntimeException("BitState闀垮害涓嶅锛屾暟鎹�="+str);
+ }
+
+ @Override
+ public String encode(BitState i) {
+ if(i.total==8)
+ {
+ return BytesUtils.toHexString((byte)i.value);
+ }
+ if(i.total==16)
+ {
+ return int16Coder.encode((int)i.value);
+ }
+ if(i.total==32)
+ {
+ return int32Coder.encode((int)i.value);
+ }
+ throw new RuntimeException("BitState闀垮害涓嶅锛屾暟鎹�="+i.total);
+ }
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/decoder/ByteCoder.java b/im_lib/src/main/java/com/safeluck/aykj/decoder/ByteCoder.java
new file mode 100644
index 0000000..92913e8
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/decoder/ByteCoder.java
@@ -0,0 +1,24 @@
+package com.safeluck.aykj.decoder;
+
+import com.safeluck.aykj.utils.BytesUtils;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+public class ByteCoder extends BaseDecoder<Integer> {
+ public static ByteCoder instance = new ByteCoder();
+ @Override
+ public Integer decode(String str) {
+ if(str==null||"".equals(str))
+ return 0;
+ return Integer.valueOf(str, 16).intValue();
+ }
+
+ @Override
+ public String encode(Integer i) {
+ if(i==null)
+ i=0;
+ return BytesUtils.toHexString(i.byteValue());
+ }
+
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/decoder/BytesCoder.java b/im_lib/src/main/java/com/safeluck/aykj/decoder/BytesCoder.java
new file mode 100644
index 0000000..3775bbd
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/decoder/BytesCoder.java
@@ -0,0 +1,19 @@
+package com.safeluck.aykj.decoder;
+
+import com.safeluck.aykj.utils.BytesUtils;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+public class BytesCoder extends BaseDecoder<Object> {
+ @Override
+ public Object decode(String str) {
+ return BytesUtils.hexStringToBytes(str);
+ }
+
+ @Override
+ public String encode(Object i) {
+ byte[] bytes = (byte[])i;
+ return BytesUtils.bytesToHexString(bytes);
+ }
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/decoder/DefaultHexCoder.java b/im_lib/src/main/java/com/safeluck/aykj/decoder/DefaultHexCoder.java
new file mode 100644
index 0000000..0708f53
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/decoder/DefaultHexCoder.java
@@ -0,0 +1,18 @@
+package com.safeluck.aykj.decoder;
+
+import com.safeluck.aykj.utils.BytesUtils;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+public class DefaultHexCoder extends BaseDecoder<String> {
+ @Override
+ public String decode(String str) {
+ return str;
+ }
+
+ @Override
+ public String encode(String i) {
+ return i;
+ }
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/decoder/GBKStringDecoder.java b/im_lib/src/main/java/com/safeluck/aykj/decoder/GBKStringDecoder.java
new file mode 100644
index 0000000..cfa5f4c
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/decoder/GBKStringDecoder.java
@@ -0,0 +1,63 @@
+package com.safeluck.aykj.decoder;
+
+import com.safeluck.aykj.utils.BytesUtils;
+
+import java.io.UnsupportedEncodingException;
+
+/**
+ * Created by zhouwei on 2016/12/3.
+ */
+
+public class GBKStringDecoder extends BaseDecoder<String> {
+
+ public String stripEnd(String str, String stripChars) {
+ int end;
+ if(str != null && (end = str.length()) != 0) {
+ if(stripChars == null) {
+ while(end != 0 && Character.isWhitespace(str.charAt(end - 1))) {
+ --end;
+ }
+ } else {
+ if(stripChars.length() == 0) {
+ return str;
+ }
+
+ while(end != 0 && stripChars.indexOf(str.charAt(end - 1)) != -1) {
+ --end;
+ }
+ }
+
+ return str.substring(0, end);
+ } else {
+ return str;
+ }
+ }
+
+
+ @Override
+ public String decode(String str) {
+
+ if(str==null)
+ return null;
+ byte[] bytes = BytesUtils.hexStringToBytes(str);
+
+ try {
+
+ String ret = new String(bytes,"gbk").trim();
+ return ret;// this.stripEnd(ret,"\0");
+ } catch (UnsupportedEncodingException e) {
+ return null;
+ }
+ }
+
+ @Override
+ public String encode(String str) {
+ try {
+ if(str==null)
+ return null;
+ return BytesUtils.bytesToHexString(str.getBytes("gbk"));
+ } catch (UnsupportedEncodingException e) {
+ return null;
+ }
+ }
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/decoder/IMessageCoder.java b/im_lib/src/main/java/com/safeluck/aykj/decoder/IMessageCoder.java
new file mode 100644
index 0000000..69eab48
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/decoder/IMessageCoder.java
@@ -0,0 +1,13 @@
+package com.safeluck.aykj.decoder;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+public interface IMessageCoder<T> {
+ T decode(String str);
+ String encode(T str);
+
+ Class<? extends T> getFieldClass();
+ void setFieldClass(Class<? extends T> value);
+
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/decoder/Int16Coder.java b/im_lib/src/main/java/com/safeluck/aykj/decoder/Int16Coder.java
new file mode 100644
index 0000000..3675d30
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/decoder/Int16Coder.java
@@ -0,0 +1,29 @@
+package com.safeluck.aykj.decoder;
+
+import com.safeluck.aykj.annotation.Int16;
+import com.safeluck.aykj.utils.BytesUtils;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+public class Int16Coder extends BaseDecoder<Integer> {
+
+ public static Int16Coder instance = new Int16Coder();
+
+ @Override
+ public Integer decode(String str) {
+ if(str==null||"".equals(str))
+ return 0;
+ return Integer.valueOf(str, 16);
+ }
+
+ @Override
+ public String encode(Integer i) {
+ if(i==null)
+ i=0;
+ byte[] b = new byte[2];
+ b[1]= (byte)(i&0xff);
+ b[0]= (byte)(i >> 8);
+ return BytesUtils.bytesToHexString(b);
+ }
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/decoder/Int16LECoder.java b/im_lib/src/main/java/com/safeluck/aykj/decoder/Int16LECoder.java
new file mode 100644
index 0000000..5068d92
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/decoder/Int16LECoder.java
@@ -0,0 +1,42 @@
+package com.safeluck.aykj.decoder;
+
+import com.safeluck.aykj.utils.BytesUtils;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+public class Int16LECoder extends BaseDecoder<Integer> {
+
+ public static Int16LECoder instance = new Int16LECoder();
+
+ @Override
+ public Integer decode(String str) {
+
+ byte[] src = BytesUtils.hexStringToBytes(str);
+ int offset = 0;
+ int value;
+ value = (src[offset] & 0xFF)
+ | ((src[offset + 1] & 0xFF) << 8);
+// | ((src[offset + 2] & 0xFF) << 16)
+// | ((src[offset + 3] & 0xFF) << 24));
+ return value;
+// return Integer.valueOf(Short.reverseBytes(Int16Coder.instance.decode(str).shortValue())&0xFF);
+// if(str==null||"".equals(str))
+// return 0;
+//
+// return Integer.valueOf(str, 16);
+ }
+
+ @Override
+ public String encode(Integer i) {
+ if(i==null)
+ i=0;
+ int value = i.intValue();
+ byte[] src = new byte[2];
+// src[3] = (byte) ((value >> 24) & 0xFF);
+// src[2] = (byte) ((value >> 16) & 0xFF);
+ src[1] = (byte) ((value >> 8) & 0xFF);
+ src[0] = (byte) (value & 0xFF);
+ return BytesUtils.bytesToHexString(src);
+ }
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/decoder/Int32Coder.java b/im_lib/src/main/java/com/safeluck/aykj/decoder/Int32Coder.java
new file mode 100644
index 0000000..739f532
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/decoder/Int32Coder.java
@@ -0,0 +1,33 @@
+package com.safeluck.aykj.decoder;
+
+import com.safeluck.aykj.annotation.Int32;
+import com.safeluck.aykj.utils.BytesUtils;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+public class Int32Coder extends BaseDecoder<Integer> {
+
+ public static Int32Coder instance = new Int32Coder();
+
+ @Override
+ public Integer decode(String str) {
+ if(str==null||"".equals(str))
+ return 0;
+ return Integer.valueOf(str, 16);
+ }
+
+ @Override
+ public String encode(Integer i) {
+ if(i==null)
+ i=0;
+ //楂樹綅鍦ㄥ墠 32浣嶆暣鏁�
+ int num = i.intValue();
+ byte[] b = new byte[4];
+ b[3]= (byte)(num&0xff);
+ b[2]= (byte)(num >> 8);
+ b[1]= (byte)(num >> 16);
+ b[0]= (byte)(num >> 24);
+ return BytesUtils.bytesToHexString(b);
+ }
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/decoder/Int32LECoder.java b/im_lib/src/main/java/com/safeluck/aykj/decoder/Int32LECoder.java
new file mode 100644
index 0000000..e1ce1b2
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/decoder/Int32LECoder.java
@@ -0,0 +1,39 @@
+package com.safeluck.aykj.decoder;
+
+import com.safeluck.aykj.utils.BytesUtils;
+
+/**
+ * Created by zhouwei on 2016/12/1.
+ */
+public class Int32LECoder extends BaseDecoder<Integer> {
+
+ public static Int32LECoder instance = new Int32LECoder();
+
+ @Override
+ public Integer decode(String str) {
+ return Integer.reverseBytes(Int32Coder.instance.decode(str));
+// byte[] src = BytesUtils.hexStringToBytes(str);
+// int offset = 0;
+// int value;
+// value = (int) ((src[offset] & 0xFF)
+// | ((src[offset + 1] & 0xFF) << 8)
+// | ((src[offset + 2] & 0xFF) << 16)
+// | ((src[offset + 3] & 0xFF) << 24));
+// return value;
+ }
+ //浣庝綅鍦ㄥ墠 32浣嶆暣鏁�
+ @Override
+ public String encode(Integer i) {
+ return Int32Coder.instance.encode(Integer.reverseBytes(i));
+
+// if(i==null)
+// i=0;
+// int value = i.intValue();
+// byte[] src = new byte[4];
+// src[3] = (byte) ((value >> 24) & 0xFF);
+// src[2] = (byte) ((value >> 16) & 0xFF);
+// src[1] = (byte) ((value >> 8) & 0xFF);
+// src[0] = (byte) (value & 0xFF);
+// return BytesUtils.bytesToHexString(src);
+ }
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/decoder/UTF8StringDecoder.java b/im_lib/src/main/java/com/safeluck/aykj/decoder/UTF8StringDecoder.java
new file mode 100644
index 0000000..a6dbdfd
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/decoder/UTF8StringDecoder.java
@@ -0,0 +1,37 @@
+package com.safeluck.aykj.decoder;
+
+import com.safeluck.aykj.utils.BytesUtils;
+
+import java.io.UnsupportedEncodingException;
+
+/**
+ * Created by zhouwei on 2016/12/3.
+ */
+
+public class UTF8StringDecoder extends BaseDecoder<String> {
+
+ @Override
+ public String decode(String str) {
+
+ if(str==null)
+ return null;
+ byte[] bytes = BytesUtils.hexStringToBytes(str);
+
+ try {
+ return new String(bytes,"utf-8");
+ } catch (UnsupportedEncodingException e) {
+ return null;
+ }
+ }
+
+ @Override
+ public String encode(String str) {
+ try {
+ if(str==null)
+ return null;
+ return BytesUtils.bytesToHexString(str.getBytes("utf-8"));
+ } catch (UnsupportedEncodingException e) {
+ return null;
+ }
+ }
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/message/BinMessageBase.java b/im_lib/src/main/java/com/safeluck/aykj/message/BinMessageBase.java
new file mode 100644
index 0000000..1ac6965
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/message/BinMessageBase.java
@@ -0,0 +1,397 @@
+package com.safeluck.aykj.message;
+
+import android.util.Log;
+
+import com.safeluck.aykj.annotation.AnnotationRegister;
+import com.safeluck.aykj.annotation.FromEnd;
+import com.safeluck.aykj.annotation.Length;
+import com.safeluck.aykj.annotation.Order;
+import com.safeluck.aykj.decoder.IMessageCoder;
+import com.safeluck.aykj.utils.BytesUtils;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+
+import io.netty.util.internal.PlatformDependent;
+
+@SuppressWarnings("Since15")
+public class BinMessageBase {
+
+ static short m_messageNo;
+ protected synchronized short getMessageNo()
+ {
+ m_messageNo++;
+ if(m_messageNo>=Short.MAX_VALUE-1)
+ {
+ m_messageNo = 0;
+ }
+ return m_messageNo;
+ }
+
+ static HashMap<Class,FieldDefine[]> fieldDefines = new HashMap<>();
+
+ protected List<String> disabledFields = new ArrayList<>();
+
+ public void parse(String hex)
+ {
+ try {
+ FieldDefine[] fields = this.getFieldDefines();
+
+ int total = hex.length();
+ int used = 0;
+ int dynamic_len_field_count = 0;
+ int relative_len_field_count = 0;
+
+ //濡傛灉鏈変负鍔ㄦ�侀暱搴︾殑锛岃绠楀嚭闀垮害
+ for (FieldDefine fieldDefine : fields) {
+ if (this.disabledFields.contains(fieldDefine.field.getName())) {
+ continue;
+ }
+ //璁$畻渚濊禆闀垮害瀛楁鏁伴噺
+ if (fieldDefine.relativeLengthField != null) {
+ relative_len_field_count++;
+ }
+ if (fieldDefine.relativeLengthField == null && fieldDefine.getFieldLen() == 0) {
+ dynamic_len_field_count++;
+ }
+ //鍔ㄦ�侀暱搴︼紝鍘绘帀鍏朵粬鎵�鏈夊瓧娈电殑闀垮害锛屽墿浣欑殑涓烘瀛楁闀垮害
+ if (fieldDefine.getFieldLen() > 0) {
+ System.out.println(fieldDefine.field.getName() + "闀垮害=" + fieldDefine.getFieldLen() * 2);
+ used += (fieldDefine.getFieldLen() * 2);
+ }
+
+ }
+ if (dynamic_len_field_count > 1) {
+ buildException("鍔ㄦ�侀暱搴﹀瓧娈靛彧鑳芥湁涓�涓�");
+ }
+ if (dynamic_len_field_count > 0 && relative_len_field_count > 0) {
+ buildException("鍔ㄦ�侀暱搴﹀瓧娈靛拰渚濊禆闀垮害瀛楁鍙兘鏈変竴涓�");
+ }
+ int dynamic_len = (total - used);
+
+ int start = 0;
+ for (FieldDefine fieldDefine : fields) {
+ if (this.disabledFields.contains(fieldDefine.field.getName())) {
+ continue;
+ }
+ //瑙f瀽渚濊禆闀垮害
+ if (fieldDefine.relativeLengthField != null) {
+ try {
+ Field lengthField = this.getClass().getField(fieldDefine.length.lengthField());
+ int len = (int) lengthField.get(this);
+ System.out.println(fieldDefine.field.getName() + ":渚濊禆闀垮害=" + len);
+
+ fieldDefine.setFieldLen(len);
+ ;
+ } catch (Exception e) {
+ buildException(e.getMessage());
+ }
+ }
+ int str_hex_len = fieldDefine.getFieldLen() * 2;
+ if (str_hex_len <= 0) {
+ str_hex_len = dynamic_len;
+ }
+ String field_hex = null;
+ Object value = null;
+ if (fieldDefine.from_end_index >= 0) {
+ field_hex = hex.substring(hex.length() - str_hex_len - fieldDefine.from_end_index, hex.length() - fieldDefine.from_end_index);
+ value = fieldDefine.coder.decode(field_hex);
+ } else {
+ field_hex = hex.substring(start, start + str_hex_len);
+ start += str_hex_len;
+ value = fieldDefine.coder.decode(field_hex);
+ }
+ try {
+ fieldDefine.field.set(this, value);
+// Object val = fieldDefine.field.get(this);
+// System.out.println(fieldDefine.field.getName()+":get="+val);
+
+ } catch (IllegalAccessException e) {
+ this.buildException(e.getMessage());
+ }
+ }
+ }
+ catch (ParseException ex)
+ {
+ throw ex;
+ }
+ catch (Exception ex)
+ {
+ this.buildException(ex.getMessage());
+ }
+ }
+
+ public void registerDisableField(String field)
+ {
+ if(!this.disabledFields.contains(field)) {
+ this.disabledFields.add(field);
+ }
+ }
+ public void removeDisableField(String field)
+ {
+ this.disabledFields.remove(field);
+ }
+
+
+ protected void buildException(String error)
+ {
+ throw new ParseException(error,this);
+ }
+
+ public byte[] toBytes()
+ {
+ String hex = this.toString();
+
+ return BytesUtils.hexStringToBytes(hex);
+
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder sb = new StringBuilder();
+ FieldDefine[] fields = this.getFieldDefines();
+ //鍐欏姩鎬侀暱搴﹀瓧娈甸暱搴�
+ for (FieldDefine fieldDefine:fields) {
+
+ if (this.disabledFields.contains(fieldDefine.field.getName())) {
+ continue;
+ }
+ Log.i("PlatFormMessage", "1field: "+fieldDefine.field.getName());
+ if(fieldDefine.relativeLengthField==null)
+ continue;
+ try {
+ Object value = fieldDefine.field.get(this);
+ String hex = fieldDefine.coder.encode(value);
+ if (hex == null) {
+ fieldDefine.relativeLengthField.set(this, 0);
+ } else {
+ fieldDefine.relativeLengthField.set(this, hex.length() / 2);
+ }
+ }
+ catch(IllegalAccessException e)
+ {
+ this.buildException(e.getMessage());
+ }
+ }
+
+ for (FieldDefine fieldDefine:fields)
+ {
+ if(this.disabledFields.contains(fieldDefine.field.getName()))
+ {
+ continue;
+ }
+ Log.i("PlatFormMessage", "2field: "+fieldDefine.field.getName());
+ try {
+ Object obj = fieldDefine.field.get(this);
+ String hex = fieldDefine.coder.encode(obj);
+ if(hex==null)
+ {
+ hex = "";
+ }
+ if (fieldDefine.field.getName().equalsIgnoreCase("phone")){
+ Log.i("PlatFormMessage", "phone toString: "+hex
+ );
+ }
+
+ int defineLen = fieldDefine.getFieldLen();
+ if(hex.length()>defineLen*2&&defineLen>0)
+ {
+ this.buildException("瀛楁"+fieldDefine.field.getName()+"闀垮害瓒呰繃闄愬埗");
+ }
+ if(hex.length()<defineLen*2&&defineLen>0)
+ {
+ if(fieldDefine.length.paddingWay()== Length.PaddingWay.RIGHT)
+ {
+ hex = this.getPaddingRightString(hex,fieldDefine.getFieldLen()*2, BytesUtils.toHexString(fieldDefine.length.paddingByte()));
+ }
+ else
+ {
+ hex = this.getPaddingLeftString(hex,fieldDefine.getFieldLen()*2, BytesUtils.toHexString(fieldDefine.length.paddingByte()));
+ }
+ }
+// System.out.println(hex);
+ sb.append(hex);
+ } catch (IllegalAccessException e) {
+ this.buildException(e.getMessage());
+ }
+ }
+
+ return sb.toString();
+ }
+ String getPaddingLeftString(String str, int total_len,String padding) {
+ while (str.length() < total_len) {
+ str = padding + str;
+ }
+ return str;
+ }
+ String getPaddingRightString(String str, int total_len,String padding) {
+ while (str.length() < total_len) {
+ str = str+padding;
+ }
+ return str;
+ }
+
+ public synchronized FieldDefine[] getFieldDefines()
+ {
+ if(!fieldDefines.containsKey(this.getClass()))
+ {
+ Field[] fields = this.getClass().getFields();
+ List<FieldDefine> fieldDefineList = new ArrayList<>();
+// int sort = 0;
+ List<Class> baseClassList = new ArrayList<>();
+ for (Field field:fields)
+ {
+ if(Modifier.isStatic(field.getModifiers()))
+ continue;
+ if(Modifier.isPrivate(field.getModifiers()))
+ continue;
+
+ if(field.getAnnotation(Order.class)==null)
+ continue;
+
+
+ FieldDefine fieldDefine = new FieldDefine(field);
+ if(fieldDefine.coder!=null) {
+
+ fieldDefineList.add(fieldDefine);
+ if(baseClassList.indexOf(field.getDeclaringClass())<0)
+ {
+ baseClassList.add(field.getDeclaringClass());
+ }
+ }
+ if(fieldDefine.length.lengthField()!=null&&!"".equals(fieldDefine.length.lengthField()))
+ {
+ try {
+ fieldDefine.relativeLengthField = this.getClass().getField(fieldDefine.length.lengthField());
+ } catch (NoSuchFieldException e) {
+ this.buildException(e.getMessage());
+ }
+ }
+
+ }
+ //鎺掑簭鍑哄熀绫�
+ Collections.sort(baseClassList,new Comparator<Class>() {
+ @Override
+ public int compare(Class c1, Class c2) {
+ if(c2.isAssignableFrom(c1))
+ {
+ return 1;
+ }
+ return -1;
+ }
+ });
+
+ //閲嶆柊鎺掑簭
+ int sort = 0;
+ for(Class c:baseClassList)
+ {
+ sort+=100;
+ for(FieldDefine fieldDefine:fieldDefineList)
+ {
+ if(fieldDefine.field.getDeclaringClass().equals(c))//&&fieldDefine.order==0)
+ {
+ if(fieldDefine.order+sort>0) {
+ fieldDefine.order += sort;
+ }
+ }
+ }
+ }
+ Collections.sort(fieldDefineList,new Comparator<FieldDefine>() {
+ @Override
+ public int compare(FieldDefine t0, FieldDefine t1) {
+ int order0 = t0.order;//+(pos0+1);
+ int order1 = t1.order;//+(pos1+1);
+
+
+ if(order0>order1)
+ return 1;
+ if(order0==order1)
+ return 0;
+
+ return -1;
+ }
+ });
+ fieldDefines.put(this.getClass(),fieldDefineList.toArray(new FieldDefine[0]));
+ }
+ FieldDefine[] result = fieldDefines.get(this.getClass());
+ for(FieldDefine fieldDefine:result)
+ {
+ fieldDefine.setFieldLen(0);
+ }
+ return result;
+ }
+
+ class FieldDefine
+ {
+ public FieldDefine(Field field)
+ {
+ Annotation[] annotations = field.getAnnotations();
+ for (Annotation annotation:annotations) {
+ IMessageCoder decoder = AnnotationRegister.getCoder(annotation.annotationType());
+ if(decoder!=null) {
+ decoder.setFieldClass(field.getType());
+ coder = decoder;
+ this.length = annotation.annotationType().getAnnotation(Length.class);
+ break;
+ }
+ }
+ this.field = field;
+ if(this.length==null) {
+ this.length = field.getAnnotation(Length.class);
+ }
+ if(this.length==null)
+ {
+ buildException(field.getName()+"鏈畾涔夐暱搴�");
+ }
+ Order orderAnnotation = field.getAnnotation(Order.class);
+ if(orderAnnotation!=null)
+ {
+ this.order = orderAnnotation.value();
+ }
+
+ FromEnd fromEnd = field.getAnnotation(FromEnd.class);
+ if(fromEnd!=null)
+ {
+ from_end_index = fromEnd.value();
+ }
+
+ }
+ public Field relativeLengthField;
+ public IMessageCoder coder;
+ public Length length;
+ public Field field;
+ public int order;
+ public int from_end_index = -1;
+ private int field_len;
+ public int getFieldLen()
+ {
+ if(this.length.value()>0)
+ return this.length.value();
+ return field_len;
+ }
+
+ public void setFieldLen(int len)
+ {
+ this.field_len = len;
+ }
+
+ @Override
+ public String toString() {
+ return this.field.toString();
+ }
+
+
+ }
+
+ public String getDescription()
+ {
+ return this.toString();
+ }
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/message/ParseException.java b/im_lib/src/main/java/com/safeluck/aykj/message/ParseException.java
new file mode 100644
index 0000000..01460f7
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/message/ParseException.java
@@ -0,0 +1,15 @@
+package com.safeluck.aykj.message;
+
+/**
+ * Created by zhouwei on 2016/12/3.
+ */
+
+public class ParseException extends RuntimeException {
+ public ParseException(String error,BinMessageBase message)
+ {
+ super(error);
+ this.message = message;
+ }
+
+ public BinMessageBase message;
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/utils/ArrayUtils.java b/im_lib/src/main/java/com/safeluck/aykj/utils/ArrayUtils.java
new file mode 100644
index 0000000..2270531
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/utils/ArrayUtils.java
@@ -0,0 +1,15 @@
+package com.safeluck.aykj.utils;
+
+import android.util.Log;
+
+import static com.anyun.im_lib.util.ByteUtil.byte2HexStr;
+
+public class ArrayUtils {
+
+ public static byte[] subArray(byte[] srcBytes, int begin, int length) {
+ byte[] bytes = new byte[length];
+ System.arraycopy(srcBytes,begin,bytes,0,length);
+ Log.i("ArrayUtils", "subArray: "+byte2HexStr(bytes));
+ return bytes;
+ }
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/utils/BitState.java b/im_lib/src/main/java/com/safeluck/aykj/utils/BitState.java
new file mode 100644
index 0000000..e442654
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/utils/BitState.java
@@ -0,0 +1,56 @@
+package com.safeluck.aykj.utils;
+
+
+public class BitState {
+ public BitState(int b)
+ {
+ this.value = b;
+ this.total = 32;
+ }
+ public BitState(byte b)
+ {
+ this.value = b;
+ this.total = 8;
+ }
+ public BitState(short b)
+ {
+ this.value = b;
+ this.total = 16;
+ }
+
+ public int total = 32;
+
+ public int value;
+
+ public boolean get(int bit)
+ {
+ int pos = bit;//32 - bit;
+ return (this.value >> pos & 1) == 1;
+ }
+ public void set(int pos, boolean state)
+ {
+ //11000110
+ int move_pos = pos;// 32 - pos;
+ if (state)
+ {
+ this.value = this.value | 1 << move_pos;
+ }
+ else
+ {
+ this.value = this.value & ~(1 << move_pos);
+ }
+ }
+
+ @Override
+ public String toString()
+ {
+ String str = Integer.toBinaryString(this.value);
+ return getPaddingRightString(str, this.total,"00");
+ }
+ String getPaddingRightString(String str, int total_len,String padding) {
+ while (str.length() < total_len) {
+ str = str+padding;
+ }
+ return str;
+ }
+}
diff --git a/im_lib/src/main/java/com/safeluck/aykj/utils/BytesUtils.java b/im_lib/src/main/java/com/safeluck/aykj/utils/BytesUtils.java
new file mode 100644
index 0000000..d7204b4
--- /dev/null
+++ b/im_lib/src/main/java/com/safeluck/aykj/utils/BytesUtils.java
@@ -0,0 +1,110 @@
+package com.safeluck.aykj.utils;
+
+public final class BytesUtils {
+ public static String bytesToHexString(byte[] src,int len){
+ return bytesToHexString(src,0,len);
+ }
+ public static String bytesToHexString(byte[] src){
+ return bytesToHexString(src,0,src.length);
+ }
+
+ public static String bytesToHexString(byte[] src,int start,int len){
+ StringBuilder stringBuilder = new StringBuilder("");
+ if (src == null || src.length <= 0) {
+ return null;
+ }
+ for (int i = start; i < len; i++) {
+ int v = src[i] & 0xFF;
+ String hv = Integer.toHexString(v);
+ if (hv.length() < 2) {
+ stringBuilder.append(0);
+ }
+ stringBuilder.append(hv);
+ }
+ return stringBuilder.toString().toUpperCase();
+ }
+ public static byte[] hexStringToBytes(String hexString) {
+ if (hexString == null || hexString.equals("")) {
+ return null;
+ }
+ hexString = hexString.toUpperCase();
+ int length = hexString.length() / 2;
+ char[] hexChars = hexString.toCharArray();
+ byte[] d = new byte[length];
+ for (int i = 0; i < length; i++) {
+ int pos = i * 2;
+ d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
+ }
+ return d;
+ }
+ private static byte charToByte(char c) {
+ return (byte) "0123456789ABCDEF".indexOf(c);
+ }
+
+ public static byte xor(byte[] bytes,int start,int end)
+ {
+ if (bytes.length < end)
+ {
+ throw new RuntimeException("璁$畻xor鐨勬椂鍊檚ize涓嶈冻");
+ }
+ int s1 = bytes[start];
+ for (int i = start + 1; i < end; i++)
+ {
+ s1 = s1 ^ bytes[i];
+ }
+ return (byte)s1;
+ }
+
+
+ public static byte xor(byte[] bytes)
+ {
+ return xor(bytes,0,bytes.length);
+ }
+ public static String toHexString(byte b)
+ {
+ String hex = Integer.toHexString(b&0xff).toUpperCase();
+ if(hex.length()==1)
+ {
+ return "0"+hex;
+ }
+ return hex;
+ }
+ public static int sum(byte[] bytes,int start,int end)
+ {
+ if (bytes.length < end)
+ {
+ throw new RuntimeException("璁$畻sum鐨勬椂鍊檚ize涓嶈冻");
+ }
+ int s1 = 0;
+ for (int i = start; i < end; i++)
+ {
+// System.out.println(bytes[i]&0xFF);
+ s1 += (bytes[i]&0xFF);
+// System.out.println("sum="+s1);
+ }
+ return s1;
+
+
+// int sum = 0;
+// for(byte b:bytes)
+// {
+// sum+=b;
+// }
+// return sum;
+ }
+
+ public static int sum(byte[] bytes)
+ {
+ return sum(bytes,0,bytes.length);
+ }
+
+ public static int getInt32(byte[] bytes,int start){
+ int result = 0;
+ int a = (bytes[0+start] & 0xff) << 24;
+ int b = (bytes[1+start] & 0xff) << 16;
+ int c = (bytes[2+start] & 0xff) << 8;
+ int d = (bytes[3+start] & 0xff);
+ result = a | b | c | d;
+ return result;
+ }
+}
--
Gitblit v1.8.0