whyclj
2020-10-20 2a1aa055a75826211327ce37a7ad761bb7016c68
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package com.dev.data;
 
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Date;
 
import com.base.BaseData;
import com.base.Com;
import com.base.ComBase;
import com.base.ComFn;
 
/**
 *     É豸ÊÚʱÏß³Ì
 * @author LiJun
 *
 */
public class Device_Timing_Thread implements Runnable{
    public static Date dev_time = new Date();    
    
    
    //ÊÚʱʱ¼äºÍµ±Ç°Ê±¼ä×î´óʱ¼ä¼ä¸ô,±ÜÃâÒòΪÔÚÊÚʱʱ³öÏÖ´íÎóµÄʱ¼äÊÚʱ
    public static final int MAX_DEVTIME_LONG = 365*24*60*60;            //ÊÚʱʱ¼äºÍµ±Ç°Ê±¼ä±ØÐëСÓÚÒ»Äê    
    
    public static final int server_port = 8888;
    public static final int MAX_DATA_COUNT = 0x14;                    //ÊÚʱUDP±¨ÎÄÖ»ÓÐ20×Ö½Ú
    
    @Override
    public void run() {
        System.out.println("Device_Timing_Thread start at "+Com.getDateTimeFormat(new Date(), Com.DTF_YMDhms));
        
        try {
            byte[] data = null;
            while(true) {
                DatagramSocket ds = null;
                try {
                    data = new byte[MAX_DATA_COUNT];
                    DatagramPacket packet = new DatagramPacket(data, data.length);
                    ds = new DatagramSocket(server_port);
                    while (true) {
                        ds.receive(packet);                    
                        
                        BaseData basedata = new BaseData();
                        ByteBuffer bf = ByteBuffer.allocate(20);
                        bf.order(ByteOrder.LITTLE_ENDIAN);
                        bf.put(data);
                        bf.flip();
                        //System.out.println(ComFn.bytesToHexString(data, data.length));
                        if(basedata.putDeviceTimeByteBuffer(bf)) {
                            //System.out.println(Com.getDateTimeFormat(new Date(), Com.DTF_YMDhms));
                            //System.out.println(Com.getDateTimeFormat(basedata.getDevTime(), Com.DTF_YMDhms));
                            
                            //System.out.println("¸üÐÂϵͳʱ¼ä£º"+Com.getDateTimeFormat(basedata.getDevTime(), Com.DTF_YMDhms));
                            long timelong = Math.abs((new Date().getTime()-basedata.getDevTime().getTime()))/1000;
                            if(timelong < MAX_DEVTIME_LONG) {                                
                                //¸üÐÂϵͳʱ¼ä                            
                                updateSysDateTime(Com.getDateTimeFormat(basedata.getDevTime(), Com.DTF_YMD), Com.getDateTimeFormat(basedata.getDevTime(), Com.DTF_hms));
                            }else {
                                //½ÓÊÕµ½´íÎóÊÚʱʱ¼ä°ü
                                System.out.println(packet.getSocketAddress().toString()+"´íÎóÊÚʱʱ¼ä:"+Com.getDateTimeFormat(basedata.getDevTime(), Com.DTF_YMDhms)+" at ±¾»úʱ¼ä:" + Com.getDateTimeFormat(new Date(), Com.DTF_YMDhms));
                            }
                            //System.out.println(timelong);
                        }
                        Thread.sleep(10);
                    }                    
                }  catch (Exception e) {
                    Thread.sleep(1000);
                    e.printStackTrace();
                } finally {
                    //ÒâÍâÇé¿öÏÂÊͷŶ˿Ú
                    if(ds != null) {
                        try {
                            ds.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        } catch (Exception e1) {
            e1.printStackTrace();
        } finally {
            
        }
    }
    
    /**
     *     ÐÞ¸Äϵͳʱ¼ä
     * yyyy-MM-dd HH:mm:ss
     * @param DataStr_   2017-11-11   yyyy-MM-dd
     * @param TimeStr_   11:11:11     HH:mm:ss
     */
    public void updateSysDateTime(String dataStr_,String timeStr_){
        try {
            String osName = System.getProperty("os.name");
            // Window ÏµÍ³
            if (osName.matches("^(?i)Windows.*$")) {
                String cmd;
                // ¸ñʽ£ºyyyy-MM-dd
                cmd = " cmd /c date " + dataStr_;
                Runtime.getRuntime().exec(cmd);
                // ¸ñʽ HH:mm:ss
                cmd = " cmd /c time " + timeStr_;
                Runtime.getRuntime().exec(cmd);
                //System.out.println("windows Ê±¼äÐÞ¸Ä");
            } else if (osName.matches("^(?i)Linux.*$")) {
                // Linux ÏµÍ³ ¸ñʽ£ºyyyy-MM-dd HH:mm:ss   date -s "2017-11-11 11:11:11"
                FileWriter excutefw = new FileWriter("/usr/updateSysTime.sh");
                BufferedWriter excutebw=new BufferedWriter(excutefw);
                excutebw.write("date -s \"" + dataStr_ +" "+ timeStr_ +"\"\r\n");
                excutebw.close();
                excutefw.close();
                String cmd_date ="sh /usr/updateSysTime.sh";
                Runtime.getRuntime().exec(cmd_date);
                System.out.println("cmd :" + cmd_date + " date :" + dataStr_ +" time :" + timeStr_);
                //System.out.println("linux Ê±¼äÐÞ¸Ä");
            } else {
                System.out.println("²Ù×÷ϵͳÎÞ·¨Ê¶±ð");
            }
        } catch (IOException e) {
            e.getMessage();
        }
    }
    
}