app/src/main/java/safeluck/drive/evaluation/fragment/TcpFragment.java
@@ -27,6 +27,7 @@ import safeluck.drive.evaluation.im.MessageProcessor; import safeluck.drive.evaluation.platformMessage.GainStuMessage; import safeluck.drive.evaluation.platformMessage.JKClientCommonMessage; import safeluck.drive.evaluation.platformMessage.JKMessage0101; import safeluck.drive.evaluation.platformMessage.JKRegisterMessage; import safeluck.drive.evaluation.platformMessage.RegisterMessage; import safeluck.drive.evaluation.im.IMSClientBootstrap; @@ -74,6 +75,13 @@ btn_connect = view.findViewById(R.id.btn_connect); btn_send = view.findViewById(R.id.btn_send); view.findViewById(R.id.btn_register).setOnClickListener(this); view.findViewById(R.id.btn_auth).setOnClickListener(this); view.findViewById(R.id.btn_gain).setOnClickListener(this); view.findViewById(R.id.btn_start_exam).setOnClickListener(this); view.findViewById(R.id.btn_stop_exam).setOnClickListener(this); view.findViewById(R.id.btn_fail).setOnClickListener(this); view.findViewById(R.id.btn_gps).setOnClickListener(this); btn_send.setOnClickListener(this); btn_connect.setOnClickListener(this); @@ -146,9 +154,39 @@ 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; case R.id.btn_register: JKRegisterMessage jkRegisterMessage = new JKRegisterMessage(); jkRegisterMessage.setMessageLen(55); // jkRegisterMessage.phone = "13021245"; jkRegisterMessage.phone = "0008618513021245"; jkRegisterMessage.proviceid = 23; jkRegisterMessage.messageId = 0x100; @@ -162,18 +200,20 @@ 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; case R.id.btn_auth: JKMessage0101 jkMessage0101 = new JKMessage0101(); // jkMessage0101.des = break; case R.id.btn_gain: break; case R.id.btn_start_exam: break; case R.id.btn_fail: break; case R.id.btn_gps: break; case R.id.btn_stop_exam: break; } } app/src/main/java/safeluck/drive/evaluation/platformMessage/AttachInfo.java
New file @@ -0,0 +1,20 @@ package safeluck.drive.evaluation.platformMessage; import com.safeluck.aykj.annotation.Hex; import com.safeluck.aykj.annotation.Int8; import com.safeluck.aykj.annotation.Length; import com.safeluck.aykj.annotation.Order; import com.safeluck.aykj.message.BinMessageBase; public class AttachInfo extends BinMessageBase { @Order(1) @Int8 public int attach_id; @Order(2) @Int8 public int attach_length; @Order(3) @Length(lengthField="attach_length") @Hex public String attach_data; } app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage0002.java
New file @@ -0,0 +1,15 @@ package safeluck.drive.evaluation.platformMessage; import com.safeluck.aykj.annotation.Hex; import com.safeluck.aykj.annotation.Int32; import com.safeluck.aykj.annotation.Length; import com.safeluck.aykj.annotation.Order; public class JKMessage0002 extends JK2019MessageBase { /** * 消息ID:0x0002。 * 客户端在没有正常业务消息的情况下应按照参数设置的时间间隔定期向服务器端发送心跳消息以维持链路的连接, * 客户端心跳消息体数据为空。 */ } app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage0101.java
New file @@ -0,0 +1,30 @@ package safeluck.drive.evaluation.platformMessage; import com.safeluck.aykj.annotation.*; public class JKMessage0101 extends JK2019MessageBase { @Order(1) @Int32 public int timestamp; @Order(2) @Length(8) @Hex public String des; /**** *消息ID:0x0101 * 终端使用此消息日常登录到平台,平台回复服务器通用应答。 * 0 * 时间戳 * DWORD * 从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数 * * * * * 密文段 * BYTE[8] * 用注册获取的DES密码,对上面的时间戳加密 */ } app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage0201.java
New file @@ -0,0 +1,18 @@ package safeluck.drive.evaluation.platformMessage; import androidx.annotation.IntegerRes; import com.safeluck.aykj.annotation.Ascii; import com.safeluck.aykj.annotation.Int8; import com.safeluck.aykj.annotation.Length; import com.safeluck.aykj.annotation.Order; public class JKMessage0201 extends JK2019MessageBase { @Order(1) @Length(16) @Ascii public String id; @Order(2) @Int8 public int currentExam; } app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage0202.java
New file @@ -0,0 +1,41 @@ package safeluck.drive.evaluation.platformMessage; import com.safeluck.aykj.annotation.*; import java.util.Date; public class JKMessage0202 extends JK2019MessageBase { @Order(1) @Length(18) @Ascii public String ID; @Order(2) @BcdDateTime public Date timeBCD; @Order(3) @Int32 public int exam_id; @Order(4) @Int8 public int curr_exam; /** * 身份证号码 * BYTE[18] * 身份证号码 * * 考试开始时间 * BCD[6] * YYMMDDhhmmss * * 考试ID * DWORD * 唯一考试ID标志 * * * 考试科目 * BYTE * 0-场考,1-路考 */ } app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage0203.java
New file @@ -0,0 +1,63 @@ package safeluck.drive.evaluation.platformMessage; import com.safeluck.aykj.annotation.Ascii; import com.safeluck.aykj.annotation.BcdDateTime; import com.safeluck.aykj.annotation.Int32; import com.safeluck.aykj.annotation.Int8; import com.safeluck.aykj.annotation.Length; import com.safeluck.aykj.annotation.Order; import java.util.Date; public class JKMessage0203 extends JK2019MessageBase { @Order(1) @Length(18) @Ascii public String ID; @Order(2) @BcdDateTime public Date timeBCD; @Order(3) @Int32 public int exam_id; @Order(4) @Int8 public int fail_item_id; @Order(5) @Int8 public int fail_score; //TODO @Order(6) @Length(0) @Ascii public String fail_reason; /** * 身份证号码 * BYTE[18] * 身份证号码 * * 时间 * BCD[6] * YYMMDDhhmmss * * 考试ID * DWORD * 唯一考试ID标志 * * 扣分项目 * BYTE * 扣分项目编号 * * * 扣分分数 * BYTE * 扣分分数(0-100) * * * 扣分原因 * STRING * 最大254byte */ } app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage0204.java
New file @@ -0,0 +1,58 @@ package safeluck.drive.evaluation.platformMessage; import com.safeluck.aykj.annotation.Ascii; import com.safeluck.aykj.annotation.BcdDateTime; import com.safeluck.aykj.annotation.Int32; import com.safeluck.aykj.annotation.Int8; import com.safeluck.aykj.annotation.Length; import com.safeluck.aykj.annotation.Order; import java.util.Date; public class JKMessage0204 extends JK2019MessageBase { public static final int SUCC_STOP = 0; public static final int JUDGE_UNFAIR = 1; public static final int TERMIAL_STOP = 2; @Order(1) @Length(18) @Ascii public String ID; @Order(2) @BcdDateTime public Date timeBCD; @Order(3) @Int32 public int exam_id; @Order(4) @Int8 public int score; @Order(5) @Int8 public int stop; /** * 身份证号码 * BYTE[18] * 身份证号码 * 考试结束时间 * BCD[6] * YYMMDDhhmmss * 考试ID * DWORD * 唯一考试ID标志 * 考试分数 * BYTE * 扣分分数(0-100) * * * 结束原因 * BYTE * 0--考试完成结束 * 1--综合评判不合格,终端自动结束考试 * 2--终端主动操作结束 */ } app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage0206.java
New file @@ -0,0 +1,90 @@ package safeluck.drive.evaluation.platformMessage; import com.safeluck.aykj.annotation.*; import safeluck.drive.evaluation.platformMessage.decoder.JWD; public class JKMessage0206 extends JK2019MessageBase { @Order(1) @Int32 public int alert; @Order(2) @Int32 public int status; @Order(3) @JWD public double wd;//纬度 @Order(4) @JWD public double jd;//经度 @Order(5) @Int16 public int gaoCheng; @Order(6) @Int16 public int speed; @Order(7) @Int16 public int fangXiang; @Order(8) @Hex public String timeBCD; @Order(9) @Int8 public int rf; @Order(10) @Int8 public int length; @Order(11) @Length(lengthField = "length") @UTF8 public String json; @Order(12) @Message public AttachInfo attachInfo; /** * 报警 * DWORD * 保留,暂未定义 * * 状态 * DWORD * 保留,暂未定义 * * 纬度 * DWORD * 以度为单位的纬度值乘以10的6次方,精确到百万分之一度 * * 经度 * DWORD * 以度为单位的纬度值乘以10的6次方,精确到百万分之一度 * * 高程 * WORD * 海报高度,米 * * 速度 * WORD * 卫星定位速度,1/10km/h * * 方向 * WORD * 0-359,正北为0,顺时针 * * 时间 * BCD[8] * YY-MM-DD-hh-mm-ss-ff(北京时间) * * 解状态 * BYTE * 0-无效解,1-单点定位解;2-伪距差分;3-固定解,4-浮动解 * * 长度 * WORD * 地理坐标数据段长度 */ } app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage8001.java
New file @@ -0,0 +1,25 @@ 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 JKMessage8001 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; } app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage8100.java
New file @@ -0,0 +1,26 @@ package safeluck.drive.evaluation.platformMessage; import com.safeluck.aykj.annotation.*; public class JKMessage8100 extends JK2019MessageBase { public static int SUCCESS=0; public static int FAIL=1; @Order(1) @Int16 public int resp_no; @Order(2) @Int8 public int result; //只有在成功时 result ==0 才返回以下内容 TODO Length8 这个字节有可能不存在 @Order(3) @Length(8) @Hex public String des; } app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage8201.java
New file @@ -0,0 +1,23 @@ package safeluck.drive.evaluation.platformMessage; import com.safeluck.aykj.annotation.*; public class JKMessage8201 extends JK2019MessageBase { @Order(1) @Int8 public int result; @Order(2) @Length(18) @Ascii public String ID;//身份证号码 @Order(3) @Length(20) @Ascii public String name; //TODO Length(0) 表示什么意思 @Order(4) @Length(0) @Ascii public String url; } app/src/main/java/safeluck/drive/evaluation/platformMessage/utils/MessageManager.java
@@ -1,63 +1,34 @@ //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); // } // } //} 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; public final class MessageManager { public static JK2019MessageBase get(String cmd) { String head = cmd.substring(4,8); String classname = "safeluck.drive.evaluation.platformMessage.JKMessage"+head; Class c = null; try { c = Class.forName(classname); } catch (ClassNotFoundException e) { } try { JK2019MessageBase ret = (JK2019MessageBase)c.newInstance(); ret.parse(cmd); return ret; } catch (InstantiationException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } } app/src/main/res/layout/layout_tcpclient.xml
@@ -50,7 +50,63 @@ <androidx.appcompat.widget.AppCompatEditText android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone" android:id="@+id/sendtxt"/> <TableLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <TableRow> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="10dp" android:id="@+id/btn_register" android:text="注册"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="10dp" android:id="@+id/btn_auth" android:text="鉴权"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="10dp" android:id="@+id/btn_gain" android:text="获取信息"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="10dp" android:id="@+id/btn_start_exam" android:text="开始考试"/> </TableRow> <TableRow> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="10dp" android:id="@+id/btn_fail" android:text="扣分项目"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="10dp" android:id="@+id/btn_gps" android:text="位置上报"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="10dp" android:id="@+id/btn_stop_exam" android:text="结束考试"/> </TableRow> </TableLayout> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" @@ -62,6 +118,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/darker_gray" android:visibility="gone" android:textSize="19sp" android:id="@+id/content" android:text="flskajf"/>