ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

GK309协议电子工牌数据模拟器+Socket数据发送 JAVA版-源码

2021-06-05 11:59:31  阅读:131  来源: 互联网

标签:JAVA Socket return add 源码 static new Font String


GK309协议电子工牌数据模拟器+Socket数据发送 JAVA版-源码

说明

单JAVA文件,直接运行main方法即可。
只做了GK309的基础位置数据模拟:

  • 0x01 登录信息
  • 0x10 一般位置
  • 0x16 SOS报警
  • 0xB0 上下班打卡

以及Socket数据发送功能,方便开发测试。需要模拟其他数据,请自行改源码添加,下文附送源码。

在这里插入图片描述

在这里插入图片描述

源码


import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

public class GK309 {
    private static final SimpleDateFormat SDF = new SimpleDateFormat("yy-MM-dd-HH-mm-ss");

    public static double pi = 3.1415926535897932384626;
    public static double a = 6378245.0;
    public static double ee = 0.00669342162296594323;

    private static final String REGX = "[0-9]{2}-[0-9]{2}-[0-9]{2}-[0-9]{2}-[0-9]{2}-[0-9]{2}";
    private static final String REGIP = "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}";

    private static int SERNUM = 0;

    private static Socket SOCKET = null;


    public static void getSocket(String ip,Integer port){
        try {
            SOCKET = new Socket(ip,port);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * SOCKET发送数据
     * @param data 数据
     * @param isHex 是否是16进制数据
     */
    public static void sendInfo(String data, boolean isHex){
        try {
            OutputStream out = SOCKET.getOutputStream();
            if (isHex){
                byte[] bytes = hexStrToByteArray(data);
                out.write(bytes);
                out.flush();
            }else {
                out.write(data.getBytes());
                out.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


    /** SOCKET接收数据 */
    public static String getSocketInfo(){
        String res = null;
        try {
            InputStream in = SOCKET.getInputStream();
            byte[] b = new byte[8096];
            int len = in.read(b);
            //res =  new String(b);
            res =  byte2Hex(b,len).toUpperCase();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return res;
    }

    /** 判断连接是否断开 */
    public static Boolean isServerClose(){
        try{
            SOCKET.sendUrgentData(0xFF);//发送1个字节的紧急数据,默认情况下,服务器端没有开启紧急数据处理,不影响正常通信
            return false;
        }catch(Exception se){
            return true;
        }
    }

    /** 将byte转为16进制 */
    private static String byte2Hex(byte[] bytes,int len) {
        StringBuilder stringBuffer = new StringBuilder();
        String temp = null;
        for (int i = 0; i < len; i++) {
            temp = Integer.toHexString(bytes[i] & 0xFF);
            if (temp.length() == 1) {
                // 1得到一位的进行补0操作
                stringBuffer.append("0");
            }
            stringBuffer.append(temp);
        }
        return stringBuffer.toString();
    }

    /** 判空 */
    public static boolean isEmpty(String str){
        if (str == null || "".equals(str.trim())) return true;
        return false;
    }

    /** 十六进制转字节 */
    public static byte[] hexStrToByteArray(String hex) {
        int len = hex.length();
        byte[] b = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            // 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个字节
            b[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4) + Character
                    .digit(hex.charAt(i + 1), 16));
        }
        return b;
    }

    /**
     * 火星坐标系(GCJ-02)转GPS84字符串(lng,lat)
     * */
    public static String[] gcj02To84Str(String Gcj02Lng,String Gcj02Lat) {
        double lon = Double.parseDouble(Gcj02Lng);
        double lat = Double.parseDouble(Gcj02Lat);
        double[] gps = transform(lat, lon);
        double lng0 = lon * 2 - gps[1];
        double lat0 = lat * 2 - gps[0];
        return new String[] {""+lng0,""+lat0};
    }

    public static double[] transform(double lat, double lon) {
        if (outOfChina(lat, lon)) {
            return new double[] { lat, lon };
        }
        double dLat = transformLat(lon - 105.0, lat - 35.0);
        double dLon = transformLon(lon - 105.0, lat - 35.0);
        double radLat = lat / 180.0 * pi;
        double magic = Math.sin(radLat);
        magic = 1 - ee * magic * magic;
        double sqrtMagic = Math.sqrt(magic);
        dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
        dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
        double mgLat = lat + dLat;
        double mgLon = lon + dLon;
        return new double[] { mgLat, mgLon };
    }

    public static double transformLat(double x, double y) {
        double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y
                + 0.2 * Math.sqrt(Math.abs(x));
        ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;
        ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;
        return ret;
    }

    public static double transformLon(double x, double y) {
        double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1
                * Math.sqrt(Math.abs(x));
        ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;
        ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0
                * pi)) * 2.0 / 3.0;
        return ret;
    }

    /** 是否在国外 */
    public static boolean outOfChina(double lat, double lon) {
        if (lon < 72.004 || lon > 137.8347)
            return true;
        if (lat < 0.8293 || lat > 55.8271)
            return true;
        return false;
    }



    private static String checkLengthTo2(String s) {
        if (s.length() == 1) {
            s = "0" + s;
        }
        return s.toUpperCase();
    }
    private static String checkLengthTo4(String s) {
        if (s.length() == 1) {
            s = "000" + s;
        } else if (s.length() == 2) {
            s = "00" + s;
        } else if (s.length() == 3) {
            s = "0" + s;
        }
        return s;
    }
    /** 将字符串长度补足8位 */
    private static String checkLengthTo8(String s) {
        while (s.length() < 8) {
            s = "0" + s;
        }
        return s;
    }

    /** 将字符串长度补足16位 */
    private static String checkLengthTo16(String s) {
        while (s.length() < 16) {
            s = "0" + s;
        }
        return s;
    }


    static char crctab16[] ={
            0X0000, 0X1189, 0X2312, 0X329B, 0X4624, 0X57AD, 0X6536, 0X74BF,
            0X8C48, 0X9DC1, 0XAF5A, 0XBED3, 0XCA6C, 0XDBE5, 0XE97E, 0XF8F7,
            0X1081, 0X0108, 0X3393, 0X221A, 0X56A5, 0X472C, 0X75B7, 0X643E,
            0X9CC9, 0X8D40, 0XBFDB, 0XAE52, 0XDAED, 0XCB64, 0XF9FF, 0XE876,
            0X2102, 0X308B, 0X0210, 0X1399, 0X6726, 0X76AF, 0X4434, 0X55BD,
            0XAD4A, 0XBCC3, 0X8E58, 0X9FD1, 0XEB6E, 0XFAE7, 0XC87C, 0XD9F5,
            0X3183, 0X200A, 0X1291, 0X0318, 0X77A7, 0X662E, 0X54B5, 0X453C,
            0XBDCB, 0XAC42, 0X9ED9, 0X8F50, 0XFBEF, 0XEA66, 0XD8FD, 0XC974,
            0X4204, 0X538D, 0X6116, 0X709F, 0X0420, 0X15A9, 0X2732, 0X36BB,
            0XCE4C, 0XDFC5, 0XED5E, 0XFCD7, 0X8868, 0X99E1, 0XAB7A, 0XBAF3,
            0X5285, 0X430C, 0X7197, 0X601E, 0X14A1, 0X0528, 0X37B3, 0X263A,
            0XDECD, 0XCF44, 0XFDDF, 0XEC56, 0X98E9, 0X8960, 0XBBFB, 0XAA72,
            0X6306, 0X728F, 0X4014, 0X519D, 0X2522, 0X34AB, 0X0630, 0X17B9,
            0XEF4E, 0XFEC7, 0XCC5C, 0XDDD5, 0XA96A, 0XB8E3, 0X8A78, 0X9BF1,
            0X7387, 0X620E, 0X5095, 0X411C, 0X35A3, 0X242A, 0X16B1, 0X0738,
            0XFFCF, 0XEE46, 0XDCDD, 0XCD54, 0XB9EB, 0XA862, 0X9AF9, 0X8B70,
            0X8408, 0X9581, 0XA71A, 0XB693, 0XC22C, 0XD3A5, 0XE13E, 0XF0B7,
            0X0840, 0X19C9, 0X2B52, 0X3ADB, 0X4E64, 0X5FED, 0X6D76, 0X7CFF,
            0X9489, 0X8500, 0XB79B, 0XA612, 0XD2AD, 0XC324, 0XF1BF, 0XE036,
            0X18C1, 0X0948, 0X3BD3, 0X2A5A, 0X5EE5, 0X4F6C, 0X7DF7, 0X6C7E,
            0XA50A, 0XB483, 0X8618, 0X9791, 0XE32E, 0XF2A7, 0XC03C, 0XD1B5,
            0X2942, 0X38CB, 0X0A50, 0X1BD9, 0X6F66, 0X7EEF, 0X4C74, 0X5DFD,
            0XB58B, 0XA402, 0X9699, 0X8710, 0XF3AF, 0XE226, 0XD0BD, 0XC134,
            0X39C3, 0X284A, 0X1AD1, 0X0B58, 0X7FE7, 0X6E6E, 0X5CF5, 0X4D7C,
            0XC60C, 0XD785, 0XE51E, 0XF497, 0X8028, 0X91A1, 0XA33A, 0XB2B3,
            0X4A44, 0X5BCD, 0X6956, 0X78DF, 0X0C60, 0X1DE9, 0X2F72, 0X3EFB,
            0XD68D, 0XC704, 0XF59F, 0XE416, 0X90A9, 0X8120, 0XB3BB, 0XA232,
            0X5AC5, 0X4B4C, 0X79D7, 0X685E, 0X1CE1, 0X0D68, 0X3FF3, 0X2E7A,
            0XE70E, 0XF687, 0XC41C, 0XD595, 0XA12A, 0XB0A3, 0X8238, 0X93B1,
            0X6B46, 0X7ACF, 0X4854, 0X59DD, 0X2D62, 0X3CEB, 0X0E70, 0X1FF9,
            0XF78F, 0XE606, 0XD49D, 0XC514, 0XB1AB, 0XA022, 0X92B9, 0X8330,
            0X7BC7, 0X6A4E, 0X58D5, 0X495C, 0X3DE3, 0X2C6A, 0X1EF1, 0X0F78,
    };


    /** 十进制数转十六进制数 */
    public static String intToHex(int n) {
        StringBuffer s = new StringBuffer();
        String a;
        char[] b = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
        while (n != 0) {
            s = s.append(b[n % 16]);
            n = n / 16;
        }
        a = s.reverse().toString();
        return a;
    }

    /** 计算给定长度数据的 16 位 CRC */
    public static int getCrc16(byte[] pData, int nLength){
        int i=0;
        int fcs = 0xffff; // 初始化
        while(nLength>0){
            fcs = (fcs >> 8) ^ crctab16[(fcs ^ pData[i]) & 0xff];
            nLength--;
            i++;
        }
        int result = (~fcs & 0xffff);
        return result;
    }

    /** string 转byte[] {0x11,0x12} */
    public static byte[] hexString2Bytes(String s) {
        byte[] bytes;
        bytes = new byte[s.length() / 2];
        for (int i = 0; i < bytes.length; i++) {
            //十六进制转为十进制
            bytes[i] = (byte) Integer.parseInt(s.substring(2 * i, 2 * i + 2),16);
        }
        return bytes;
    }


    /** GK309获取校验码 */
    public static String getCrcCode(String str){
        byte[] data = hexString2Bytes(str);
        int crc16 = getCrc16(data, data.length);
        String res = intToHex(crc16);
        while (res.length() < 4){
            res = "0" + res;
        }
        return res;
    }

    /**
     * 获取校验码并整合内容
     */
    private static String concatMsg(String content) {
        // 获取校验码
        String code = getCrcCode(content);
        String msg = "7878" + content + code + "0D0A";
        return msg;
    }

    /** 转换GPS时间 */
    public static String covGpsTime(String time){
        StringBuilder res = new StringBuilder("");
        String[] split = time.split("-");
        for (String s : split) {
            String s1 = checkLengthTo2(intToHex(Integer.parseInt(s)));
            res.append(s1);
        }
        return res.toString();
    }

    /**
     * 加法运算保留6位小数
     */
    public static double addValue6(double num1,double num2){
        BigDecimal one = new BigDecimal(num1);
        BigDecimal two = new BigDecimal(num2);
        BigDecimal add = one.add(two);
        double doubleValue = add.setScale(6, BigDecimal.ROUND_HALF_UP).doubleValue();
        return doubleValue;
    }

    /**
     * 乘法法运算保留整数
     */
    public static int getIntValue(double num1,double num2){
        BigDecimal one = new BigDecimal(num1);
        BigDecimal two = new BigDecimal(num2);
        BigDecimal divide = one.multiply(two);
        int intValue = divide.setScale(0, BigDecimal.ROUND_HALF_UP).intValue();
        return intValue;
    }

    /** 转换坐标 */
    public static String covCoor(String coo){
        String[] split = coo.split("\\.");
        int z = Integer.parseInt(split[0]);
        double x = Double.parseDouble("0." + split[1]) * 60;
        double v = addValue6(z * 60, x);
        int intValue = getIntValue(v, 30000);
        String s = intToHex(intValue);
        return checkLengthTo8(s);
    }


    /**
     * 创建登录信息
     * @param deviceId IMEI号
     * @param type 类型识别码(例:GK301 LBS 版本)
     */
    public static String makeLoginInfo(String deviceId, String type){

        String len = "0F";//长度=协议号+信息内容+信息序列号+错误校验
        String agr = "01";//协议号 01登录信息
        String imei = checkLengthTo16(deviceId);
        SERNUM++;
        String seNum = checkLengthTo4(intToHex((SERNUM)));//流水号
        String content = len+agr+imei+type+seNum;
        String res = concatMsg(content);

        return res;
    }


    /** 生成位置信息 */
    public static String makePosInfo(String gpsTime,String lng0,String lat0,String speed0,int dir){

        String len = "19";//长度=协议号+信息内容+信息序列号+错误校验
        String agr = "10";//协议号 10一般位置
        String time = covGpsTime(gpsTime);
        String lat = covCoor(lat0);
        String lng = covCoor(lng0);
        String speed = checkLengthTo2(intToHex(Integer.parseInt(speed0)));
        //String sta = "1400";//状态
        int a = dir / 256;
        int b = dir % 256;
        String s1 = "000101"+checkLengthTo2(Integer.toBinaryString(a));
        Integer i1 = Integer.valueOf(s1, 2);
        String sa = checkLengthTo2(Integer.toHexString(i1));
        String s2 = checkLengthTo2(Integer.toHexString(b));
        String sta = sa+s2;

        SERNUM++;
        String seNum = checkLengthTo4(intToHex((SERNUM)));//流水号
        String content = len+agr+time+"C5"+lat+lng+speed+sta+"0001"+seNum;
        String res = concatMsg(content);

        return res;
    }


    /** 生成SOS信息 */
    public static String makeSosInfo(String gpsTime,String lng0,String lat0,String speed0,int dir){

        String len = "25";//长度=协议号+信息内容+信息序列号+错误校验
        String agr = "16";//协议号 16报警
        String time = covGpsTime(gpsTime);
        String lat = covCoor(lat0);
        String lng = covCoor(lng0);
        String speed = checkLengthTo2(intToHex(Integer.parseInt(speed0)));
        //String sta = "1400";//状态
        int a = dir / 256;
        int b = dir % 256;
        String s1 = "000101"+checkLengthTo2(Integer.toBinaryString(a));
        Integer i1 = Integer.valueOf(s1, 2);
        String sa = checkLengthTo2(Integer.toHexString(i1));
        String s2 = checkLengthTo2(Integer.toHexString(b));
        String sta = sa+s2;

        String lbs = "0901CC002866000EEE";//LBS(假数据)
        String sos = "01"+"1000"+"00";//中间1000表示SOS
        String sosHex = Integer.toHexString(Integer.valueOf(sos, 2));
        String sk = sosHex+"0604";//状态
        String kz = "0001";//扩展

        SERNUM++;
        String seNum = checkLengthTo4(intToHex((SERNUM)));//流水号

        String content = len+agr+time+"C5"+lat+lng+speed+sta+lbs+sk+kz+seNum;
        String res = concatMsg(content);

        return res;
    }


    /**
     * 生成上下班打卡信息
     * type 1上班 2下班
     */
    public static String makeClockInfo(String gpsTime,String lng0,String lat0,String speed0,int dir,int type){

        String len = "86";//长度=协议号+信息内容+信息序列号+错误校验
        String agr = "B0";//协议号 16报警
        String time = covGpsTime(gpsTime);
        String pos = "01";//定位
        String lat = covCoor(lat0);
        String lng = covCoor(lng0);
        String speed = checkLengthTo2(intToHex(Integer.parseInt(speed0)));
        //String sta = "1400";//状态
        int a = dir / 256;
        int b = dir % 256;
        String s1 = "000101"+checkLengthTo2(Integer.toBinaryString(a));
        Integer i1 = Integer.valueOf(s1, 2);
        String sa = checkLengthTo2(Integer.toHexString(i1));
        String s2 = checkLengthTo2(Integer.toHexString(b));
        String sta = sa+s2;

        String clock = null;//0001:上班打卡 0010:下班打卡
        if (type == 1){
            clock = "01"+"0001"+"00";
        }else {
            clock = "01"+"0010"+"00";
        }
        String clockHex = Integer.toHexString(Integer.valueOf(clock, 2));
        String sk = clockHex+"0604";//状态
        String kz = "0001";//扩展
        String ot = "01CC002502002A59310000000000000000000000000000000000000000000000000000000000000000000000000000000000"+
                "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";//其他

        SERNUM++;
        String seNum = checkLengthTo4(intToHex((SERNUM)));//流水号

        String content = len+agr+time+pos+"D702"+"C5"+lat+lng+speed+sta+sk+kz+ot+seNum;
        String res = concatMsg(content);

        return res;
    }


    /** 面板内容 */
    private static void placeComponents(JPanel panel) {

        /* 布局部分我们这边不多做介绍
         * 这边设置布局为 null
         */
        panel.setLayout(null);

        // 设备ID标题
        JLabel deviceLab = new JLabel("设备ID:");
        /* 这个方法定义了组件的位置。
         * setBounds(x, y, width, height)
         * x 和 y 指定左上角的新位置,由 width 和 height 指定新的大小。
         */
        deviceLab.setBounds(10,20,200,28);
        deviceLab.setFont(new Font("微软雅黑", Font.PLAIN,18));
        panel.add(deviceLab);

        // 输入设备ID
        final JTextField deviceStr = new JTextField(20);
        deviceStr.setBounds(100,20,200,28);
        deviceStr.setText("121212121212121");
        deviceStr.setFont(new Font("微软雅黑", Font.PLAIN,16));
        panel.add(deviceStr);

        // 类型识别码
        JLabel typeTitle = new JLabel("识别码:");
        typeTitle.setBounds(340,20,100,28);
        typeTitle.setFont(new Font("微软雅黑", Font.PLAIN,18));
        panel.add(typeTitle);

        // 类型识别码
        final JTextField devType = new JTextField(20);
        devType.setBounds(430,20,100,28);
        devType.setText("1004");
        devType.setFont(new Font("微软雅黑", Font.PLAIN,16));
        panel.add(devType);


        // GPS时间标题
        JLabel gpsLab = new JLabel("GPS时间:");
        gpsLab.setBounds(10,60,200,28);
        gpsLab.setFont(new Font("微软雅黑", Font.PLAIN,18));
        panel.add(gpsLab);

        // 输入GPS时间
        final JTextField gpsStr = new JTextField(20);
        gpsStr.setBounds(100,60,230,28);
        gpsStr.setText(SDF.format(new Date()));
        gpsStr.setFont(new Font("微软雅黑", Font.PLAIN,16));
        panel.add(gpsStr);

        // 刷新
        JButton fluButton = new JButton("f");
        fluButton.setBounds(360, 60, 40, 28);
        fluButton.setFont(new Font("微软雅黑", Font.BOLD,16));
        fluButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                gpsStr.setText(SDF.format(new Date()));
            }
        });
        panel.add(fluButton);


