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

📄 modemdriver.java

📁 基于java开发的一套短信应用框架
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
				answer = -1;
			}
			switch (answer)
			{
				case 0:
					gateway.getLogger().error("GSM: Auto-registration disabled!");
					throw new GatewayException("GSM Network Auto-Registration disabled!");
				case 1:
					gateway.getLogger().info("GSM: Registered to home network.");
					return true;
				case 2:
					gateway.getLogger().warn("GSM: Not registered, searching for network...");
					break;
				case 3:
					gateway.getLogger().error("GSM: Network registration denied!");
					throw new GatewayException("GSM Network Registration denied!");
				case 4:
					gateway.getLogger().error("GSM: Unknown registration error!");
					throw new GatewayException("GSM Network Registration error!");
				case 5:
					gateway.getLogger().info("GSM: Registered to foreign network (roaming).");
					return true;
				case -1:
					gateway.getLogger().info("GSM: Invalid CREG response.");
					throw new GatewayException("GSM: Invalid CREG response.");
			}
			Thread.sleep(15000);
		}
	}

	private String formatLog(StringBuffer s)
	{
		StringBuffer response = new StringBuffer();
		int i;
		char c;
		for (i = 0; i < s.length(); i++)
		{
			c = s.charAt(i);
			switch (c)
			{
				case 13:
					response.append("(cr)");
					break;
				case 10:
					response.append("(lf)");
					break;
				case 9:
					response.append("(tab)");
					break;
				default:
					if (((int) c >= 32) && ((int) c < 128))
					{
						response.append(c);
					}
					else
					{
						response.append("(" + (int) c + ")");
					}
					break;
			}
		}
		return response.toString();
	}

	private class CharQueue
	{
		byte[] buffer;

		int bufferStart, bufferEnd;

		public CharQueue()
		{
			buffer = new byte[BUFFER_SIZE];
			bufferStart = 0;
			bufferEnd = 0;
		}

		public synchronized void put(byte c)
		{
			buffer[bufferEnd] = c;
			bufferEnd++;
			if (bufferEnd == BUFFER_SIZE) bufferEnd = 0;
			if (ENABLE_QUEUE_DEBUG) gateway.getLogger().debug("IN READER QUEUE : " + (int) c + " / " + (char) c);
			notifyAll();
		}

		public synchronized byte get() throws TimeoutException, InterruptedException
		{
			byte c;
			if (bufferStart == bufferEnd) wait(RECEIVE_TIMEOUT);
			if (bufferStart == bufferEnd) throw new TimeoutException("No response from device.");
			c = buffer[bufferStart];
			bufferStart++;
			if (bufferStart == BUFFER_SIZE) bufferStart = 0;
			return c;
		}

		public synchronized byte peek() throws InterruptedException
		{
			if (bufferStart == bufferEnd) wait(RECEIVE_TIMEOUT);
			if (bufferStart == bufferEnd) return -1;
			return buffer[bufferStart];
		}

		public synchronized String peek(int sizeToRead)
		{
			int i, size;
			StringBuffer result;
			size = sizeToRead;
			if (bufferStart == bufferEnd) return "";
			result = new StringBuffer(size);
			i = bufferStart;
			while (size > 0)
			{
				if ((buffer[i] != 0x0a) && (buffer[i] != 0x0d))
				{
					result.append((char) buffer[i]);
					size--;
				}
				i++;
				if (i == BUFFER_SIZE) i = 0;
				if (i == bufferEnd) break;
			}
			return result.toString();
		}

		public synchronized void clear()
		{
			bufferStart = 0;
			bufferEnd = 0;
		}

		public void dump()
		{
			int i;
			i = bufferStart;
			while (i < bufferEnd)
			{
				System.out.println(buffer[i] + " -> " + (char) buffer[i]);
				i++;
			}
		}
	}

	private class ModemReader extends Thread
	{
		private KeepAlive keepAlive;

		public ModemReader(KeepAlive keepAlive)
		{
			this.keepAlive = keepAlive;
			start();
			gateway.getLogger().debug("ModemReader thread started.");
		}

		public void run()
		{
			int c;
			String data;
			while (connected)
			{
				try
				{
					synchronized (SYNC_Reader)
					{
						if (!dataReceived) SYNC_Reader.wait();
						if (!connected) break;
						c = read();
						while (c != -1)
						{
							queue.put((byte) c);
							if (!portHasData()) break;
							c = read();
						}
						dataReceived = false;
					}
					data = queue.peek(6);
					if ((data.indexOf("CMTI") >= 0) || (data.indexOf("CSDI") >= 0) || (data.indexOf("RING") >= 0)) keepAlive.interrupt();
				}
				catch (InterruptedException e)
				{
					if (!connected) break;
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
			}
			gateway.getLogger().debug("ModemReader thread ended.");
		}
	}

	private class KeepAlive extends Thread
	{
		public KeepAlive()
		{
			setPriority(MIN_PRIORITY);
			start();
			gateway.getLogger().debug("ModemDriver: KeepAlive thread started.");
		}

		public void run()
		{
			while (true)
			{
				try
				{
					try
					{
						sleep(KEEP_ALIVE);
					}
					catch (InterruptedException e)
					{
					}
					if (!connected) break;
					synchronized (SYNC_Commander)
					{
						if (!connected) break;
						gateway.getLogger().debug("** KeepAlive **");
						gateway.getATHandler().isAlive();
					}
				}
				catch (Exception e)
				{
					gateway.getLogger().error("ModemDriver: KeepAlive Error: " + e.getMessage());
				}
			}
			gateway.getLogger().debug("ModemDriver: KeepAlive thread ended.");
		}
	}

	private class AsyncNotifier extends Thread
	{
		private AsyncEvents event;

		private Object SYNC;

		public AsyncNotifier()
		{
			SYNC = new Object();
			setPriority(MIN_PRIORITY);
			start();
			gateway.getLogger().debug("AsyncNotifier thread started.");
		}

		protected void setEvent(AsyncEvents event)
		{
			synchronized (SYNC)
			{
				this.event = event;
				SYNC.notify();
			}
		}

		protected String getMemLoc(String indication)
		{
			Pattern p = Pattern.compile("\\+?\"\\S+\"");
			Matcher m = p.matcher(indication);
			if (m.find()) return indication.substring(m.start(), m.end()).replaceAll("\"", "");
			else return "";
		}

		protected int getMemIndex(String indication)
		{
			Pattern p = Pattern.compile("\\+?\\d+");
			Matcher m = p.matcher(indication);
			if (m.find()) return Integer.parseInt(indication.substring(m.start(), m.end()).replaceAll("\"", ""));
			else return -1;
		}

		protected String getOriginator(String indication)
		{
			Pattern p = Pattern.compile("\\+?\"\\S+\"");
			Matcher m = p.matcher(indication);
			if (m.find()) return indication.substring(m.start(), m.end()).replaceAll("\"", "");
			else return "";
		}

		public void run()
		{
			String response;
			while (true)
			{
				try
				{
					synchronized (SYNC)
					{
						SYNC.wait();
						if (!connected) break;
						if (event == AsyncEvents.INBOUNDMESSAGE)
						{
							event = AsyncEvents.NOTHING;
							response = gateway.getATHandler().getAsyncEventResponse(AsyncEvents.INBOUNDMESSAGE);
							if (gateway.getInboundNotification() != null) gateway.getInboundNotification().process(gateway.gtwId, MessageTypes.INBOUND, getMemLoc(response), getMemIndex(response));
						}
						else if (event == AsyncEvents.INBOUNDSTATUSREPORTMESSAGE)
						{
							event = AsyncEvents.NOTHING;
							response = gateway.getATHandler().getAsyncEventResponse(AsyncEvents.INBOUNDSTATUSREPORTMESSAGE);
							if (gateway.getInboundNotification() != null) gateway.getInboundNotification().process(gateway.gtwId, MessageTypes.STATUSREPORT, getMemLoc(response), getMemIndex(response));
						}
						else if (event == AsyncEvents.INBOUNDCALL)
						{
							event = AsyncEvents.NOTHING;
							response = gateway.getATHandler().getAsyncEventResponse(AsyncEvents.INBOUNDCALL);
							if (gateway.getCallNotification() != null) gateway.getCallNotification().process(gateway.gtwId, getOriginator(response));
						}
					}
				}
				catch (InterruptedException e)
				{
					if (!connected) break;
				}
				catch (Exception e)
				{
				}
			}
			gateway.getLogger().debug("AsyncNotifier thread ended.");
		}
	}

	int getLastError()
	{
		return lastError;
	}

	String getLastErrorText()
	{
		if (lastError == 0) return "OK";
		else if (lastError == -1) return "Invalid or empty response";
		else if ((lastError / 1000) == 5) return "CME Error " + (lastError % 1000);
		else if ((lastError / 1000) == 6) return "CMS Error " + (lastError % 1000);
		else return "Error: unknown";
	}

	boolean isOk()
	{
		return (lastError == OK);
	}
}

⌨️ 快捷键说明

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