9.1
15832144755
2021-09-01 c6d9be2aac4965e847fd958288170e26e79b219d
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
package com.hxzkoa.udp;
 
import java.math.BigInteger;
import java.util.Iterator;
import java.util.List;
 
import org.springframework.beans.factory.annotation.Autowired;
 
import com.hxzkoa.json.tb_collector;
import com.hxzkoa.json.tb_gas;
import com.hxzkoa.json.tb_system;
import com.hxzkoa.json.tb_tag;
import com.hxzkoa.services.GasService;
import com.hxzkoa.util.Config;
import com.hxzkoa.util.HttpUtil;
import com.hxzkoa.util.ModifyConfig;
 
import net.sf.json.JSONObject;
 
/**读取气体传感器数据*/
public class ReadGas{
    
    static String strtip=null;//提示信息
    static String timetip=null;//提示信息
    static boolean waring=false;
    static String prefix = "INSERT INTO tb_gas_history(macid,name,type,x,y,deep,waring,addtime)  VALUES "; 
    static StringBuffer suffix = new StringBuffer(); // 保存sql后缀
    static int jishu=0;
 
    @SuppressWarnings("unused")
    /** 01 03 48 00 08 00 00 00 00 00 00 00 00 00 03 BF 80 00 00 00 00 00 03 BF 80
    00 00 00 00 00 03 BF 80 00 00 00 00 00 03 BF 80 00 00 00 00 00 03 BF 80 00 00 00
    00 00 03 BF 80 00 00 00 00 00 03 BF 80 00 00 00 00 00 03 BF 80 00 00 08 2A
    解析:
    00 08 为显示通道数量
    00 00 为虚拟通道数量
    00 00 00 00 为保留
    00 00 00 03 为通道状态
    BF 80 00 00 为浮点数-1,即为通道 1 的实时浓度(-1 表示故障)
后面以此类推为通道 2~8 的通道状态、实时数据。
     **/
    public static  void dell_gas_data(String ip,String infom) {         
        int size=infom.length()/2;
        String[] hex=StringToHex.hex(infom);
        //功能码
        String gongnengma=hex[1];
        //数据长度
        tb_gas gas = new tb_gas();
        gas.setCollect_ip(ip);
        String postUrl = Config.getPostUrl();
        String url_length_bw = postUrl + "getGasLength.do";
        JSONObject jsonObject = JSONObject.fromObject(gas);
        JSONObject re_tb_gas = HttpUtil.doPost(url_length_bw, jsonObject.toString(), Config.getCharset());
        JSONObject json = JSONObject.fromObject(re_tb_gas);
        int length = Integer.parseInt(json.get("length").toString());
        //浓度值的集合
        int[] nongduzhi=new int[length];//16,17,18,19
        for(int i=0;i<length;i++) {
            //浓度值浮点数
            nongduzhi[i]=getnongdu(hex[15+i*8]+hex[16+i*8]+hex[17+i*8]+hex[18+i*8]);
            int tongdao=i+1;
            gas.setTong_dao(String.valueOf(tongdao));
            gas.setCollect_ip(ip);
            String url_gas_bw = postUrl + "getGas.do";
            JSONObject jsonObject2 = JSONObject.fromObject(gas);
            JSONObject re_gas = HttpUtil.doPost(url_gas_bw, jsonObject2.toString(), Config.getCharset());
            tb_gas gasList = (tb_gas) JSONObject.toBean(JSONObject.fromObject(re_gas.get("result").toString()),
                    tb_gas.class);
            if(gasList==null) {
                //不存在
                return;
            }
            String id=String.valueOf(gasList.getId());  
            String type=gasList.getGas_type();//气体类型                
            String tong_dao=gasList.getTong_dao();
            String wei_zhi=gasList.getWei_zhi();
            String posx=gasList.getX();
            String posy=gasList.getY();
            if (gasList.getWaring_zhi().contains("-")){
                int warning=Integer.parseInt(gasList.getWaring_zhi().split("-")[1].split("\\.")[0]);
                warning(warning,type,nongduzhi[i],wei_zhi,tong_dao,ip, id,posx,posy);
            } else {
                int warning=Integer.parseInt(gasList.getWaring_zhi().split("\\.")[0]);
                warning(warning,type,nongduzhi[i],wei_zhi,tong_dao,ip, id,posx,posy);
            }                   
        }
        
 
    }
    
 
    public static int getnongdu(String a) {
        BigInteger b = new BigInteger(a,16);
        float f = Float.intBitsToFloat(b.intValue());
        String str = String.valueOf(f);//浮点变量a转换为字符bai串str
        int idx = str.lastIndexOf(".");//查找小数点的位置
        String strNum = str.substring(0,idx);//截取从字符串开始到小数点位置的字符串,就是整数部分
        int num = Integer.valueOf(strNum);//把整数部分通过Integer.valueof方法转换为数字
        return num;
    }
 
    /**16进制转为10进制*/
    public static int decodeHEX(String hexs){
        BigInteger bigint=new BigInteger(hexs, 16);
        int numb=bigint.intValue();
        return numb;
 
    }
 
