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
335 lines
8.7 KiB
|
2 years ago
|
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;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|