| package com.zy.core.thread; | 
|   | 
| import com.alibaba.fastjson.JSONObject; | 
| import com.core.common.Cools; | 
| import com.core.common.DateUtils; | 
| import com.core.common.SpringUtils; | 
| import com.zy.asrs.entity.BasDevp; | 
| import com.zy.asrs.service.BasDevpService; | 
| import com.zy.asrs.service.DeviceErrorService; | 
| import com.zy.core.DevpThread; | 
| import com.zy.core.Slave; | 
| import com.zy.core.ThreadHandler; | 
| import com.zy.core.cache.OutputQueue; | 
| import com.zy.core.cache.SlaveConnection; | 
| import com.zy.core.enums.SlaveType; | 
| import com.zy.core.model.protocol.StaProtocol; | 
| import lombok.Data; | 
| import lombok.extern.slf4j.Slf4j; | 
|   | 
| import java.io.DataInputStream; | 
| import java.io.DataOutputStream; | 
| import java.io.IOException; | 
| import java.net.InetSocketAddress; | 
| import java.net.Socket; | 
| import java.net.SocketAddress; | 
| import java.net.SocketTimeoutException; | 
| import java.util.Date; | 
|   | 
| /** | 
|  * 磅秤线程 | 
|  * Created by vincent on 2020/8/4 | 
|  */ | 
| @Data | 
| @Slf4j | 
| public class ScaleThread implements Runnable, ThreadHandler { | 
|   | 
|     private Slave slave; | 
|     private Double scale = 0.0D; | 
|     private Socket socket; | 
|     private DataOutputStream dataOutputStream; | 
|     private DataInputStream dataInputStream; | 
|   | 
|     public ScaleThread(Slave slave) { | 
|         this.slave = slave; | 
|     } | 
|   | 
|     @Override | 
|     @SuppressWarnings("InfiniteLoopStatement") | 
|     public void run() { | 
|         connect(); | 
|         while (true) { | 
|             try { | 
|                 byte[] read = read(8, 100); | 
|                 if (null != read) { | 
|                     String s = new String(read); | 
|                     if (!Cools.isEmpty(s) && s.startsWith("\u0002+")) { | 
| //                    if (!Cools.isEmpty(s) && s.startsWith("=")) { | 
|                         scale = Double.parseDouble(s.substring(1)); | 
|   | 
| //                        System.out.println("scale:"+scale+ "ip:"+slave.getIp()); | 
| //                        String substring = s.substring(1); | 
| //                        String s1 = new StringBuilder(substring).reverse().toString();//逆序 | 
| //                        scale = Double.parseDouble(s1); | 
|                         //将称重重量写入设备基础数据中的gross_wt字段 | 
| //                        if(scale > 20) { | 
|                             try{ | 
|                                 // 获取站信息 | 
|                                 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, slave.getDevpPlcId()); | 
|                                 StaProtocol staProtocol = devpThread.getStation().get(slave.getStaNo()); | 
|                                 if (staProtocol != null) { | 
|                                     if (scale>10000){ | 
|                                         scale = scale-10000; | 
|                                     } | 
|                                     devpThread.setGrossWt(staProtocol.getSiteId(), scale); | 
|   | 
|                                     JSONObject jsonObject = new JSONObject(); | 
|                                     jsonObject.put("time", DateUtils.convert(new Date(), DateUtils.yyyyMMddHHmmss_F)); | 
|                                     jsonObject.put("id", slave.getStaNo()); | 
|                                     jsonObject.put("scale", scale); | 
|                                     if (OutputQueue.SCALE.size() >= 32) { | 
|                                         OutputQueue.SCALE.poll(); | 
|                                     } | 
|                                     OutputQueue.SCALE.offer(jsonObject); | 
|                                 } | 
|                             } catch (Exception e){ | 
|                                 log.error("称重模块异常"+e .getMessage()); | 
|                             } | 
| //                            BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class); | 
| //                            BasDevp basDevp = basDevpService.selectById(slave.getStaNo()); | 
| //                            if(!Cools.isEmpty(basDevp)) { | 
| //                                basDevp.setGrossWt(scale); | 
| //                                if (null != basDevpService && !basDevpService.updateById(basDevp)) { | 
| //                                    throw new Exception("更新数据库数据失败"); | 
| //                                } | 
| //                                JSONObject jsonObject = new JSONObject(); | 
| //                                jsonObject.put("time", DateUtils.convert(new Date(), DateUtils.yyyyMMddHHmmss_F)); | 
| //                                jsonObject.put("id", slave.getStaNo()); | 
| //                                jsonObject.put("scale", scale); | 
| //                                if (OutputQueue.SCALE.size() >= 32) { | 
| //                                    OutputQueue.SCALE.poll(); | 
| //                                } | 
| //                                OutputQueue.SCALE.offer(jsonObject); | 
| // | 
| //                            } | 
| //                        } | 
|                     } | 
|                 } | 
|                 Thread.sleep(100); | 
|             } catch (SocketTimeoutException ignore) { | 
|             } catch (Exception e) { | 
| //                e.printStackTrace(); | 
|             } | 
|         } | 
|     } | 
|   | 
|     @Override | 
|     public boolean connect() { | 
|   | 
|         try { | 
|             close();  //1.主动释放连接 //2.某些服务器对指定ip有链路数限制 | 
|             socket = new Socket(); | 
|             //socket.setKeepAlive(true); | 
|             SocketAddress socketAddress = new InetSocketAddress(slave.getIp(), slave.getPort()); | 
|             socket.connect(socketAddress, 1000); //某些服务器ping延迟高时要增加,否则会报错connect timeout | 
|             dataOutputStream = new DataOutputStream(socket.getOutputStream()); | 
|             dataInputStream = new DataInputStream(socket.getInputStream()); | 
| //            log.info("条码扫描仪连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); | 
|             try{ | 
|                 DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); | 
|                 deviceErrorService.deleteDeviceError("Scale", slave.getId()); | 
|             } catch (Exception e){ | 
| //                log.error("e:"+e.getMessage()); | 
|             } | 
|         } catch (Exception e) { | 
|             socket = null; | 
| //            log.error("磅秤连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); | 
| //            DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); | 
| //            deviceErrorService.addDeviceError("scale", slave.getId(), "磅秤连接失败"); | 
|             try{ | 
|                 DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); | 
|                 deviceErrorService.deleteDeviceError("Scale", slave.getId()); | 
|             } catch (Exception e1){ | 
| //                log.error("e:"+e1.getMessage()); | 
|             } | 
|             return false; | 
|         } | 
|         return true; | 
|     } | 
|   | 
|     @Override | 
|     public void close() { | 
|         try { | 
|             if (null != dataOutputStream) { | 
|             dataOutputStream.close(); | 
|         } | 
|         if (null != dataInputStream) { | 
|             dataInputStream.close(); | 
|         } | 
| //        if (null != socket && !socket.isClosed()) { | 
| //            socket.close(); | 
| //        } | 
|         if (null != socket){ | 
|             socket.close(); | 
|         } | 
|         socket = null; | 
|         } catch (IOException e) { | 
|             log.error("SocketClient close Exception:" + e.getMessage()); | 
|         } | 
|     } | 
|   | 
|     public void write(byte[] msg, int len) throws IOException { | 
|         if (null != dataInputStream) | 
|         { | 
|             dataOutputStream.write(msg, 0, len); | 
|             dataOutputStream.flush(); | 
|         } | 
|     } | 
|   | 
|     public byte[] read(int bufferSize, int timeOut) throws IOException { | 
| //        if (socket == null) { | 
| //           connect(); | 
| //        } | 
|         connect(); | 
|         socket.setSoTimeout(timeOut); | 
|         byte[] bytes = new byte[bufferSize]; | 
|         int len = dataInputStream.read(bytes); | 
|         byte[] tempBytes = null; | 
|         if (len > 0) { | 
|         tempBytes = new byte[len]; | 
|         System.arraycopy(bytes, 0, tempBytes, 0, len); | 
|         } | 
|         return tempBytes; | 
|     } | 
|   | 
|     public boolean valid() throws Exception { | 
|         if (null == socket || socket.isClosed() || socket.isInputShutdown() || socket.isOutputShutdown()) { | 
|             if (dataInputStream != null) { | 
|                 dataInputStream.close(); | 
|             } | 
|             if (dataOutputStream != null) { | 
|                 dataOutputStream.close(); | 
|             } | 
|             if (socket != null) { | 
|                 socket.close(); | 
|             } | 
|             return false; | 
|         } | 
|         return true; | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 清除作业启动中 | 
|      */ | 
|     @Override | 
|     public void setWrkSign() { | 
|     } | 
|   | 
| } |