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

📄 amodemdriver.java

📁 发送短信 接收短信 多种接口com/net/modem 开发库
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
		}
		catch (TimeoutException e)
		{
			getGateway().getService().getLogger().logDebug("Buffer contents on timeout: " + buffer, null, getGateway().getGatewayId());
			throw e;
		}
		return buffer.toString();
	}

	public void clearBuffer() throws IOException, InterruptedException
	{
		synchronized (getSYNCCommander())
		{
			getGateway().getService().getLogger().logDebug("clearBuffer() called.", null, getGateway().getGatewayId());
			Thread.sleep(getGateway().getService().getSettings().SERIAL_CLEAR_WAIT);
			clear();
			getCharQueue().clear();
		}
	}

	protected boolean waitForNetworkRegistration() throws GatewayException, TimeoutException, IOException, InterruptedException
	{
		//TODO: Move the magic number "6" (network retries) to settings(?)
		StringTokenizer tokens;
		String response;
		int answer;
		int retries = 0;
		while (true)
		{
			response = getGateway().getATHandler().getNetworkRegistration();
			if (response.indexOf("ERROR") > 0) return false;
			response = response.replaceAll("\\s+OK\\s+", "");
			response = response.replaceAll("\\s+", "");
			response = response.replaceAll("\\+CREG:", "");
			tokens = new StringTokenizer(response, ",");
			tokens.nextToken();
			try
			{
				answer = Integer.parseInt(tokens.nextToken());
			}
			catch (Exception e)
			{
				answer = -1;
			}
			switch (answer)
			{
				case 0:
					getGateway().getService().getLogger().logError("GSM: Auto-registration disabled!", null, getGateway().getGatewayId());
					throw new GatewayException("GSM Network Auto-Registration disabled!");
				case 1:
					getGateway().getService().getLogger().logInfo("GSM: Registered to home network.", null, getGateway().getGatewayId());
					return true;
				case 2:
					getGateway().getService().getLogger().logWarn("GSM: Not registered, searching for network...", null, getGateway().getGatewayId());
					if (++retries == 6) throw new GatewayException("GSM Network Registration failed, give up trying!");
					break;
				case 3:
					getGateway().getService().getLogger().logError("GSM: Network registration denied!", null, getGateway().getGatewayId());
					throw new GatewayException("GSM Network Registration denied!");
				case 4:
					getGateway().getService().getLogger().logError("GSM: Unknown registration error!", null, getGateway().getGatewayId());
					throw new GatewayException("GSM Network Registration error!");
				case 5:
					getGateway().getService().getLogger().logInfo("GSM: Registered to foreign network (roaming).", null, getGateway().getGatewayId());
					return true;
				case -1:
					getGateway().getService().getLogger().logInfo("GSM: Invalid CREG response.", null, getGateway().getGatewayId());
					throw new GatewayException("GSM: Invalid CREG response.");
			}
			Thread.sleep(getGateway().getService().getSettings().AT_WAIT_NETWORK);
		}
	}

	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 ((c >= 32) && (c < 128))
					{
						response.append(c);
					}
					else
					{
						response.append("(" + (int) c + ")");
					}
					break;
			}
		}
		return response.toString();
	}

	private class CharQueue
	{
		byte[] buffer;

		int bufferStart, bufferEnd;

		public CharQueue()
		{
			this.buffer = null;
			this.bufferStart = 0;
			this.bufferEnd = 0;
		}

		public synchronized void put(byte c)
		{
			if (this.buffer == null) this.buffer = new byte[getGateway().getService().getSettings().SERIAL_BUFFER_SIZE];
			this.buffer[this.bufferEnd] = c;
			this.bufferEnd++;
			if (this.bufferEnd == getGateway().getService().getSettings().SERIAL_BUFFER_SIZE) this.bufferEnd = 0;
			if (System.getProperty("smslib.dumpqueues") != null) getGateway().getService().getLogger().logDebug("IN READER QUEUE : " + (int) c + " / " + (char) c, null, getGateway().getGatewayId());
			notifyAll();
		}

		public synchronized void put(String s)
		{
			for (int i = 0; i < s.length(); i++)
				put((byte) s.charAt(i));
		}

		public synchronized byte get() throws TimeoutException, InterruptedException
		{
			byte c;
			if (this.buffer == null) this.buffer = new byte[getGateway().getService().getSettings().SERIAL_BUFFER_SIZE];
			while (true)
			{
				try
				{
					if (this.bufferStart == this.bufferEnd) wait(getGateway().getService().getSettings().SERIAL_TIMEOUT);
					if (this.bufferStart == this.bufferEnd) throw new TimeoutException("No response from device.");
					c = this.buffer[this.bufferStart];
					this.bufferStart++;
					if (this.bufferStart == getGateway().getService().getSettings().SERIAL_BUFFER_SIZE) this.bufferStart = 0;
					return c;
				}
				catch (InterruptedException e)
				{
					if (getGateway().getStatus() == GatewayStatuses.STARTED) getGateway().getService().getLogger().logWarn("Ignoring InterruptedException in Queue.get().", null, getGateway().getGatewayId());
					else
					{
						getGateway().getService().getLogger().logWarn("Re-throwing InterruptedException in Queue.get() - should be during shutdown...", null, getGateway().getGatewayId());
						throw new InterruptedException();
					}
				}
			}
		}

		public synchronized byte peek() throws InterruptedException
		{
			if (this.buffer == null) this.buffer = new byte[getGateway().getService().getSettings().SERIAL_BUFFER_SIZE];
			while (true)
			{
				try
				{
					if (this.bufferStart == this.bufferEnd) wait(getGateway().getService().getSettings().SERIAL_TIMEOUT);
					if (this.bufferStart == this.bufferEnd) return -1;
					return this.buffer[this.bufferStart];
				}
				catch (InterruptedException e)
				{
					if (getGateway().getStatus() == GatewayStatuses.STARTED) getGateway().getService().getLogger().logWarn("Ignoring InterruptedException in Queue.peek().", e, getGateway().getGatewayId());
					else
					{
						getGateway().getService().getLogger().logWarn("Re-throwing InterruptedException in Queue.peek() - should be during shutdown...", e, getGateway().getGatewayId());
						throw new InterruptedException();
					}
				}
			}
		}

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

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

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

	private class ModemReader extends Thread
	{
		public ModemReader()
		{
			setName("SMSlib-ModemReader-" + getGateway().getGatewayId());
			setDaemon(true);
			start();
			getGateway().getService().getLogger().logDebug("ModemReader thread started.", null, getGateway().getGatewayId());
		}

		@Override
		public void run()
		{
			int c;
			String data;
			while (isConnected())
			{
				try
				{
					synchronized (getSYNCReader())
					{
						if (!isDataReceived()) getSYNCReader().wait();
						if (!isConnected()) break;
						c = read();
						while (c != -1)
						{
							getCharQueue().put((byte) c);
							if (!portHasData()) break;
							c = read();
						}
						setDataReceived(false);
					}
					data = getCharQueue().peek(6);
					for (int i = 0; i < getGateway().getATHandler().getUnsolicitedResponses().length; i++)
					{
						if (data.indexOf(getGateway().getATHandler().getUnsolicitedResponse(i)) >= 0)
						{
							getGateway().getService().getScheduler().executeOnceAfter(getKeepAlive(), 100, TimeUnit.MILLISECONDS);
							break;
						}
					}
				}
				catch (InterruptedException e)
				{
					if (!isConnected()) break;
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
			}
			getGateway().getService().getLogger().logDebug("ModemReader thread ended.", null, getGateway().getGatewayId());
		}
	}

	private class KeepAlive extends ASchedulerTask
	{
		public KeepAlive(String myName, Service myService)
		{
			super(myName, myService);
		}

		public void process()
		{
			try
			{
				if (!isConnected()) return;
				if (getGateway().getStatus() == GatewayStatuses.STARTED)
				{
					synchronized (getSYNCCommander())
					{
						if (!isConnected()) return;
						getGateway().getService().getLogger().logDebug("** KeepAlive START **", null, getGateway().getGatewayId());
						try
						{
							if (!getGateway().getATHandler().isAlive()) getGateway().setStatus(GatewayStatuses.RESTART);
						}
						catch (Exception e)
						{
							getGateway().setStatus(GatewayStatuses.RESTART);
						}
						getGateway().getService().getLogger().logDebug("** KeepAlive END **", null, getGateway().getGatewayId());
					}
				}
			}
			catch (Exception e)
			{
				getGateway().getService().getLogger().logError("ModemDriver: KeepAlive Error.", e, getGateway().getGatewayId());
				getGateway().setStatus(GatewayStatuses.RESTART);
			}
		}
	}

	private class AsyncNotifier extends Thread
	{
		class Event
		{
			AsyncEvents event;

			String response;

			public Event(AsyncEvents myEvent, String myResponse)
			{
				this.event = myEvent;
				this.response = myResponse;
			}

			@Override
			public String toString()
			{
				return "Event: " + this.event + " / Response: " + this.response;
			}
		}

		private BlockingQueue<Event> eventQueue;

		private Object SYNC;

		public AsyncNotifier()
		{
			this.SYNC = new Object();
			this.eventQueue = new LinkedBlockingQueue<Event>();
			setPriority(MIN_PRIORITY);
			setName("SMSLib-AsyncNotifier : " + getGateway().getGatewayId());
			setDaemon(true);
			start();
			getGateway().getService().getLogger().logDebug("AsyncNotifier thread started.", null, getGateway().getGatewayId());
		}

		protected void setEvent(AsyncEvents event, String response)
		{
			synchronized (this.SYNC)
			{
				Event ev = new Event(event, response);
				getGateway().getService().getLogger().logDebug("Storing AsyncEvent: " + ev, null, getGateway().getGatewayId());
				this.eventQueue.add(ev);
				this.SYNC.notify();
			}
		}

		protected String getMemLoc(String indication)

⌨️ 快捷键说明

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