lizhanwei
2020-02-18 ead127e532a8baf80955a6d479f5173aa2b01b8a
所有消息完整定义;修改MessageManager通过反射新建服务器消息对象
3个文件已修改
11个文件已添加
629 ■■■■ 已修改文件
app/src/main/java/safeluck/drive/evaluation/fragment/TcpFragment.java 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/platformMessage/AttachInfo.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage0002.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage0101.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage0201.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage0202.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage0203.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage0204.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage0206.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage8001.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage8100.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage8201.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/platformMessage/utils/MessageManager.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/layout_tcpclient.xml 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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"/>