package com.power.spcomm; import gnu.io.CommPortIdentifier; import gnu.io.PortInUseException; import gnu.io.SerialPort; import gnu.io.UnsupportedCommOperationException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Date; import java.util.Enumeration; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.power.alarm.Alarm_Config; import com.power.alarm.Alarm_Config_SQL; import com.power.mysql.MysqlConnPool; public class SPCommModule implements Runnable{ Logger logger = LogManager.getLogger(SPCommModule.class); // ¼ì²âϵͳÖпÉÓõÄͨѶ¶Ë¿ÚÀà private CommPortIdentifier portId; private Enumeration portList; // ÊäÈëÊä³öÁ÷ private InputStream inputStream; private OutputStream outputStream; // RS-232µÄ´®ÐÐ¿Ú private SerialPort serialPort; private ByteBuffer CommRxBuffer = ByteBuffer.allocate(512); private int comm_baudrate = 9600; private MysqlConnPool m_Conn_Pool; private int Alarm_way; private Alarm_Config Alarm_config; private boolean CommPortOK = false; private ArrayList phoneNumList = new ArrayList(); public Date last_Alarm_Time = null; public Date sms_AlarmCheck_Time = null; public SPCommModule(MysqlConnPool pool,int alarm_way) { m_Conn_Pool = pool; Alarm_way = alarm_way; } @SuppressWarnings("unchecked") public boolean OpenCommPort(String comm_name) { portList = CommPortIdentifier.getPortIdentifiers(); while (portList.hasMoreElements()) { portId = portList.nextElement(); if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { if (portId.getName().equals(comm_name)) { try { serialPort = (SerialPort) portId.open("SerialPort-Test", 2000); //serialPort.addEventListener(new SPComm()); serialPort.notifyOnDataAvailable(true); /* ÉèÖô®¿ÚͨѶ²ÎÊý */ serialPort.setSerialPortParams(comm_baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); outputStream = serialPort.getOutputStream(); inputStream = serialPort.getInputStream(); } catch (PortInUseException e) { //e.printStackTrace(); logger.error(e.toString(),e); } catch (UnsupportedCommOperationException e) { //e.printStackTrace(); logger.error(e.toString(),e); } catch (IOException e) { //e.printStackTrace(); logger.error(e.toString(),e); } } } } if(null == serialPort) { logger.info(comm_name + "´ò¿ªÊ§°Ü£¬²»´æÔÚ»òÕýÔÚʹÓÃÖÐ !"); return false; } else { logger.info(comm_name + "´ò¿ª³É¹¦ !"); CommRxBuffer.order(ByteOrder.BIG_ENDIAN); return true; } } public void clearRxBuffer() throws IOException, InterruptedException { byte[] rx_buf_t = new byte[64]; while(true) { if(inputStream.available() > 0) { int rx_cnt_t = inputStream.read(rx_buf_t, 0, rx_buf_t.length); if(rx_cnt_t <= 0) break; } else break; } } public void readMsg(ByteBuffer bbf_rx) { bbf_rx.clear(); int time_out = 0; byte[] rx_buf_t = new byte[512]; try { while(true) { if(inputStream.available() > 0) { time_out = 0; int rx_cnt_t = inputStream.read(rx_buf_t); if((bbf_rx.position()+rx_cnt_t) < (bbf_rx.capacity()-1)) { bbf_rx.put(rx_buf_t, 0, rx_cnt_t); } else { break; } } else { Thread.sleep(5); time_out++; if(0 == bbf_rx.position()) { if(time_out >= 2000) { break; } } else { if(time_out >= 5) { break; } } } } bbf_rx.flip(); } catch (Exception e) { logger.error(e.toString(), e); } } private boolean sendShortMessage(String phonenumber) { logger.info("****************** sendShortMessage ***********"); boolean send_success = false; String msg_str = "86" + phonenumber + ":0:" + Alarm_config.SMS_Alarm_Text; try { outputStream.write(msg_str.getBytes("GBK"),0,msg_str.getBytes("GBK").length); outputStream.flush(); }catch (Exception e) { logger.error(e.toString(), e); } readMsg(CommRxBuffer); String rx_str = null; CommRxBuffer.position(0); byte[] bt_dat = new byte[CommRxBuffer.remaining()]; for(int n=0; n= 60) { //60 seconds sms_AlarmCheck_Time = new Date(); new_alarm_exists = Alarm_Config_SQL.check_if_new_alarm(m_Conn_Pool, last_Alarm_Time); } if(new_alarm_exists) { last_Alarm_Time = new Date(); Alarm_config = Alarm_Config_SQL.query_alarm_config(m_Conn_Pool); if(Alarm_config.SMS_Alarm_EN>0) { if(Alarm_config.SMS_CommPort_ReInit>0) { CommPortOK = false; if(null != serialPort) { serialPort.close(); } CommPortOK = OpenCommPort(Alarm_config.SMS_CommPort); if(CommPortOK) { Alarm_config.SMS_CommPort_ReInit = 0; Alarm_Config_SQL.update_alarm_config(m_Conn_Pool, Alarm_config); } else { try { Thread.sleep(3000); } catch (InterruptedException e) { logger.error(e.toString(), e); } } } if(CommPortOK) { last_Alarm_Time = new Date(); for(int i=0;i0) { if(Alarm_config.Beeper_CommPort_ReInit>0) { CommPortOK = false; if(null != serialPort) { serialPort.close(); } CommPortOK = OpenCommPort(Alarm_config.Beeper_CommPort); if(CommPortOK) { Alarm_config.Beeper_CommPort_ReInit = 0; Alarm_Config_SQL.update_alarm_config(m_Conn_Pool, Alarm_config); } else { try { Thread.sleep(3000); } catch (InterruptedException e) { logger.error(e.toString(), e); } } } if(CommPortOK) { if(Alarm_config.Beeper_Sound_OFF>0) { turnOffBuzzerBeep(); } else { buzzerBeepAndLedOn(); } } } else { if(CommPortOK) { turnOffBuzzerAndLed(); } } } try { Thread.sleep(5000); } catch (InterruptedException e) { logger.error(e.toString(), e); } } } } }