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

📄 cservice.java

📁 开源的手机短信开发包!包括例子程序和比较详细的文档
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
								if (getSimPin() != null)
								{
									serialDriver.send(CATCommands.AT_CHECK_LOGIN);
									if (serialDriver.getResponse().indexOf(CATCommands.AT_READY) == -1)
									{
										if (getSimPin() == null)
										{
											serialDriver.close();
											setConnected(false);
											return ERR_SIM_PIN_ERROR;
										}
										else
										{
											serialDriver.send(CUtils.substituteSymbol(CATCommands.AT_LOGIN, "{1}", getSimPin()));
											if (serialDriver.getResponse().indexOf(CATCommands.AT_OK) == -1)
											{
												serialDriver.close();
												setConnected(false);
												return ERR_SIM_PIN_ERROR;
											}
											else
											{
												// Pin OK - wait 20 seconds for the GSM device to boot up...
												try { Thread.sleep(10000); } catch (Exception e) {}
												serialDriver.send(CATCommands.AT_AT); serialDriver.getResponse();
												try { Thread.sleep(10000); } catch (Exception e) {}
												serialDriver.send(CATCommands.AT_AT); serialDriver.getResponse();
											}
										}
									}
								}
 								serialDriver.send(CATCommands.AT_ASCII_MODE);
								if (serialDriver.getResponse().equalsIgnoreCase(CATCommands.AT_OK)) supportedModes |= MODE_ASCII;
								serialDriver.send(CATCommands.AT_PDU_MODE);
								if (serialDriver.getResponse().equalsIgnoreCase(CATCommands.AT_OK)) supportedModes |= MODE_PDU;
								if ((supportedModes & MODE_PDU) != 0) setOperationMode(MODE_PDU);
								else if ((supportedModes & MODE_ASCII) != 0) setOperationMode(MODE_ASCII);
								else setOperationMode(0);
								if (operationMode == 0)
								{
									serialDriver.close();
									setConnected(false);
									return ERR_COMM_NOT_SUPPORTED;
								}
								else
								{
									setConnected(true);
									refreshDeviceInfo();
									if ((deviceInfo.getManufacturer().toUpperCase().indexOf("ERICSSON") >= 0) && (deviceInfo.getModel().toUpperCase().indexOf("630") >= 0)) serialDriver.send(CATCommands.AT_ERICSSON_T630_DISABLE_INDICATIONS);
									else if (deviceInfo.getManufacturer().toUpperCase().indexOf("ERICSSON") >= 0) serialDriver.send(CATCommands.AT_ERICSSON_DISABLE_INDICATIONS);
									else serialDriver.send(CATCommands.AT_DISABLE_INDICATIONS);
									if (serialDriver.getResponse().equalsIgnoreCase(CATCommands.AT_OK))
									{
										if (operationMode == MODE_ASCII)
										{
											serialDriver.send(CATCommands.AT_CHARSET_HEX);
											if (serialDriver.getResponse().equalsIgnoreCase(CATCommands.AT_OK))
											{
												if (deviceInfo.getManufacturer().toUpperCase().indexOf("SIEMENS") >= 0)
												{
													serialDriver.send(CATCommands.AT_SIEMENS_SMS_STORAGE);
													serialDriver.getResponse();
												}
												else
													if (deviceInfo.getManufacturer().toUpperCase().indexOf("ERICSSON") >= 0)
													{
														serialDriver.send(CATCommands.AT_ERICSSON_SMS_STORAGE);
														serialDriver.getResponse();
													}
											}
											else
											{
												serialDriver.close();
												setConnected(false);
												return ERR_CHARSET_HEX_NOT_SUPPORTED;
											}
										}
										else
										{
											if (deviceInfo.getManufacturer().toUpperCase().indexOf("SIEMENS") >= 0)
											{
												serialDriver.send(CATCommands.AT_SIEMENS_SMS_STORAGE);
												serialDriver.getResponse();
											}
											else
												if (deviceInfo.getManufacturer().toUpperCase().indexOf("ERICSSON") >= 0)
												{
													serialDriver.send(CATCommands.AT_ERICSSON_SMS_STORAGE);
													serialDriver.getResponse();
												}
										}
									}
									else
									{
										serialDriver.close();
										setConnected(false);
										return ERR_CANNOT_DISABLE_INDICATIONS;
									}
								}
							}
							else
							{
								serialDriver.close();
								setConnected(false);
							}
						}
						else setConnected(false);
						return (getConnected() ? ERR_OK : ERR_NOT_CONNECTED);
					}
					catch (Exception e)
					{
						serialDriver.close();
						return ERR_NOT_CONNECTED;
					}
				}
			}
			else return ERR_NOT_INITIALIZED;
		}
	}

	/**
		Disconnects to the GSM device. Closes the serial port. 

		@return  ERR_OK value.
		@see	CService#connect()
	*/
	public int disconnect()
	{
		synchronized (_SYNC_)
		{
			try { serialDriver.close(); } catch (Exception e) {}
			setConnected(false);
			return ERR_OK;
		}
	}

	/**
		Loads the phonebook. The phonebook is an XML file containing associations of name
		and phone numbers.
		<br><br>
		<strong>The phonebook is optional.</strong> 

		@param	phoneBookFile	The XML full-path name which keeps the phonebook.
		@return  One of ERR_* values.
		@see	CPhoneBook
		@see	CService#sendMessage(COutgoingMessage)
		@see	CService#sendMessage(LinkedList)
	*/
	public int setPhoneBook(String phoneBookFile)
	{
		return (phoneBook.load(phoneBookFile) ? ERR_OK : ERR_PHONEBOOK_NOT_LOADED);
	}

	/**
		Refreshes the GSM device specific information. This method is called once during
		connection. Its up to the developer to call it periodically in order to get the latest
		information.

		@return  One of ERR_* values.
		@see	CDeviceInfo
		@see	CService#connect()
		@see	CService#getDeviceInfo()
	*/
	public int refreshDeviceInfo()
	{
		synchronized (_SYNC_)
		{
			if (getConnected())
				try
				{
					deviceInfo.manufacturer = getManufacturer();
					deviceInfo.model = getModel();
					deviceInfo.serialNo = getSerialNo();
					deviceInfo.imsi = getImsi();
					deviceInfo.swVersion = getSwVersion();
					deviceInfo.batteryLevel = getBatteryLevel();
					deviceInfo.signalLevel = getSignalLevel();
					return ERR_OK;
				}
				catch (Exception e)
				{
					e.printStackTrace();
					setConnected(false);
					return ERR_NOT_CONNECTED;
				}
			else return ERR_NOT_CONNECTED;
		}
	}

	/**
		Reads SMS from the GSM device's memory. You should call this method when
		you want to read messages from the device. In the MessageList object you
		pass, the method will add objects of type CIncomingMessage, as many of them
		as the messages pending to be read. The class defines which types of messages
		should be read.
		<br><br>
		<strong>Notes:</strong>
		<ul>
			<li>The method <strong>does not delete</strong> the messages it reads
				from the GSM device. It's your responsibility to delete them, if you
				don't want them. Otherwise, on the next call of this function you
				will read the same messages.</li>
		</ul>
		<strong>IMPORTANT NOTE:</strong> This version of jSMSEngine will read
		and process only received messages, and not stored messages - regardless
		of the class you requested.

		@param	messageList	a LinkedList object which will be loaded with the messages.
		@param	messageClass	one of the CLASS_* values defined in CIncomingMessage class which
				define what type of messages are to be read.
		@return  One of ERR_* values.
		@see	CIncomingMessage
		@see	CService#deleteMessage(CIncomingMessage)
		@see	CService#deleteMessage(int)
	*/
	public int readMessages(LinkedList messageList, int messageClass)
	{
		int i, j, memIndex;
		String response, line, sms, temp, originator, text, pdu;
		String day, month, year, hour, min, sec;
		BufferedReader reader;
		Date sentDate;
		Calendar cal = Calendar.getInstance();

		synchronized (_SYNC_)
		{
			if (getConnected())
			{
				switch (operationMode)
				{
					case MODE_ASCII:
						try
						{
							serialDriver.send(CATCommands.AT_CMD_MODE);
							messageList.clear();
							serialDriver.send(CATCommands.AT_ASCII_MODE);
							response = serialDriver.getResponse();
							serialDriver.send(CATCommands.AT_CHARSET_HEX);
							response = serialDriver.getResponse();
							switch (messageClass)
							{
								case CIncomingMessage.CLASS_ALL:
								serialDriver.send(CUtils.substituteSymbol(CATCommands.AT_LIST, "{1}", "\"ALL\""));
									break;
								case CIncomingMessage.CLASS_REC_UNREAD:
									serialDriver.send(CUtils.substituteSymbol(CATCommands.AT_LIST, "{1}", "\"REC UNREAD\""));
									break;
								case CIncomingMessage.CLASS_REC_READ:
									return ERR_NOT_SUPPORTED;
								case CIncomingMessage.CLASS_STO_UNSENT:
									return ERR_NOT_SUPPORTED;
								case CIncomingMessage.CLASS_STO_SENT:
									return ERR_NOT_SUPPORTED;
							}
							response = serialDriver.getResponse();
			
							sms = "";
							reader = new BufferedReader(new StringReader(response));
							line = reader.readLine();
							while ((line != null) && (!line.equalsIgnoreCase("OK")))
							{
								if (line.indexOf("+CMGL") == 0) sms = line;
								else if ((line.indexOf("+CMGL") == -1) && (line.length() > 0)) sms = sms + "~" + line;
								else sms = sms + "~" + "00";
			
								if ((sms.indexOf("\"REC READ\"") >= 0) || (sms.indexOf("\"REC UNREAD\"") >= 0))
								{
									if (sms.indexOf("~") != -1)
									{
										i = 6;
										temp = "";
										while (sms.charAt(i) != ',')
										{
											temp += sms.charAt(i);
											i ++;
										}
										memIndex = Integer.parseInt(temp.trim());
										i = sms.indexOf('"') + 1;
										i = sms.indexOf('"', i) + 1;
										i = sms.indexOf('"', i) + 1;
										temp = "";
										while (sms.charAt(i) != '"')
										{
											temp += sms.charAt(i);
											i ++;
										}
										originator = temp;
			
										i ++;
										i = sms.indexOf('"', i) + 1;
										day = sms.substring(i + 6, i + 6 + 2);
										month = sms.substring(i + 3, i + 3 + 2);
										year = sms.substring(i, i + 2); year = "20" + year;
										hour = sms.substring(i + 9, i + 9 + 2);
										min = sms.substring(i + 12, i + 12 + 2);
										sec = sms.substring(i + 15, i + 15 + 2);
										cal.set(Integer.parseInt(year), Integer.parseInt(month) - 1, Integer.parseInt(day), Integer.parseInt(hour), Integer.parseInt(min), Integer.parseInt(sec));
										sentDate = cal.getTime();
			
										i = sms.indexOf('~') + 1;
										text = sms.substring(i);
										if (text.equalsIgnoreCase("00")) messageList.add(new CIncomingMessage(sentDate, originator, "", memIndex));
										else messageList.add(new CIncomingMessage(sentDate, originator, CGSMAlphabets.hex2Text(text, CGSMAlphabets.GSM7BITDEFAULT), memIndex));
										deviceInfo.getStatistics().incTotalIn();
										sms = "";
									}
								}
								else if (sms.indexOf("\"STO SENT\"") >= 0);
								else if (sms.indexOf("\"STO UNSENT\"") >= 0);
								line = reader.readLine();
							}
							reader.close();
							return ERR_OK;
						}
						catch (Exception e)
						{
							e.printStackTrace();
							return ERR_GENERIC_ERROR;
						}
					case MODE_PDU:
						try
						{
							serialDriver.send(CATCommands.AT_CMD_MODE);
							messageList.clear();
							serialDriver.send(CATCommands.AT_PDU_MODE);
							response = serialDriver.getResponse();
							switch (messageClass)
							{
								case CIncomingMessage.CLASS_ALL:
									serialDriver.send(CUtils.substituteSymbol(CATCommands.AT_LIST, "{1}", "4"));
									break;
								case CIncomingMessage.CLASS_REC_UNREAD:
									serialDriver.send(CUtils.substituteSymbol(CATCommands.AT_LIST, "{1}", "0"));
									break;
								case CIncomingMessage.CLASS_REC_READ:
									serialDriver.send(CUtils.substituteSymbol(CATCommands.AT_LIST, "{1}", "1"));
									break;
								case CIncomingMessage.CLASS_STO_UNSENT:
									serialDriver.send(CUtils.substituteSymbol(CATCommands.AT_LIST, "{1}", "2"));
									break;
								case CIncomingMessage.CLASS_STO_SENT:
									serialDriver.send(CUtils.substituteSymbol(CATCommands.AT_LIST, "{1}", "3"));
									break;
							}
							response = serialDriver.getResponse();
							reader = new BufferedReader(new StringReader(response));
							line = reader.readLine().trim();
							while ((line != null) && (line.length() > 0) && (!line.equalsIgnoreCase("OK")))
							{
								i = line.indexOf(':');
								j = line.indexOf(',');
								memIndex = Integer.parseInt(line.substring(i + 1, j).trim());
								pdu = reader.readLine();
								if (isIncomingMessage(pdu))
								{
									messageList.add(new CIncomingMessage(pdu, memIndex));
									deviceInfo.getStatistics().incTotalIn();
								}
								else if (isStatusReportMessage(pdu))
								{
									messageList.add(new CStatusReportMessage(pdu, memIndex));
									deviceInfo.getStatistics().incTotalIn();
								}
								line = reader.readLine().trim();
							}
							reader.close();
							return ERR_OK;
						}
						catch (Exception e)
						{
							e.printStackTrace();
							return ERR_GENERIC_ERROR;
						}
					default:
						return ERR_GENERIC_ERROR;
				}
			}
			else return ERR_NOT_CONNECTED;
		}
	}

	/**
		Send an SMS message from the GSM device. Once connected, you can create a
		COutgoingMessage object with the message you want to send, and pass it
		to this function.
		<br><br>
		<strong>Notes:</strong>
		<ul>
			<li>If you have set a phonebook, you can create the COutgoingMessage
				object with a nickname, instead of the actual phone number.</li>
		</ul>

		@param	message	a COutgoingMessage containing the message you wish to send.
		@return  One of ERR_* values.
		@see	COutgoingMessage
		@see	CPhoneBook
		@see	CService#sendMessage(LinkedList)
		@see	CService#setPhoneBook(String)
	*/
	public int sendMessage(COutgoingMessage message)
	{
		LinkedList messageList;
		COutgoingMessage msg;
		int error;

		synchronized (_SYNC_)
		{
			messageList = new LinkedList();
			messageList.add(message);
			error = sendMessage(messageList);
			if (error == ERR_OK)
			{
				msg = (COutgoingMessage) messageList.get(0);
				message.setDispatchDate(msg.getDispatchDate());
			}
			return error;
		}
	}

	/**
		Send an series of SMS messages from the GSM device. This method is used
		when you want to send more than one message as a batch. If your GSM device
		support the feature of keeping the GSM link open during message dispatch,
		this method should work faster than calling the sendMessage(COutgoingMessage)
		method many times.
		<br>
		Just create a LinkedList object, add as many COutgoingMessage objects you wish
		and call the method.
		<br><br>
		<strong>Notes:</strong>
		<ul>
			<li>If you have set a phonebook, you can create the COutgoingMessage
				object with a nickname, instead of the actual phone number.</li>
		</ul>

		@param	messageList	a LinkedList filled with COutgoingMessage objects.
		@return  One of ERR_* values.
		@see	COutgoingMessage
		@see	CPhoneBook
		@see	CService#sendMessage(COutgoingMessage)
		@see	CService#setPhoneBook(String)
	*/
	public int sendMessage(LinkedList messageList)
	{
		LinkedList outList;
		COutgoingMessage message;
		String response, pdu;
		int i, j, error;

		synchronized (_SYNC_)
		{
			if (getConnected())
			{
				if (phoneBook.isLoaded()) outList = phoneBook.expandPhoneBookEntries(messageList);
				else outList = messageList;
				switch (operationMode)
				{
					case MODE_ASCII:
						try
						{
							serialDriver.send(CATCommands.AT_ASCII_MODE);
							response = serialDriver.getResponse();
							serialDriver.send(CATCommands.AT_KEEP_LINK_OPEN);
							response = serialDriver.getResponse();
							serialDriver.send(CATCommands.AT_CHARSET_HEX);

⌨️ 快捷键说明

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