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

📄 cservice.java

📁 SMSLib一个很有用的程序
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
	 */
	public void connect() throws Exception
	{
		synchronized (_SYNC_)
		{
			if (getConnected()) throw new AlreadyConnectedException();
			else try
			{
				serialDriver.open();
				atHandler.sync();
				serialDriver.emptyBuffer();
				atHandler.reset();
				serialDriver.setNewMsgMonitor(newMsgMonitor);
				if (atHandler.isAlive())
				{
					if (atHandler.waitingForPin())
					{
						if (getSimPin() == null) throw new NoPinException();
						else if (!atHandler.enterPin(getSimPin())) throw new InvalidPinException();
					}
					atHandler.init();
					atHandler.echoOff();
					waitForNetworkRegistration();
					atHandler.setVerboseErrors();
					atHandler.getStorageLocations();
					if (log != null) log.info("MEM: Storage Locations Found: " + atHandler.storageLocations);
					switch (protocol)
					{
						case Protocol.PDU:
							if (log != null) log.info("PROT: Using PDU protocol.");
							if (!atHandler.setPduMode()) throw new NoPduSupportException();
							break;
						case Protocol.TEXT:
							if (log != null) log.info("PROT: Using TEXT protocol.");
							if (!atHandler.setTextMode()) throw new NoTextSupportException();
							break;
						default:
							throw new OopsException("Invalid protocol! Should be PDU or TEXT.");
					}
					connected = true;
					setReceiveMode(receiveMode);
					refreshDeviceInfo();

					receiveThread = new CReceiveThread();
					receiveThread.start();
					keepAliveThread = new CKeepAliveThread();
					keepAliveThread.start();
				}
				else throw new NotConnectedException("GSM device is not responding.");
			}
			catch (Exception e)
			{
				disconnect();
				throw e;
			}
		}
	}

	/**
	 * Disconnects from the GSM modem.
	 * <p>
	 * This should be the last function called. Closes serial connection, shuts down background threads and performs clean-up.
	 * <p>
	 * <strong>Notes</strong>
	 * <ul>
	 * <li>Do not connect and disconnect continously - at least if you can avoid it. It takes time and resources. Connect once and stay connected.</li>
	 * </ul>
	 * 
	 * @see CService#connect()
	 */
	public void disconnect() throws Exception
	{
		if (getConnected())
		{
			serialDriver.killMe();
			if (receiveThread != null)
			{
				receiveThread.killMe();
				receiveThread.interrupt();
				while (!receiveThread.killed())
					try
					{
						receiveThread.join();
					}
					catch (Exception e)
					{
					}
				receiveThread = null;
			}
			if (keepAliveThread != null)
			{
				keepAliveThread.killMe();
				keepAliveThread.interrupt();
				while (!keepAliveThread.killed())
					try
					{
						keepAliveThread.join();
					}
					catch (Exception e)
					{
					}
				keepAliveThread = null;
			}
			try
			{
				serialDriver.close();
			}
			catch (Exception e)
			{
			}
			connected = false;
		}
		else throw new NotConnectedException();
	}

	/**
	 * Reads all SMS messages from the GSM modem.
	 * 
	 * @param messageList
	 *            The list to be populated with messages.
	 * @param messageClass
	 *            The message class of the messages to read.
	 * @throws NotConnectedException
	 *             Either connect() is not called or modem has been disconnected.
	 * @see CService#readMessages(LinkedList, int, int)
	 * @see CIncomingMessage
	 * @see CIncomingMessage.MessageClass
	 * @see CService#sendMessage(COutgoingMessage)
	 */
	public void readMessages(LinkedList messageList, int messageClass) throws Exception
	{
		switch (protocol)
		{
			case Protocol.PDU:
				readMessages_PDU(messageList, messageClass, 0);
				break;
			case Protocol.TEXT:
				readMessages_TEXT(messageList, messageClass, 0);
		}
	}

	/**
	 * Reads up to a specific number of SMS messages from the GSM modem.
	 * 
	 * @param messageList
	 *            The list to be populated with messages.
	 * @param messageClass
	 *            The message class of the messages to read.
	 * @param limit
	 *            Read up to <limit> number of messages. If limit is set to 0, read all messages.
	 * @throws NotConnectedException
	 *             Either connect() is not called or modem has been disconnected.
	 * @see CService#readMessages(LinkedList, int)
	 * @see CIncomingMessage
	 * @see CIncomingMessage.MessageClass
	 * @see CService#sendMessage(COutgoingMessage)
	 */
	public void readMessages(LinkedList messageList, int messageClass, int limit) throws Exception
	{
		switch (protocol)
		{
			case Protocol.PDU:
				readMessages_PDU(messageList, messageClass, limit);
				break;
			case Protocol.TEXT:
				readMessages_TEXT(messageList, messageClass, limit);
				break;
		}
	}

	@SuppressWarnings("unchecked")
	private void readMessages_PDU(LinkedList messageList, int messageClass, int limit) throws Exception
	{
		int i, j, memIndex;
		String response, line, pdu;
		BufferedReader reader;
		CIncomingMessage mpMsg;

		if (limit < 0) limit = 0;
		mpMsg = null;
		synchronized (_SYNC_)
		{
			if (getConnected())
			{
				atHandler.switchToCmdMode();
				for (int ml = 0; ml < (atHandler.storageLocations.length() / 2); ml++)
				{
					if (atHandler.setMemoryLocation(atHandler.storageLocations.substring((ml * 2), (ml * 2) + 2)))
					{
						response = atHandler.listMessages(messageClass);
						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());
							pdu = reader.readLine().trim();
							try
							{
								if (isIncomingMessage(pdu))
								{
									CIncomingMessage msg;

									msg = new CIncomingMessage(pdu, memIndex, atHandler.storageLocations.substring((ml * 2), (ml * 2) + 2));
									if (log != null) log.debug("IN-DTLS: MI:" + msg.getMemIndex() + " REF:" + msg.getMpRefNo() + " MAX:" + msg.getMpMaxNo() + " SEQ:" + msg.getMpSeqNo());
									if (msg.getMpRefNo() == 0)
									{
										if (mpMsg != null) mpMsg = null;
										messageList.add(msg);
										deviceInfo.getStatistics().incTotalIn();
									}
									else
									{
										int k, l;
										LinkedList tmpList;
										CIncomingMessage listMsg;
										boolean found, duplicate;

										found = false;
										for (k = 0; k < mpMsgList.size(); k++)
										{
											tmpList = (LinkedList) mpMsgList.get(k);
											listMsg = (CIncomingMessage) tmpList.get(0);
											if (listMsg.getMpRefNo() == msg.getMpRefNo())
											{
												duplicate = false;
												for (l = 0; l < tmpList.size(); l++)
												{
													listMsg = (CIncomingMessage) tmpList.get(l);
													if (listMsg.getMpSeqNo() == msg.getMpSeqNo())
													{
														duplicate = true;
														break;
													}
												}
												if (!duplicate) tmpList.add(msg);
												found = true;
												break;
											}
										}
										if (!found)
										{
											tmpList = new LinkedList();
											tmpList.add(msg);
											mpMsgList.add(tmpList);
										}
									}
								}
								else if (isStatusReportMessage(pdu))
								{
									messageList.add(new CStatusReportMessage(pdu, memIndex, atHandler.storageLocations.substring((ml * 2), (ml * 2) + 2)));
									deviceInfo.getStatistics().incTotalIn();
								}
							}
							catch (Exception e)
							{
								if (log != null)
								{
									log.error("*****");
									log.error("Unhandled SMS in inbox, skipping!");
									log.error("Err: " + e.getMessage());
									log.error("*****");
								}
							}
							line = reader.readLine().trim();
							while (line.length() == 0)
								line = reader.readLine().trim();
							if ((limit > 0) && (messageList.size() == limit)) break;
						}
						reader.close();
					}
				}
			}
			else throw new NotConnectedException();
		}
		checkMpMsgList(messageList);
	}

	@SuppressWarnings("unchecked")
	private void readMessages_TEXT(LinkedList messageList, int messageClass, int limit) throws Exception
	{
		int i, j, memIndex;
		byte[] bytes;
		String response, line, msgText, originator, dateStr, refNo;
		BufferedReader reader;
		StringTokenizer tokens;
		CIncomingMessage msg;
		Calendar cal1 = Calendar.getInstance();
		Calendar cal2 = Calendar.getInstance();

		if (limit < 0) limit = 0;
		synchronized (_SYNC_)
		{
			if (getConnected())
			{
				atHandler.switchToCmdMode();
				for (int ml = 0; ml < (atHandler.storageLocations.length() / 2); ml++)
				{
					if (atHandler.setMemoryLocation(atHandler.storageLocations.substring((ml * 2), (ml * 2) + 2)))
					{
						response = atHandler.listMessages(messageClass);
						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 CStatusReportMessage(Integer.parseInt(refNo), memIndex, atHandler.storageLocations.substring((ml * 2), (ml * 2) + 2), cal1.getTime(), cal2.getTime());
								if (log != null) log.debug("IN-DTLS: MI:" + msg.getMemIndex());
								messageList.add(msg);
								deviceInfo.getStatistics().incTotalIn();
							}
							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 = CGSMAlphabet.bytesToString(bytes);
								msg = new CIncomingMessage(cal1.getTime(), originator, msgText, memIndex, atHandler.storageLocations.substring((ml * 2), (ml * 2) + 2));
								if (log != null) log.debug("IN-DTLS: MI:" + msg.getMemIndex());
								messageList.add(msg);
								deviceInfo.getStatistics().incTotalIn();
							}
							line = reader.readLine().trim();
							while (line.length() == 0)
								line = reader.readLine().trim();
						}
						reader.close();
					}
				}
			}
			else throw new NotConnectedException();
		}
	}

	@SuppressWarnings("unchecked")
	private void checkMpMsgList(LinkedList messageList)
	{
		int k, l, m;
		LinkedList tmpList;
		CIncomingMessage listMsg, mpMsg;
		boolean found;

		mpMsg = null;
		if (log != null) log.debug("CheckMpMsgList(): MAINLIST: " + mpMsgList.size());
		for (k = 0; k < mpMsgList.size(); k++)
		{
			tmpList = (LinkedList) mpMsgList.get(k);
			if (log != null) log.debug("CheckMpMsgList(): SUBLIST[" + k + "]: " + tmpList.size());
			listMsg = (CIncomingMessage) tmpList.get(0);
			found = false;
			if (listMsg.getMpMaxNo() == tmpList.size())
			{
				found = true;
				for (l = 0; l < tmpList.size(); l++)
					for (m = 0; m < tmpList.size(); m++)
					{
						listMsg = (CIncomingMessage) tmpList.get(m);
						if (listMsg.getMpSeqNo() == (l + 1))
						{
							if (listMsg.getMpSeqNo() == 1)
							{
								mpMsg = listMsg;
								mpMsg.setMpMemIndex(mpMsg.getMemIndex());
							}
							else
							{
								if (mpMsg != null)
								{
									mpMsg.addText(listMsg.getText());
									mpMsg.setMpSeqNo(listMsg.getMpSeqNo());
									mpMsg.setMpMemIndex(listMsg.getMemIndex());
									if (listMsg.getMpSeqNo() == listMsg.getMpMaxNo())
									{
										mpMsg.setMemIndex(-1);
										messageList.add(mpMsg);
										mpMsg = null;
									}
								}
							}
							break;
						}
					}
				tmpList.clear();
				tmpList = null;
			}
			if (found)
			{
				mpMsgList.remove(k);
				k--;
			}
		}
	}

	/**
	 * Sends an SMS message from the GSM modem.
	 * <p>
	 * This method actually wraps the message in a list and calls #sendMessage(List) that does the job.
	 * 
	 * @param message
	 *            The message to be sent.
	 * @throws NotConnectedException
	 *             Either connect() is not called or modem has been disconnected.
	 * @see CService#sendMessage(LinkedList)
	 * @see CService#readMessages(LinkedList, int)
	 */
	@SuppressWarnings("unchecked")
	public void sendMessage(COutgoingMessage message) throws Exception
	{
		LinkedList messageList;

		messageList = new LinkedList();
		messageList.add(message);
		sendMessage(messageList);
	}

	/**
	 * Sends a list of messages from the GSM modem.
	 * <p>
	 * The function iterates through the supplied list of COutgoingMessage objects and tries to send them.
	 * <p>
	 * Upon succesful sending, each COutgoingMessage object should have its RefNo and DispatchDate fields set to specific values. Upon failure, the RefNo will be set to 0 and DispatchDate set to null.
	 * 
	 * @param messageList
	 *            A list of COutgoingMessage objects presenting messages that will be sent out.
	 * @throws NotConnectedException
	 *             Either connect() is not called or modem has been disconnected.
	 * @see CService#sendMessage(COutgoingMessage)
	 * @see COutgoingMessage
	 * @see CWapSIMessage
	 * @see CService#readMessages(LinkedList, int)
	 */
	public void sendMessage(LinkedList messageList) throws Exception
	{
		switch (protocol)
		{
			case Protocol.PDU:
				sendMessage_PDU(messageList);
				break;
			case Protocol.TEXT:
				sendMessage_TEXT(messageList);
				break;
		}
	}

	private void sendMessage_PDU(LinkedList messageList) throws Exception
	{
		COutgoingMessage message;
		int i, j, refNo;
		String pdu;

		if (getConnected())
		{
			synchronized (_SYNC_)
			{
				atHandler.keepGsmLinkOpen();
			}
			for (i = 0; i < messageList.size(); i++)
			{

⌨️ 快捷键说明

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