📄 cservice.java
字号:
message = (COutgoingMessage) messageList.get(i);
if (!message.isBig())
{
pdu = message.getPDU(smscNumber, 0, 0);
j = pdu.length();
j /= 2;
if (smscNumber == null)
; // Do nothing on purpose!
else if (smscNumber.length() == 0) j--;
else
{
int smscNumberLen = smscNumber.length();
if (smscNumber.charAt(0) == '+') smscNumberLen--;
if (smscNumberLen % 2 != 0) smscNumberLen++;
int smscLen = (2 + smscNumberLen) / 2;
j = j - smscLen - 1;
}
synchronized (_SYNC_)
{
refNo = atHandler.sendMessage(j, pdu, null, null);
}
if (refNo >= 0)
{
message.setRefNo(refNo);
message.dispatchDate = new Date();
deviceInfo.getStatistics().incTotalOut();
}
else if (refNo == -2)
{
disconnect();
break;
}
else message.dispatchDate = null;
}
else
{
for (int partNo = 1; partNo <= message.getNoOfParts(); partNo++)
{
pdu = message.getPDU(smscNumber, outMpRefNo, partNo);
j = pdu.length();
j /= 2;
if (smscNumber == null)
; // Do nothing on purpose!
else if (smscNumber.length() == 0) j--;
else
{
int smscNumberLen = smscNumber.length();
if (smscNumber.charAt(0) == '+') smscNumberLen--;
if (smscNumberLen % 2 != 0) smscNumberLen++;
int smscLen = (2 + smscNumberLen) / 2;
j = j - smscLen - 1;
}
synchronized (_SYNC_)
{
refNo = atHandler.sendMessage(j, pdu, null, null);
}
if (refNo >= 0)
{
message.setRefNo(refNo);
message.dispatchDate = new Date();
deviceInfo.getStatistics().incTotalOut();
}
else if (refNo == -2)
{
disconnect();
break;
}
else message.dispatchDate = null;
}
outMpRefNo = (outMpRefNo + 1) % 65536;
}
}
}
else throw new NotConnectedException();
}
private void sendMessage_TEXT(LinkedList messageList) throws Exception
{
COutgoingMessage message;
byte[] bytes;
StringBuffer hexText = new StringBuffer();
int i, j, n, refNo;
if (getConnected())
{
for (i = 0; i < messageList.size(); i++)
{
hexText.delete(0, hexText.length());
message = (COutgoingMessage) messageList.get(i);
bytes = new byte[400];
n = CGSMAlphabet.stringToBytes(message.getText(), bytes);
for (j = 0; j < n; j++)
hexText.append(Integer.toHexString(bytes[j]).toUpperCase());
synchronized (_SYNC_)
{
refNo = atHandler.sendMessage(0, null, message.getRecipient(), hexText.toString());
}
if (refNo >= 0)
{
message.setRefNo(refNo);
message.dispatchDate = new Date();
deviceInfo.getStatistics().incTotalOut();
}
else message.dispatchDate = null;
}
}
else throw new NotConnectedException();
}
protected void deleteMessage(int memIndex, String memLocation) throws Exception
{
synchronized (_SYNC_)
{
if (getConnected()) atHandler.deleteMessage(memIndex, memLocation);
else throw new NotConnectedException();
}
}
/**
* Deletes a message from the modem's memory.
* <p>
* <strong>Warning</strong>: Do not pass invalid CIncomingMessage objects to this call - You may corrupt your modem's storage!
* <p>
* Delete operations are irreversible.
*
* @param message
* The CIncomingMessage object previously read with readMessages() call.
* @throws NotConnectedException
* Either connect() is not called or modem has been disconnected.
* @see CIncomingMessage
* @see CService#readMessages(LinkedList, int)
*/
public void deleteMessage(CIncomingMessage message) throws Exception
{
synchronized (_SYNC_)
{
if (message.getMemIndex() >= 0) deleteMessage(message.getMemIndex(), message.getMemLocation());
else if ((message.getMemIndex() == -1) && (message.getMpMemIndex().length() != 0))
{
StringTokenizer tokens = new StringTokenizer(message.getMpMemIndex(), ",");
while (tokens.hasMoreTokens())
deleteMessage(Integer.parseInt(tokens.nextToken()), message.getMemLocation());
}
}
}
/**
* Deletes ALL messages of the specified message class.
* <p>
* Delete operations are irreversible.
*
* @param messageClass
* The message class.
* @throws NotConnectedException
* Either connect() is not called or modem has been disconnected.
* @see CIncomingMessage.MessageClass
*/
public void deleteMessages(int messageClass) throws Exception
{
LinkedList msgList;
synchronized (_SYNC_)
{
msgList = new LinkedList();
readMessages(msgList, messageClass);
for (int i = 0; i < msgList.size(); i++)
deleteMessage((CIncomingMessage) msgList.get(i));
}
}
/**
* Reads (or refreshes) all GSM modem information (like manufacturer, signal level, etc).
* <p>
* This method is called automatically upon connection. Should you require fresh info, you should call it yourself when you need it.
*
* @throws NotConnectedException
* Either connect() is not called or modem has been disconnected.
* @see CDeviceInfo
*/
public void refreshDeviceInfo() throws Exception
{
synchronized (_SYNC_)
{
if (getConnected())
{
if (deviceInfo.manufacturer.length() == 0) deviceInfo.manufacturer = getManufacturer();
if (deviceInfo.model.length() == 0) deviceInfo.model = getModel();
if (deviceInfo.serialNo.length() == 0) deviceInfo.serialNo = getSerialNo();
if (deviceInfo.imsi.length() == 0) deviceInfo.imsi = getImsi();
if (deviceInfo.swVersion.length() == 0) deviceInfo.swVersion = getSwVersion();
deviceInfo.gprsStatus = getGprsStatus();
deviceInfo.batteryLevel = getBatteryLevel();
deviceInfo.signalLevel = getSignalLevel();
}
else throw new NotConnectedException();
}
}
public void catchAsyncException(Exception e)
{
e.printStackTrace();
}
protected boolean isAlive()
{
boolean alive;
if (!connected) alive = false;
else try
{
alive = atHandler.isAlive();
}
catch (Exception e)
{
alive = false;
}
return alive;
}
private boolean waitForNetworkRegistration() throws Exception
{
StringTokenizer tokens;
String response, flag;
while (true)
{
response = atHandler.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, ",");
try
{
tokens.nextToken();
flag = tokens.nextToken();
switch (Integer.parseInt(flag))
{
case 0:
if (log != null) log.error("GSM: Auto-registration disabled!");
throw new OopsException("GSM Network Auto-Registration disabled!");
case 1:
if (log != null) log.info("GSM: Registered to home network.");
return true;
case 2:
if (log != null) log.warn("GSM: Not registered, searching for network...");
break;
case 3:
if (log != null) log.error("GSM: Network registration denied!");
throw new OopsException("GSM Network Registration denied!");
case 4:
if (log != null) log.error("GSM: Unknown registration error!");
throw new OopsException("GSM Network Registration error!");
case 5:
if (log != null) log.info("GSM: Registered to foreign network (roaming).");
return true;
}
}
catch (Exception e)
{
if (log != null) log.warn("waitForNetworkRegistration(): Invalid response, keep searching for network...");
}
Thread.sleep(5000);
}
}
/**
* Send a custom AT command to the modem and returns its response.
*
* @param cmd
* The custom AT command
* @return The modem response
*/
public String sendCustomCmd(String cmd) throws Exception
{
synchronized (_SYNC_)
{
return atHandler.send(cmd);
}
}
private String getManufacturer() throws Exception
{
String response;
response = atHandler.getManufacturer();
if (response.matches("\\s*[\\p{ASCII}]*\\s+ERROR(?:: \\d+)?\\s+")) return VALUE_NOT_REPORTED;
response = response.replaceAll("\\s+OK\\s+", "");
response = response.replaceAll("\\s+", "");
return response;
}
private String getModel() throws Exception
{
String response;
response = atHandler.getModel();
if (response.matches("\\s*[\\p{ASCII}]*\\s+ERROR(?:: \\d+)?\\s+")) return VALUE_NOT_REPORTED;
response = response.replaceAll("\\s+OK\\s+", "");
response = response.replaceAll("\\s+", "");
return response;
}
private String getSerialNo() throws Exception
{
String response;
response = atHandler.getSerialNo();
if (response.matches("\\s*[\\p{ASCII}]*\\s+ERROR(?:: \\d+)?\\s+")) return VALUE_NOT_REPORTED;
response = response.replaceAll("\\s+OK\\s+", "");
response = response.replaceAll("\\s+", "");
return response;
}
private String getImsi() throws Exception
{
return "** MASKED **";
// IMSI is masked on purpose.
// Uncomment following code for IMSI to be reported.
//
// String response; response = atHandler.getImsi(); if
// (response.matches("\\s*[\\p{ASCII}]*\\s+ERROR(?:: \\d+)?\\s+"))
// return VALUE_NOT_REPORTED; response =
// response.replaceAll("\\s+OK\\s+", ""); response =
// response.replaceAll("\\s+", ""); return response;
//
}
private String getSwVersion() throws Exception
{
String response;
response = atHandler.getSwVersion();
if (response.matches("\\s*[\\p{ASCII}]*\\s+ERROR(?:: \\d+)?\\s+")) return VALUE_NOT_REPORTED;
response = response.replaceAll("\\s+OK\\s+", "");
response = response.replaceAll("\\s+", "");
return response;
}
private boolean getGprsStatus() throws Exception
{
return (atHandler.getGprsStatus().matches("\\s*CGATT:\\s1"));
}
private int getBatteryLevel() throws Exception
{
String response;
StringTokenizer tokens;
response = atHandler.getBatteryLevel();
if (response.matches("\\s*[\\p{ASCII}]*\\s+ERROR(?:: \\d+)?\\s+")) return 0;
response = response.replaceAll("\\s+OK\\s+", "");
response = response.replaceAll("\\s+", "");
tokens = new StringTokenizer(response, ":,");
tokens.nextToken();
tokens.nextToken();
return Integer.parseInt(tokens.nextToken());
}
private int getSignalLevel() throws Exception
{
String response;
StringTokenizer tokens;
response = atHandler.getSignalLevel();
if (response.matches("\\s*[\\p{ASCII}]*\\s+ERROR(?:: \\d+)?\\s+")) return 0;
response = response.replaceAll("\\s+OK\\s+", "");
response = response.replaceAll("\\s+", "");
tokens = new StringTokenizer(response, ":,");
tokens.nextToken();
return (Integer.parseInt(tokens.nextToken().trim()) * 100 / 31);
}
private boolean isIncomingMessage(String pdu)
{
int index, i;
i = Integer.parseInt(pdu.substring(0, 2), 16);
index = (i + 1) * 2;
i = Integer.parseInt(pdu.substring(index, index + 2), 16);
if ((i & 0x03) == 0) return true;
else return false;
}
private boolean isStatusReportMessage(String pdu)
{
int index, i;
i = Integer.parseInt(pdu.substring(0, 2), 16);
index = (i + 1) * 2;
i = Integer.parseInt(pdu.substring(index, index + 2), 16);
if ((i & 0x02) == 2) return true;
else return false;
}
public boolean received(CIncomingMessage message)
{
return false;
}
private class CKeepAliveThread extends Thread
{
private boolean stopFlag;
private boolean stopped;
public CKeepAliveThread()
{
stopFlag = false;
stopped = false;
}
public void killMe()
{
stopFlag = true;
}
public boolean killed()
{
return stopped;
}
public void run()
{
while (!stopFlag)
{
try
{
sleep(keepAliveInterval);
}
catch (Exception e)
{
}
if (stopFlag) break;
synchronized (_SYNC_)
{
if (getConnected()) try
{
if (log != null) log.info("** Keep-Live **");
atHandler.isAlive();
}
catch (Exception e)
{
}
}
}
stopped = true;
}
}
private class CReceiveThread extends Thread
{
private boolean stopFlag;
private boolean stopped;
public CReceiveThread()
{
stopFlag = false;
stopped = false;
}
public void killMe()
{
stopFlag = true;
}
public boolean killed()
{
return stopped;
}
public void run()
{
LinkedList messageList;
messageList = new LinkedList();
while (!stopFlag)
{
int state = newMsgMonitor.waitEvent(asyncPollInterval);
if (stopFlag) break;
if (getConnected() && (receiveMode == ReceiveMode.AsyncCnmi || receiveMode == ReceiveMode.AsyncPoll))
{
try
{
if (state == CNewMsgMonitor.DATA && !atHandler.dataAvailable() && newMsgMonitor.getState() != CNewMsgMonitor.CMTI) continue;
newMsgMonitor.reset();
messageList.clear();
readMessages(messageList, asyncRecvClass);
for (int i = 0; i < messageList.size(); i++)
{
CIncomingMessage message = (CIncomingMessage) messageList.get(i);
if (getMessageHandler() == null)
{
if (received(message)) deleteMessage(message);
}
else
{
if (getMessageHandler() != null && getMessageHandler().received(CService.this, message)) deleteMessage(message);
}
}
}
catch (Exception e)
{
catchAsyncException(e);
}
}
}
stopped = true;
}
}
public static void main(String[] args)
{
System.out.println(_name + " " + _version);
System.out.println(" Java API for sending / receiving SMS messages via GSM modem.");
System.out.println(" This software is distributed under the LGPL license.");
System.out.println("");
System.out.println("Copyright (C) 2002-2006, Thanasis Delenikas, Athens / GREECE.");
System.out.println("Visit http://smslib.org for latest information.\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -