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

📄 messagelayer.java

📁 关于 RFID 读写器的相关内容
💻 JAVA
字号:
/*
 * Copyright (C) 2007 ETH Zurich
 *
 * This file is part of Fosstrak (www.fosstrak.org).
 *
 * Fosstrak is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License version 2.1, as published by the Free Software Foundation.
 *
 * Fosstrak is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with Fosstrak; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA  02110-1301  USA
 */

package org.fosstrak.reader.rprm.core.msg;


import java.io.File;
import java.net.URL;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;


import org.fosstrak.reader.rprm.core.ReaderDevice;
import org.fosstrak.reader.rprm.core.ReaderProtocolException;
import org.fosstrak.reader.rprm.core.mgmt.agent.snmp.SnmpAgent;
import org.fosstrak.reader.rprm.core.mgmt.alarm.AlarmChannel;
import org.fosstrak.reader.rprm.core.mgmt.simulator.MgmtSimulator;
import org.fosstrak.reader.rprm.core.msg.transport.ConnectionThreadPool;
import org.fosstrak.reader.rprm.core.msg.transport.ServerConnection;
import org.fosstrak.reader.rprm.core.util.ResourceLocator;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.XMLConfiguration;
import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
import org.snmp4j.agent.io.ImportModes;

/**
 * MessageLayer is the main class. It instantiates the whole infrastructure.
 * After that, class <code>MessageDispatcher</code> and
 * <code>CommandDispatcher</code> are ready to execute commands on the reader.
 *
 * @author Patrice Oehen (poehen@student.ethz.ch)
 * @author Anna Wojtas, Marcel Bihr, Lukas Blunschi
 * @author Andreas F黵er, ETH Zurich, anfuerer@student.ethz.ch
 *
 */
public class MessageLayer {

	// ====================================================================
	// ---------------------------- Fields ------------------------------//
	// ====================================================================

	/** The logger. */
	private static Logger log = Logger.getLogger(MessageLayer.class);

	/** All connected <code>clients</code>. */
	private Clients clients = null;


	/**
	 * The time in ms that the reader waits for a notification connection in
	 * listen mode.
	 */
	private static int notificationListenTimeout;

	/** The single instance of the dispatcher. */
	private MessageDispatcher sDispatcher;

	/** The <code>IncomingMessageBuffer</code>. */
	private IncomingMessageBuffer mbuffer;

	/** The outgoing message dispatcher. */
	private OutgoingMessageDispatcher outDispatcher;

	/** The SNMP agent. */
	private SnmpAgent snmpAgent;

	/** The management agent's address */
	private String mgmtAgentAddress;

	/** The management agent's port */
	private int mgmtAgentPort;

	/** The management agent type (SNMP per default) */
	public static AgentType mgmtAgentType = AgentType.SNMP;

	/** Specifies whether the management simulator will be started */
	private boolean mgmtSimulatorStart;

	/** The management agent's properties file */
	private static final String mgmtAgentPropFile = ReaderDevice.PROPERTIES_FILE;
   private static final String mgmtAgentDefaultPropFile = ReaderDevice.DEFAULT_PROPERTIES_FILE;

	/** The agent type enum */
	public enum AgentType {
		SNMP
	}

	// ====================================================================
	// ------------------------- Constructor ----------------------------//
	// ====================================================================

	/**
	 * Creates a new Message Layer
	 */
	public MessageLayer() {
		DOMConfigurator.configure("./props/log4j.xml");
		//BasicConfigurator.configure();

		this.initialize();
	}

	// ====================================================================
	// ------------------------- Methods --------------------------------//
	// ====================================================================

	/**
	 * The main method.
	 *
	 * @param args
	 *            Not used
	 */
	public static void main(String[] args) {
		MessageLayer m = new MessageLayer();
	}