    /**气体浓度超高或者超低报警*/
    public static void warning(
            int warning,
            String type,
            int tdz,
            String wei_zhi,
            String tong_dao,
            String collect_ip, 
            String id,
            String posx,
            String posy) {
        String str=null;        
        String warning_state="正常";
 
        if(tdz>warning) {
            warning_state="超高";
            strtip=wei_zhi+type+"浓度值 "+tdz+" 过高报警!";
            waring=true;
        }
 
        //更新tb_gas数据表数据
        tb_gas gas = new tb_gas();
        gas.setId(Integer.parseInt(id));
        gas.setNong_du(String.valueOf(tdz));
        gas.setStatus(warning_state);
        String postUrl = Config.getPostUrl();
        String url_modifyWarning = postUrl + "modifyWarning.do";
        JSONObject gasObject = JSONObject.fromObject(gas);
        HttpUtil.doPost(url_modifyWarning, gasObject.toString(), "UTF-8");
 
        //如果tcp点击开始并且协议类型为TCPSERVER
//      BaoWenShow.show(GetNowTime.now()+"收:   "+str, "气体报文");
        //显示报文
        String message="  设备编号:"+id+"  位置:"+wei_zhi+"  IP:"+collect_ip+"  气体:"+type+"  浓度:"+tdz;
//      String gasMessageUrl= postUrl +"gasMessage.do";
        String messageJson = GetNowTime.now()+ "收: "+message + "气体报文";
        String BaowenPath = Config.getBaowenConfig();
//      String baowenContent = ModifyConfig.readData(BaowenPath, "gasMessage");
        String baowenStatus = ModifyConfig.readData(BaowenPath, "baowenSwitch");
        if (baowenStatus.equals("1")){
            /* Udp_Receive.gasMessage.add(messageJson); */
        }
        JSONObject json = JSONObject.fromObject(messageJson);
//      HttpUtil.doPost(gasMessageUrl, json, "UTF-8");
        //TCP转发气体数据存在
        String doMessageTransferUrl=postUrl +"doMessageTransfer.do";
        messageJson = "{\"dataType\":\"气体数据\","+"\"result\":\""+ message + "\"}";
        json = JSONObject.fromObject(messageJson);
        HttpUtil.doPost(doMessageTransferUrl, json, "UTF-8");
 
    }
 
    /**@param unitid气体采集仪地址
     * @param ref起始地址一般为1 
     *@param  读取的数据长度有几个传感器就读几*/
 
    @SuppressWarnings("unused")
    public static byte[] read_data(int unitid,int ref ,int num ) {
        byte[] buf =new byte[8];
        //设备地址1个字节
        buf[0]=(byte) unitid;
        //功能码1个字节
        buf[1]=(byte) 0x03;
 
        //开始地址2个字节
        byte[] registers= intToRegisters(ref);
        buf[2]=(byte)0x27;
        buf[3]=(byte)0x10;
 
        //读取数量
        byte[] registers1=intToRegisters(num);
        buf[4]=(byte)0x00;
        buf[5]=(byte)0x24;
        //计算crc数值
        int crc[]=calculateCRC(buf, 0, buf.length-2);
        buf[buf.length-2]=(byte)0x4E;
        buf[buf.length-1]=(byte) 0xA0;
 
        return buf; 
    }
 
    public static final byte[] intToRegisters(int v) {
        byte[] registers = new byte[4];
        registers[0] = (byte) (0xff & (v >> 24));
        registers[1] = (byte) (0xff & (v >> 16));
        registers[2] = (byte) (0xff & (v >> 8));
        registers[3] = (byte) (0xff & v);
        return registers;
    }
 
 
    public static final int[] calculateCRC(byte[] data, int offset, int len) {
        int[] crc = {0xFF, 0xFF};
        int nextByte = 0;
        int uIndex; /* will index into CRC lookup*/ /* table */
        /* pass through message buffer */
        for (int i = offset; i < len && i < data.length; i++) {
            nextByte = 0xFF & ((int) data[i]);
            uIndex = crc[0] ^ nextByte; //*puchMsg++; /* calculate the CRC */
            crc[0] = crc[1] ^ auchCRCHi[uIndex];
            crc[1] = auchCRCLo[uIndex];
        }
 
        return crc;
    }
 
    /* Table of CRC values for high-order byte */
    private final static short[] auchCRCHi = {
            0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
            0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
            0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
            0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
            0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
            0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
            0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
            0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
            0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
            0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
            0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
            0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
            0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
            0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
            0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
            0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
            0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
            0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
            0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
            0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
            0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
            0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
            0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
            0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
            0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
            0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
    };
 
    /* Table of CRC values for low-order byte */
    private final static short[] auchCRCLo = {
            0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
            0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
            0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
            0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
            0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
            0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
            0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
            0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
            0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
            0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
            0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
            0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
            0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
            0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
            0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
            0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
            0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
            0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
            0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
            0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
            0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
            0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
            0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
            0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
            0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
            0x43, 0x83, 0x41, 0x81, 0x80, 0x40
    };
 
}