        // 单选:SOS求救
        JRadioButton jr1 = new JRadioButton("SOS求救报警");
        jr1.setBounds(430,60,140,28);
        jr1.setFont(new Font("微软雅黑", Font.BOLD,16));
        jr1.setForeground(Color.red);
        JRadioButton jr2 = new JRadioButton("上班打卡");
        jr2.setBounds(430,100,140,28);
        jr2.setFont(new Font("微软雅黑", Font.BOLD,16));
        jr2.setForeground(Color.MAGENTA);
        JRadioButton jr3 = new JRadioButton("下班打卡");
        jr3.setBounds(430,140,140,28);
        jr3.setFont(new Font("微软雅黑", Font.BOLD,16));
        jr3.setForeground(Color.BLUE);
        JRadioButton jr4 = new JRadioButton("基本位置信息");
        jr4.setBounds(430,180,140,28);
        jr4.setFont(new Font("微软雅黑", Font.BOLD,16));
        jr4.setSelected(true);
        ButtonGroup btg = new ButtonGroup();
        btg.add(jr1);
        btg.add(jr2);
        btg.add(jr3);
        btg.add(jr4);
        panel.add(jr1);
        panel.add(jr2);
        panel.add(jr3);
        panel.add(jr4);


        // 经度标题
        JLabel lngLab = new JLabel("经度:");
        lngLab.setBounds(10,100,200,28);
        lngLab.setFont(new Font("微软雅黑", Font.PLAIN,18));
        panel.add(lngLab);