	/**
	 * Initializes the messaging layer and starts the reader device.
	 *
	 * @param reader reference to the ReaderDevice
	 */
	private void initialize() {
		log.debug("**************************************");
		log.debug("* MessageLayer is beeing initialized *");
		log.debug("**************************************");

		readMgmtAgentProperties(MessageLayer.mgmtAgentPropFile,
         MessageLayer.mgmtAgentDefaultPropFile);

		switch (MessageLayer.mgmtAgentType) {

			case SNMP:

				/*************************
				 *   create SNMP agent   *
				 *************************/

				String bootCounterFileName = "SnmpAgentBC.cfg";
				String configFileName = "SnmpAgentConfig.cfg";
				File bootCounterFile = new File(bootCounterFileName);
				File configFile = new File(configFileName);

				// delete the old files
				bootCounterFile.delete();
				configFile.delete();

				// create agent
				snmpAgent = SnmpAgent.create(bootCounterFile, configFile,
						mgmtAgentAddress + "/" + mgmtAgentPort);
				break;

			// case ...:

		}


		/*************************
		 *     MessageLayer      *
		 *************************/

		String connType;

		// sets the parameters according to the properties file
		try {
			Map serverConns = new HashMap();
			MessageLayerConfiguration conf = MessageLayerConfiguration.getInstance();

			try {
				ConnectionThreadPool.create(conf.getThreadPoolSize());

			} catch (NumberFormatException e) {
				log.error("Could not interpret the threadPoolSize from the property file. Please ensure to use a correct integer format.");
			}

			if (conf.hasTcpServerConnection()) {
				connType = ServerConnection.TCP_SERVER;
				try {
					int tcpPort = conf.getTcpPort();
					serverConns.put(connType, new Integer(tcpPort));
				} catch (NumberFormatException e) {
					log.error("Could not interpret the tcpPort from the property file. Please ensure to use a correct integer format.");
				}
			}

			if (conf.hasHttpServerConnection()) {
				connType = ServerConnection.HTTP_SERVER;
				try {
					int httpPort = conf.getHttpPort();
					serverConns.put(connType, new Integer(httpPort));
				} catch (NumberFormatException e) {
					log.error("Could not interpret the httpPort from the property file. Please ensure to use a correct integer format.");
				}
			}

			try {
				notificationListenTimeout = conf.getNotificationListenTimeout();
			} catch (NumberFormatException e) {
				log.error("Could not interpret the notificationListenTimeout from the property file. Please ensure to use a correct integer format.");
			}

			// create the message buffer
			log.debug("creating an IncomingMessageBuffer");
			mbuffer = IncomingMessageBuffer.getInstance();

			// create clients
			log.debug("creating Clients");
			clients = Clients.getInstance();

			// create the outgoing message dispatcher
			log.debug("creating an OutgoingMessageDispatcher");
			outDispatcher = OutgoingMessageDispatcher.getInstance();
			outDispatcher.initialize(clients);

			// create and init the service dispatcher
			log.debug("creating a ServiceDispatcher");
			sDispatcher = MessageDispatcher.getInstance(this);
			sDispatcher.initialize(mbuffer, clients, outDispatcher);
			sDispatcher.start();

			log.debug("creating ServiceConnection");
			Iterator iter = serverConns.keySet().iterator();

			while (iter.hasNext()) {
				String cType = (String) iter.next();
				ServerConnection.createServerConnection(cType,
						((Integer) serverConns.get(cType)).intValue(), mbuffer);
			}

			ReaderDevice readerDevice = ReaderDevice.getInstance();

			switch (MessageLayer.mgmtAgentType) {

				case SNMP:

					/*************************
					 * initialize SNMP agent *
					 *************************/

					snmpAgent.init();
					snmpAgent.loadConfig(ImportModes.UPDATE_CREATE);

					// We need to add the alarm channels again because at their
					// creation the SNMP agent was not initialized yet.
					Enumeration<AlarmChannel> alarmChanIter = readerDevice.getAlarmChannels().elements();
					while (alarmChanIter.hasMoreElements()) {
						snmpAgent.addAlarmChannels(new AlarmChannel[] { alarmChanIter.nextElement() });
					}

					snmpAgent.run();
					break;

				// case ...:

			}

			if (mgmtSimulatorStart) {
				MgmtSimulator inst = new MgmtSimulator(readerDevice);
				inst.setVisible(true);
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Resets the MessageLayer to the default values and restarts dispatching.
	 *
	 */
	public void reset() {
		/* TODO: Was ist genauer Semantik von reset?? Connections auch zumachen? */

		// Close all server connections
		List servers = ServerConnection.getServerConnections();
		for (Iterator it = servers.iterator(); it.hasNext();) {
			ServerConnection server = (ServerConnection) it.next();
			server.close();
		}

		// Reset all clients
		Clients clients = Clients.getInstance();
		clients.reset();

		// Reset all buffers and dispatchers
		sDispatcher.suspendThread();
		sDispatcher = null;

		mbuffer.clean();

		// Re-Initialize
		initialize();
	}

	/**
	 * The time in ms a server waits for a host to connect a notification
	 * connection in listen mode.
	 *
	 * @return The time in milliseconds.
	 */
	public static int getNotificationListenTimeout() {
		return notificationListenTimeout;
	}

	/**
	 * Gets the name of this class (e.g.,
	 * org.fosstrak.reader.msg.MessageLayer).
	 *
	 * @return The class name of this class
	 */
	public static String getClassname() {
		Class clazz = MessageLayer.class;
		return clazz.getName();
	}

	/**
	 * Gets the current CLASSPATH
	 *
	 * @return The CLASSPATH
	 */
	public static String getClasspath() {
		return System.getProperty("java.class.path");
	}

	/**
	 * Reads the management agent properties from a file.
	 *
	 * @param propFile
	 *            The properties file
	 * @throws ReaderProtocolException
	 */
	private void readMgmtAgentProperties(String propFile, String defaultPropFile) {
		XMLConfiguration conf;
      URL fileurl = ResourceLocator.getURL(propFile, defaultPropFile, this.getClass());
		try {
			conf = new XMLConfiguration(fileurl);
			MessageLayer.mgmtAgentType = AgentType.valueOf(conf.getString(
					"mgmtAgentType").toUpperCase());
			mgmtAgentAddress = conf.getString("mgmtAgentAddress");
			mgmtAgentPort = conf.getInt("mgmtAgentPort");
			mgmtSimulatorStart = conf.getBoolean("mgmtSimulatorStart");
		} catch (ConfigurationException e) {
			log.error("Failed to read the management agent information from "
					+ propFile + "\n -> Start default SNMP agent.");
			MessageLayer.mgmtAgentType = AgentType.SNMP;
		}
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -