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<CommPortIdentifier> 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<String> phoneNumList = new ArrayList<String>();
|
|
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<bt_dat.length; n++) {
|
bt_dat[n] = CommRxBuffer.get();
|
}
|
|
rx_str = new String(bt_dat);
|
|
//logger.info("Recv Message: " + rx_str);
|
|
if(rx_str.contains("SMS_SEND_SUCESS")) {
|
send_success = true;
|
logger.info("SMS_SEND_SUCESS");
|
}
|
else if(rx_str.contains("SMS_SEND_FAIL")) {
|
logger.info("SMS_SEND_FAIL");
|
}
|
else {
|
logger.info("Unkwon return text...");
|
}
|
|
return send_success;
|
}
|
|
private void buzzerBeepAndLedOn() { //´ò¿ª µÆ ºÍ ÉùÒô
|
byte[] bt_dat = new byte[8];
|
|
bt_dat[0] = 0x7E;
|
bt_dat[1] = (byte)0xFF;
|
bt_dat[2] = 0x06;
|
bt_dat[3] = 0x3A;
|
bt_dat[4] = 0x00;
|
|
bt_dat[5] = 0x01;
|
bt_dat[6] = 0x00;
|
|
bt_dat[7] = (byte)0xEF;
|
|
try {
|
outputStream.write(bt_dat,0,8);
|
outputStream.flush();
|
}catch (Exception e) {
|
logger.error(e.toString(), e);
|
}
|
|
}
|
|
private void turnOffBuzzerBeep() { //¹Ø±Õ ÉùÒô£¬ ±£Áô µÆ
|
byte[] bt_dat = new byte[8];
|
|
bt_dat[0] = 0x7E;
|
bt_dat[1] = (byte)0xFF;
|
bt_dat[2] = 0x06;
|
bt_dat[3] = 0x3A;
|
bt_dat[4] = 0x00;
|
|
bt_dat[5] = 0x00;
|
bt_dat[6] = 0x00;
|
|
bt_dat[7] = (byte)0xEF;
|
|
try {
|
outputStream.write(bt_dat,0,8);
|
outputStream.flush();
|
}catch (Exception e) {
|
logger.error(e.toString(), e);
|
}
|
}
|
|
private void turnOffBuzzerAndLed() { //¹Ø±Õ ÉùÒô ºÍ µÆ
|
byte[] bt_dat = new byte[8];
|
|
bt_dat[0] = 0x7E;
|
bt_dat[1] = (byte)0xFF;
|
bt_dat[2] = 0x06;
|
bt_dat[3] = 0x3A;
|
bt_dat[4] = 0x00;
|
|
bt_dat[5] = 0x00;
|
bt_dat[6] = 0x01;
|
|
bt_dat[7] = (byte)0xEF;
|
|
try {
|
outputStream.write(bt_dat,0,8);
|
outputStream.flush();
|
}catch (Exception e) {
|
logger.error(e.toString(), e);
|
}
|
}
|
|
private void query_phone_number() {
|
String ph = "18627009360";
|
|
phoneNumList.clear();
|
|
phoneNumList.add(ph);
|
}
|
|
@Override
|
public void run() {
|
|
CommPortOK = false;
|
|
last_Alarm_Time = new Date();
|
sms_AlarmCheck_Time = new Date();
|
|
for(int i=0;i<60;i++) {
|
try {
|
Thread.sleep(1000);
|
} catch (InterruptedException e) {
|
logger.error(e.toString(), e);
|
}
|
}
|
|
if(Alarm_Config.ALARM_WAY_BEEPER==Alarm_way) {
|
logger.info("Beeper Alarm Thread Start....");
|
}
|
else {
|
logger.info("SMS Alarm Thread Start....");
|
}
|
|
if(Alarm_Config.ALARM_WAY_SMS == Alarm_way) {
|
|
boolean new_alarm_exists = false;
|
|
while(true) {
|
long timelong =((new Date()).getTime()-sms_AlarmCheck_Time.getTime())/1000;
|
|
if(timelong >= 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;i<phoneNumList.size();i++) {
|
if(sendShortMessage(phoneNumList.get(i)) == false) {
|
try {
|
Thread.sleep(20000); //·¢ËͶÌÐÅʧ°Ü£¬20SºóÔÙ¼ÌÐø
|
} catch (InterruptedException e) {
|
logger.error(e.toString(), e);
|
}
|
|
sendShortMessage(phoneNumList.get(i));
|
}
|
}
|
}
|
}
|
}
|
|
try {
|
Thread.sleep(1000);
|
} catch (InterruptedException e) {
|
logger.error(e.toString(), e);
|
}
|
}
|
}
|
else if(Alarm_Config.ALARM_WAY_BEEPER == Alarm_way) {
|
|
boolean alarm_exists = false;
|
|
while(true) {
|
|
alarm_exists = Alarm_Config_SQL.check_if_alarm_exists(m_Conn_Pool);
|
|
if(alarm_exists) {
|
|
Alarm_config = Alarm_Config_SQL.query_alarm_config(m_Conn_Pool);
|
|
if(Alarm_config.Beeper_Alarm_EN>0) {
|
|
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);
|
}
|
}
|
}
|
}
|
|
}
|