        // 输入经度
        final JTextField lngStr = new JTextField(20);
        lngStr.setBounds(100,100,300,28);
        lngStr.setText("113.334991");
        lngStr.setFont(new Font("微软雅黑", Font.PLAIN,16));
        panel.add(lngStr);


        // 纬度标题
        JLabel latLab = new JLabel("纬度:");
        latLab.setBounds(10,140,200,28);
        latLab.setFont(new Font("微软雅黑", Font.PLAIN,18));
        panel.add(latLab);

        // 输入纬度
        final JTextField latStr = new JTextField(20);
        latStr.setBounds(100,140,300,28);
        latStr.setText("23.132905");
        latStr.setFont(new Font("微软雅黑", Font.PLAIN,16));
        panel.add(latStr);


        // 速度标题
        JLabel speedLab = new JLabel("速度:");
        speedLab.setBounds(10,180,200,28);
        speedLab.setFont(new Font("微软雅黑", Font.PLAIN,18));
        panel.add(speedLab);

        // 输入速度
        final JTextField speedStr = new JTextField(20);
        speedStr.setBounds(100,180,100,28);
        speedStr.setText("10");
        speedStr.setFont(new Font("微软雅黑", Font.PLAIN,16));
        panel.add(speedStr);


        // 方向标题
        JLabel dirLab = new JLabel("方向:");
        dirLab.setBounds(230,180,100,28);
        dirLab.setFont(new Font("微软雅黑", Font.PLAIN,18));
        panel.add(dirLab);

