📄 modemgateway.java
字号:
// SMSLib for Java v3
// A Java API library for sending and receiving SMS via a GSM modem
// or other supported gateways.
// Web Site: http://www.smslib.org
//
// SMSLib is distributed under the terms of the Apache License version 2.0
//
// Copyright (C) 2002-2007, Thanasis Delenikas, Athens/GREECE
// Portions Copyright:
// Davide Bettoni, Clusone/ITALY, dbettoni@users.sourceforge.net
// Tomek Cejner, Polland, heretique@users.sourceforge.net
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package org.smslib.gateway;
import java.util.*;
import java.io.*;
import org.apache.log4j.*;
import org.smslib.*;
import org.smslib.athandlers.AbstractATHandler;
public class ModemGateway extends AbstractGateway
{
private String comPort;
private int baudRate;
private String manufacturer;
private String model;
private ModemDriver driver;
private AbstractATHandler atHandler;
private String simPin;
private int outMpRefNo;
private LinkedList<LinkedList<InboundMessage>> mpMsgList;
private int retriesNoResponse, retriesCmsErrors;
private int delayNoResponse, delayCmsErrors;
private String smscNumber;
public ModemGateway(String id, String comPort, int baudRate, String manufacturer, String model, Logger logger)
{
super(id, logger);
started = false;
this.comPort = comPort;
this.baudRate = baudRate;
this.manufacturer = manufacturer;
this.model = model;
attributes = AbstractGateway.Attributes.SEND |
AbstractGateway.Attributes.RECEIVE |
AbstractGateway.Attributes.BIGMESSAGES |
AbstractGateway.Attributes.WAPSI |
AbstractGateway.Attributes.PORTADDRESSING |
AbstractGateway.Attributes.FLASHSMS |
AbstractGateway.Attributes.DELIVERYREPORTS;
if (comPort.indexOf(".") == -1) driver = new SerialModemDriver(this, this.comPort + ":" + this.baudRate);
else driver = new IPModemDriver(this, this.comPort + ":" + this.baudRate);
atHandler = AbstractATHandler.load(this, this.manufacturer, this.model);
logger.info("Using " + atHandler.getDescription() + " AT handler.");
simPin = "";
outMpRefNo = new Random().nextInt();
if (outMpRefNo < 0) outMpRefNo *= -1;
outMpRefNo %= 65536;
mpMsgList = new LinkedList<LinkedList<InboundMessage>>();
retriesNoResponse = 5;
delayNoResponse = 5000;
retriesCmsErrors = 5;
delayCmsErrors = 5000;
smscNumber = "";
}
public void startGateway() throws Exception
{
logger.info("Starting Gateway: " + gatewayId);
driver.connect();
super.startGateway();
}
public void stopGateway() throws Exception
{
logger.info("Stopping Gateway: " + gatewayId);
super.stopGateway();
driver.disconnect();
}
public void readMessages(LinkedList<InboundMessage> msgList, InboundMessage.MessageClass msgClass) throws Exception
{
synchronized (driver.SYNC_Commander)
{
switch (protocol)
{
case PDU:
readMessagesPDU(msgList, msgClass, 0);
break;
case TEXT:
readMessagesTEXT(msgList, msgClass, 0);
break;
}
}
}
public InboundMessage readMessage(String memLoc, int memIndex) throws Exception
{
LinkedList<InboundMessage> msgList;
int i;
synchronized (driver.SYNC_Commander)
{
msgList = new LinkedList<InboundMessage>();
readMessages(msgList, InboundMessage.MessageClass.All);
for (i = 0; i < msgList.size(); i++)
if (msgList.get(i).getMemIndex() == memIndex) return msgList.get(i);
return null;
}
}
public void sendMessage(OutboundMessage msg) throws Exception
{
synchronized (driver.SYNC_Commander)
{
switch (protocol)
{
case PDU:
sendMessagePDU(msg);
break;
case TEXT:
sendMessageTEXT(msg);
break;
}
}
}
public void deleteMessage(InboundMessage msg) throws Exception
{
synchronized (driver.SYNC_Commander)
{
if (msg.getMemIndex() >= 0) deleteMessage(msg.getMemIndex(), msg.getMemLocation());
else if ((msg.getMemIndex() == -1) && (msg.getMpMemIndex().length() != 0))
{
StringTokenizer tokens = new StringTokenizer(msg.getMpMemIndex(), ",");
while (tokens.hasMoreTokens())
deleteMessage(Integer.parseInt(tokens.nextToken()), msg.getMemLocation());
}
}
}
public void deleteMessage(int memIndex, String memLocation) throws Exception
{
atHandler.deleteMessage(memIndex, memLocation);
}
public float queryBalance() throws Exception
{
throw new UnsupportedOperationException("Unsupported Gateway operation!");
}
public boolean queryCoverage(OutboundMessage msg) throws Exception
{
throw new UnsupportedOperationException("Unsupported Gateway operation!");
}
private void sendMessagePDU(OutboundMessage msg) throws Exception
{
int j, refNo;
String pdu;
atHandler.keepGsmLinkOpen();
if (!msg.isBig())
{
pdu = msg.getPDU(smscNumber, 0, 0);
j = pdu.length();
j /= 2;
if (smscNumber == null) ; // Do nothing on purpose!
else if (smscNumber.length() == 0) j--;
else
{
int smscNumberLen = smscNumber.length();
if (smscNumber.charAt(0) == '+') smscNumberLen--;
if (smscNumberLen % 2 != 0) smscNumberLen++;
int smscLen = (2 + smscNumberLen) / 2;
j = j - smscLen - 1;
}
refNo = atHandler.sendMessage(j, pdu, null, null);
if (refNo >= 0)
{
msg.setGatewayId(gatewayId);
msg.setRefNo("" + refNo);
msg.setDispatchDate(new Date());
msg.setMessageStatus(OutboundMessage.MessageStatus.SENT);
statistics.outbound ++;
}
else if (refNo == -2)
{
stopGateway();
}
else
{
msg.setRefNo(null);
msg.setDispatchDate(null);
msg.setMessageStatus(OutboundMessage.MessageStatus.FAILED);
}
}
else
{
for (int partNo = 1; partNo <= msg.getNoOfParts(); partNo++)
{
pdu = msg.getPDU(smscNumber, outMpRefNo, partNo);
j = pdu.length();
j /= 2;
if (smscNumber == null) ; // Do nothing on purpose!
else if (smscNumber.length() == 0) j--;
else
{
int smscNumberLen = smscNumber.length();
if (smscNumber.charAt(0) == '+') smscNumberLen--;
if (smscNumberLen % 2 != 0) smscNumberLen++;
int smscLen = (2 + smscNumberLen) / 2;
j = j - smscLen - 1;
}
refNo = atHandler.sendMessage(j, pdu, null, null);
if (refNo >= 0)
{
msg.setGatewayId(gatewayId);
msg.setRefNo("" + refNo);
msg.setDispatchDate(new Date());
msg.setMessageStatus(OutboundMessage.MessageStatus.SENT);
statistics.outbound ++;
}
else if (refNo == -2)
{
stopGateway();
break;
}
else
{
msg.setRefNo(null);
msg.setDispatchDate(null);
msg.setMessageStatus(OutboundMessage.MessageStatus.FAILED);
}
}
outMpRefNo = (outMpRefNo + 1) % 65536;
}
}
private void sendMessageTEXT(OutboundMessage msg) throws Exception
{
throw new UnsupportedOperationException("TEXT mode messages not supported yet.");
}
private void readMessagesTEXT(LinkedList<InboundMessage> msgList, InboundMessage.MessageClass msgClass, int limit) throws Exception
{
int i, j, memIndex;
byte[] bytes;
String response, line, msgText, originator, dateStr, refNo;
BufferedReader reader;
StringTokenizer tokens;
InboundMessage msg;
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
if (limit < 0) limit = 0;
atHandler.switchToCmdMode();
for (int ml = 0; ml < (atHandler.getStorageLocations().length() / 2); ml++)
{
if (atHandler.setMemoryLocation(atHandler.getStorageLocations().substring((ml * 2), (ml * 2) + 2)))
{
response = atHandler.listMessages(msgClass);
response = response.replaceAll("\\s+OK\\s+", "\nOK");
reader = new BufferedReader(new StringReader(response));
for (;;)
{
line = reader.readLine().trim();
if (line == null) break;
line = line.trim();
if (line.length() > 0) break;
}
while (true)
{
if (line == null) break;
line = line.trim();
if (line.length() <= 0 || line.equalsIgnoreCase("OK")) break;
i = line.indexOf(':');
j = line.indexOf(',');
memIndex = Integer.parseInt(line.substring(i + 1, j).trim());
tokens = new StringTokenizer(line, ",");
tokens.nextToken();
tokens.nextToken();
if (Character.isDigit(tokens.nextToken().trim().charAt(0)))
{
line = line.replaceAll(",,", ", ,");
tokens = new StringTokenizer(line, ",");
tokens.nextToken();
tokens.nextToken();
tokens.nextToken();
refNo = tokens.nextToken();
tokens.nextToken();
dateStr = tokens.nextToken().replaceAll("\"", "");
cal1.set(Calendar.YEAR, 2000 + Integer.parseInt(dateStr.substring(0, 2)));
cal1.set(Calendar.MONTH, Integer.parseInt(dateStr.substring(3, 5)) - 1);
cal1.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateStr.substring(6, 8)));
dateStr = tokens.nextToken().replaceAll("\"", "");
cal1.set(Calendar.HOUR_OF_DAY, Integer.parseInt(dateStr.substring(0, 2)));
cal1.set(Calendar.MINUTE, Integer.parseInt(dateStr.substring(3, 5)));
cal1.set(Calendar.SECOND, Integer.parseInt(dateStr.substring(6, 8)));
dateStr = tokens.nextToken().replaceAll("\"", "");
cal2.set(Calendar.YEAR, 2000 + Integer.parseInt(dateStr.substring(0, 2)));
cal2.set(Calendar.MONTH, Integer.parseInt(dateStr.substring(3, 5)) - 1);
cal2.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateStr.substring(6, 8)));
dateStr = tokens.nextToken().replaceAll("\"", "");
cal2.set(Calendar.HOUR_OF_DAY, Integer.parseInt(dateStr.substring(0, 2)));
cal2.set(Calendar.MINUTE, Integer.parseInt(dateStr.substring(3, 5)));
cal2.set(Calendar.SECOND, Integer.parseInt(dateStr.substring(6, 8)));
msg = new StatusReportMessage(refNo, memIndex, atHandler.getStorageLocations().substring((ml * 2), (ml * 2) + 2), cal1.getTime(), cal2.getTime());
msg.setGatewayId(gatewayId);
logger.debug("IN-DTLS: MI:" + msg.getMemIndex());
msgList.add(msg);
statistics.inbound ++;
}
else
{
line = line.replaceAll(",,", ", ,");
tokens = new StringTokenizer(line, ",");
tokens.nextToken();
tokens.nextToken();
originator = tokens.nextToken().replaceAll("\"", "");
tokens.nextToken();
dateStr = tokens.nextToken().replaceAll("\"", "");
cal1.set(Calendar.YEAR, 2000 + Integer.parseInt(dateStr.substring(0, 2)));
cal1.set(Calendar.MONTH, Integer.parseInt(dateStr.substring(3, 5)) - 1);
cal1.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateStr.substring(6, 8)));
dateStr = tokens.nextToken().replaceAll("\"", "");
cal1.set(Calendar.HOUR_OF_DAY, Integer.parseInt(dateStr.substring(0, 2)));
cal1.set(Calendar.MINUTE, Integer.parseInt(dateStr.substring(3, 5)));
cal1.set(Calendar.SECOND, Integer.parseInt(dateStr.substring(6, 8)));
msgText = reader.readLine().trim();
bytes = new byte[msgText.length() / 2];
j = 0;
for (i = 0; i < msgText.length(); i += 2)
{
bytes[j] = Byte.parseByte(msgText.substring(i, i + 2), 16);
j++;
}
msgText = GSMAlphabet.bytesToString(bytes);
msg = new InboundMessage(cal1.getTime(), originator, msgText, memIndex, atHandler.getStorageLocations().substring((ml * 2), (ml * 2) + 2));
msg.setGatewayId(gatewayId);
logger.debug("IN-DTLS: MI:" + msg.getMemIndex());
msgList.add(msg);
statistics.inbound ++;
}
line = reader.readLine().trim();
while (line.length() == 0)
line = reader.readLine().trim();
}
reader.close();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -