📄 cservice.java
字号:
*/
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 + -