        // 输入方向
        final JTextField dirStr = new JTextField(20);
        dirStr.setBounds(300,180,100,28);
        dirStr.setText("90");
        dirStr.setFont(new Font("微软雅黑", Font.PLAIN,16));
        panel.add(dirStr);



        /* 输出结果 */
        final JTextArea  resStr = new JTextArea();
        resStr.setBounds(10,280,585,100);
        resStr.setFont(new Font("微软雅黑", Font.PLAIN,16));
        resStr.setLineWrap(true);//激活自动换行功能
        resStr.setWrapStyleWord(true);//激活断行不断字功能
        panel.add(resStr);


        // GCJ02转换84坐标
        JLabel coorCheck = new JLabel("GCJ02转换84坐标");
        coorCheck.setBounds(10,230,140,28);
        coorCheck.setFont(new Font("微软雅黑", Font.PLAIN,16));
        coorCheck.setForeground(Color.red);
        panel.add(coorCheck);

        final JCheckBox coorbox = new JCheckBox();
        coorbox.setBounds(145,230,30,30);
        coorbox.setSize(30,30);
        panel.add(coorbox);


        // 生成登录信息
        JButton covButton = new JButton("登录信息");
        covButton.setBounds(330, 230, 115, 30);
        covButton.setFont(new Font("微软雅黑", Font.BOLD,20));
        covButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String imei = deviceStr.getText();
                if (isEmpty(imei)) {
                    JOptionPane.showMessageDialog(null, "设备号不能为空", "错误", JOptionPane.ERROR_MESSAGE);
                    return;
                }

