⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modemgateway.java

📁 华为编程开发规范与案例, 华为编程开发规范与案例,华为编程开发规范与案例
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
// 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 + -