集中器服务拆分
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

335 lines
8.7 KiB

package com.back.communication;
import com.back.common.Common;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.OutputStream;
import com.back.action.Log;
public class SerialSMS implements SerialPortEventListener {
public final static String PORT_OWER = "SMS";
private boolean isOpen;
private boolean isStart;
private String portName;
private String commSet;
private CommPortIdentifier portId;
private SerialPort serialPort;
private DataInputStream inputStream;
private OutputStream outputStream;
private Object readWriteLock = new Object();
private String serialdata = "";
Boolean isread = false;
private String clazzName = new Object() {
public String getClassName() {
String clazzName = this.getClass().getName();
return clazzName.substring(0, clazzName.lastIndexOf('$'));
}
}.getClassName();
public static SerialSMS Instance;
public static SerialSMS getInstance(String port, String smsset) {
if (Instance == null) {
Instance = new SerialSMS(port, smsset);
}
return Instance;
}
private SerialSMS(String port, String smsset) {
isOpen = false;
isStart = false;
portName = port;
commSet = smsset;
}
public void init() throws IOException, Exception {
if (isOpen) {
close();
}
try {
// 根据传入的串口名创建串口标识
portId = CommPortIdentifier.getPortIdentifier(portName);
// 打开串口并返回串口对象
serialPort = (SerialPort) portId.open(PORT_OWER, 2000);
// 通过串口对象获得输入流
inputStream = new DataInputStream(serialPort.getInputStream());
// 通过串口对象获得输出流
outputStream = serialPort.getOutputStream();
serialPort.getReceiveTimeout();
isOpen = true;
} catch (NoSuchPortException ex) {
ex.printStackTrace();
System.err.println(ex.getMessage());
} catch (PortInUseException ex) {
System.err.println(ex.getMessage());
}
}
public void start() throws Exception {
if (!isOpen) {
Log.writelog(clazzName, Thread.currentThread().getStackTrace()[1].getMethodName() + "->"
+ portName + " has not been opened.");
}
// 设置串口监听对象
serialPort.addEventListener(this);
// 设置串口数据可用
serialPort.notifyOnDataAvailable(true);
/* 设置串口初始化参数,依次是波特率,校验位,数据位,停止位 */
String[] array = commSet.split(",");
int baud = Integer.parseInt(array[0]);
int databits = Integer.parseInt(array[2]);
int stopbits = Integer.parseInt(array[3]);
String parity = array[1].toLowerCase();
int intparity = 0;
if (parity.equals("n")) {
intparity = 0;
} else if (parity.equals("o")) {
intparity = 1;
} else if (parity.equals("e")) {
intparity = 2;
}
serialPort.setSerialPortParams(baud, databits, stopbits, intparity);
isStart = true;
}
public void stop() {
if (isStart) {
// 设置串口数据是否可用
serialPort.notifyOnDataAvailable(false);
// 移除串口监听事件
serialPort.removeEventListener();
isStart = false;
}
}
public void close() {
stop();
if (isOpen) {
try {
// 关闭流对象与串口对象
inputStream.close();
outputStream.close();
serialPort.close();
serialPort = null;
isOpen = false;
} catch (IOException ex) {
Log.writelog(clazzName, Thread.currentThread().getStackTrace()[1].getMethodName()
+ "->Error:" + ex.getMessage());
}
}
}
public void serialEvent(SerialPortEvent event) {
switch (event.getEventType()) {
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:
// 从串口获得数据,获取的数据以流的形式读取
readComm();
break;
default:
break;
}
}
public boolean writeCommTxt(String phone, String Msg) {
synchronized (readWriteLock) {
boolean flag = false;
try {
String data = "AT+CMGF=1\r\n";// 文本发送
serialdata = "";
outputStream.write(data.getBytes());
Log.writelog(clazzName, Thread.currentThread().getStackTrace()[1].getMethodName()
+ "->write AT+CMGF=1 .......1");
for (int i = 0; i < 5000; i++) // 2012-06-20
{
if (serialdata.contains("-4F-4B-")) { // OK
break;
}
Thread.sleep(1);
}
Log.writelog(clazzName, Thread.currentThread().getStackTrace()[1].getMethodName()
+ "->write AT+CMGF=1 .......2");
if (serialdata.contains("-4F-4B-")) {
serialdata = "";
flag = true;
} else {
return false;
}
data = "AT+CSCS=\"GSM\"\r\n";
serialdata = "";
outputStream.write(data.getBytes());
for (int i = 0; i < 500; i++) {
if (serialdata.contains("-4F-4B-")) {
break;
}
Thread.sleep(1);
}
serialdata = "";
// data = center + code;
serialdata = "";
Msg = ">" + Msg;
outputStream.write(Msg.getBytes());
outputStream.write((char) 26);// ctrl+Z发送
for (int i = 0; i < 10000; i++) // 2012-06-20
{
if (serialdata.contains("-4F-4B-")) {
break;
}
Thread.sleep(1);
}
} catch (Exception e) {
Log.writelog(clazzName, Thread.currentThread().getStackTrace()[1].getMethodName()
+ "->ERROR:" + e.toString());
e.printStackTrace();
}
if (serialdata.contains("-4F-4B-")) { // 发送成功
flag = true;
} else {
flag = false;
}
return flag;
}
}
/** 写指令到串口 */
public boolean writeComm(String center, String code) {
synchronized (readWriteLock) {
boolean flag = false;
try {
String data = "AT+CMGF=0\r\n";// 文本发送 设置为PDU模式
serialdata = "";
outputStream.write(data.getBytes());
Log.writelog(clazzName, Thread.currentThread().getStackTrace()[1].getMethodName()
+ "->write AT+CMGF=0 .......1");
for (int i = 0; i < 5000; i++) // 2012-06-20
{
if (serialdata.contains("-4F-4B-")) { // OK
break;
}
Thread.sleep(1);
}
Log.writelog(clazzName, Thread.currentThread().getStackTrace()[1].getMethodName()
+ "->write AT+CMGF=0 .......2");
if (serialdata.contains("-4F-4B-")) {
serialdata = "";
flag = true;
} else {
return false;
}
if (flag) {
int intLen = code.length() / 2;
data = "AT+CMGS=" + intLen + "\r\n";
serialdata = "";
outputStream.write(data.getBytes());
for (int i = 0; i < 500; i++) {
if (serialdata.contains("-4F-4B-")) {
break;
}
Thread.sleep(1);
}
serialdata = "";
// data = center + code;
data = code;
serialdata = "";
outputStream.write(data.getBytes());
outputStream.write((char) 26);// ctrl+Z发送
for (int i = 0; i < 10000; i++) // 2012-06-20
{
if (serialdata.contains("-4F-4B-")) {
break;
}
Thread.sleep(1);
}
}
} catch (Exception e) {
Log.writelog(clazzName, Thread.currentThread().getStackTrace()[1].getMethodName()
+ "->ERROR:" + e.toString());
e.printStackTrace();
}
if (serialdata.contains("-4F-4B-")) { // 发送成功
flag = true;
} else {
flag = false;
}
return flag;
}
}
/** 用流读取数据,写事件表和写结果表 */
public void readComm() {
int num = 0;// buffer中的数据长度
byte[] readbuffer = new byte[1024];
try {
if (inputStream.available() > 0) {
num = inputStream.read(readbuffer);
} else {
return;
}
serialdata = serialdata + Common.GetHexStr(readbuffer, num);
} catch (IOException e) {
Log.writelog(clazzName, Thread.currentThread().getStackTrace()[1].getMethodName()
+ "->ERROR:" + e.toString());
return;
}
}
}