                String type = devType.getText();
                if (isEmpty(type)) {
                    JOptionPane.showMessageDialog(null, "类型识别码(4位)不能为空", "错误", JOptionPane.ERROR_MESSAGE);
                    return;
                }

                String res = makeLoginInfo(imei,type);
                resStr.setText(res);
            }
        });
        panel.add(covButton);


        // 生成位置信息
        JButton createButton = new JButton("位置信息");
        createButton.setBounds(465, 230, 115, 30);
        createButton.setFont(new Font("微软雅黑", Font.BOLD,20));
        createButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String gpsTime = gpsStr.getText();
                if (isEmpty(gpsTime)) {
                    JOptionPane.showMessageDialog(null, "GPS时间不能为空", "错误", JOptionPane.ERROR_MESSAGE);
                    return;
                }
                if (!gpsTime.matches(REGX)) {
                    JOptionPane.showMessageDialog(null, "GPS时间格式错误", "错误", JOptionPane.ERROR_MESSAGE);
                    return;
                }

                String lng = lngStr.getText();
                if (isEmpty(lng)) {
                    JOptionPane.showMessageDialog(null, "经度不能为空", "错误", JOptionPane.ERROR_MESSAGE);
                    return;
                }

                String lat = latStr.getText();
                if (isEmpty(lat)) {
                    JOptionPane.showMessageDialog(null, "纬度不能为空", "错误", JOptionPane.ERROR_MESSAGE);
                    return;
                }

                String speed = speedStr.getText();
                if (isEmpty(speed)) {
                    JOptionPane.showMessageDialog(null, "速度不能为空", "错误", JOptionPane.ERROR_MESSAGE);
                    return;
                }

                String dir = dirStr.getText();
                if (isEmpty(dir)) {
                    JOptionPane.showMessageDialog(null, "方向不能为空", "错误", JOptionPane.ERROR_MESSAGE);
                    return;
                }

                boolean gcj = coorbox.isSelected();
                if (gcj){
                    String[] arr = gcj02To84Str(lng, lat);
                    lng = arr[0];
                    lat = arr[1];
                }

                String res = null;
                if (jr4.isSelected()){//基本位置信息
                    res = makePosInfo(gpsTime, lng, lat, speed, Integer.parseInt(dir.trim()));
                }
                if (jr1.isSelected()){//SOS信息
                    res = makeSosInfo(gpsTime, lng, lat, speed, Integer.parseInt(dir.trim()));
                }
                if (jr2.isSelected()){//上班打卡
                    res = makeClockInfo(gpsTime, lng, lat, speed, Integer.parseInt(dir.trim()),1);
                }
                if (jr3.isSelected()){//下班打卡
                    res = makeClockInfo(gpsTime, lng, lat, speed, Integer.parseInt(dir.trim()),2);
                }

                resStr.setText(res);
            }
        });
        panel.add(createButton);




        // IP标题
        JLabel ip = new JLabel("IP:");
        ip.setBounds(10,400,30,28);
        ip.setFont(new Font("微软雅黑", Font.PLAIN,18));
        panel.add(ip);

        // 输入IP
        final JTextField ipInfo = new JTextField(20);
        ipInfo.setBounds(40,400,150,28);
        ipInfo.setText("139.159.231.237");
        //ipInfo.setText("127.0.0.1");
        ipInfo.setFont(new Font("微软雅黑", Font.PLAIN,16));
        panel.add(ipInfo);

        // 端口标题
        JLabel port = new JLabel("端口:");
        port.setBounds(200,400,40,28);
        port.setFont(new Font("微软雅黑", Font.PLAIN,18));
        panel.add(port);

        // 输入端口
        final JTextField portInfo = new JTextField(20);
        portInfo.setBounds(250,400,60,28);
        portInfo.setText("9200");
        portInfo.setFont(new Font("微软雅黑", Font.PLAIN,16));
        panel.add(portInfo);

        // 连接状态
        final JLabel conStatus = new JLabel("未连接");
        conStatus.setBounds(330,400,60,28);
        conStatus.setFont(new Font("微软雅黑", Font.PLAIN,16));
        conStatus.setForeground(Color.red);
        panel.add(conStatus);


        // 连接按钮
        JButton connButton = new JButton("连接");
        connButton.setBounds(400, 400, 80, 30);
        connButton.setFont(new Font("微软雅黑", Font.BOLD,20));
        connButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String ipStr = ipInfo.getText();
                if (isEmpty(ipStr)) {
                    JOptionPane.showMessageDialog(null, "IP不能为空", "错误", JOptionPane.ERROR_MESSAGE);
                    return;
                }
                if (!ipStr.matches(REGIP)) {
                    JOptionPane.showMessageDialog(null, "IP格式错误", "错误", JOptionPane.ERROR_MESSAGE);
                    return;
                }

                String portStr = portInfo.getText();
                if (isEmpty(portStr)) {
                    JOptionPane.showMessageDialog(null, "端口不能为空", "错误", JOptionPane.ERROR_MESSAGE);
                    return;
                }

                getSocket(ipStr,Integer.parseInt(portStr));

                if (SOCKET != null){
                    conStatus.setText("已连接");
                    conStatus.setForeground(Color.GREEN);
                    System.out.println(SOCKET);
                }

            }
        });
        panel.add(connButton);

        // 断开按钮
        JButton desButton = new JButton("断开");
        desButton.setBounds(500, 400, 80, 30);
        desButton.setFont(new Font("微软雅黑", Font.BOLD,20));
        desButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                    SOCKET.close();
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }
                SOCKET = null;
                conStatus.setText("未连接");
                conStatus.setForeground(Color.RED);

            }
        });
        panel.add(desButton);


        /* 发送结果 */
        final JTextArea  sendStr = new JTextArea();
        sendStr.setBounds(10,440,470,80);
        sendStr.setLineWrap(true);//激活自动换行功能
        sendStr.setWrapStyleWord(true);//激活断行不断字功能
        panel.add(sendStr);


        // 发送按钮
        JButton senButton = new JButton("发送");
        senButton.setBounds(500, 440, 80, 80);
        senButton.setFont(new Font("微软雅黑", Font.BOLD,20));
        senButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (SOCKET == null || isServerClose()) {
                    SOCKET = null;
                    conStatus.setText("未连接");
                    conStatus.setForeground(Color.RED);
                    return;
                }

                String msg = resStr.getText();
                if (SOCKET != null && !isEmpty(msg)){
                    sendInfo(msg,true);
                    sendStr.setText("数据发送成功!"+"\n");
                    //sendStr.append(msg+"\n");

                    String res = getSocketInfo();
                    if (!isEmpty(res)){
                        sendStr.append("服务器响应:");
                        sendStr.append(res+"\n");
                    }
                }

            }
        });
        panel.add(senButton);


    }

    /** 创建 JFrame 实例 */
    public static void createJFrame(){
        // 创建 JFrame 实例
        JFrame frame = new JFrame("GK309数据生成器  -  by:MichLee");
        // Setting the width and height of frame
        frame.setSize(620, 580);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);//在屏幕中居中显示

        /* 创建面板,这个类似于 HTML 的 div 标签
         * 我们可以创建多个面板并在 JFrame 中指定位置
         * 面板中我们可以添加文本字段,按钮及其他组件。
         */
        JPanel panel = new JPanel();
        // 添加面板
        frame.add(panel);
        /*
         * 调用用户定义的方法并添加组件到面板
         */
        placeComponents(panel);

        // 设置界面可见
        frame.setVisible(true);
    }


    public static void main(String[] args) {
        createJFrame();

    }



}



EXE执行文件

说明:EXE执行文件是把JAVA打包,再用exe4j转换的执行文件。运行环境需要电脑配置了JDK环境,如果没有JDK环境,把JDK的JRE目录复制到EXE文件同目录也可以运行。

下载地址: https://mich.lanzoui.com/igZZRpt7xva

标签:JAVA,Socket,return,add,源码,static,new,Font,String
来源: https://blog.csdn.net/michlee168/article/details/117590313

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有