📄 athandler.java
字号:
public void switchToCmdMode() throws IOException
{
getModemDriver().write("+++");
java.util.Date start = new java.util.Date();
while (new java.util.Date().getTime() - start.getTime() <= getGateway().getService().getSettings().AT_WAIT_CMD)
{
try
{
Thread.sleep(100);
}
catch (InterruptedException e)
{
//Swallow this...
}
}
}
@Override
public int sendMessage(int size, String pdu, String phone, String text) throws TimeoutException, GatewayException, IOException, InterruptedException
{
int responseRetries, errorRetries;
String response;
int refNo = -1;
if (getGateway().getProtocol() == Protocols.PDU)
{
errorRetries = 0;
while (true)
{
responseRetries = 0;
getModemDriver().write("AT+CMGS=\"_1_\"\r".replaceAll("\"_1_\"", "" + size));
Thread.sleep(getGateway().getService().getSettings().AT_WAIT_CGMS);
while (!getModemDriver().dataAvailable())
{
responseRetries++;
if (responseRetries == getGateway().getService().getSettings().OUTBOUND_RETRIES) throw new GatewayException("Gateway is not responding, max number of retries reached.");
getGateway().getService().getLogger().logWarn("ATHandler().SendMessage(): Still waiting for response (I) (" + responseRetries + ")...", null, getGateway().getGatewayId());
Thread.sleep(getGateway().getService().getSettings().OUTBOUND_RETRY_WAIT);
}
responseRetries = 0;
getModemDriver().clearBuffer();
getModemDriver().write(pdu);
getModemDriver().write((char) 26);
response = getModemDriver().getResponse();
while (response.length() == 0)
{
responseRetries++;
if (responseRetries == getGateway().getService().getSettings().OUTBOUND_RETRIES) throw new GatewayException("Gateway is not responding, max number of retries reached.");
getGateway().getService().getLogger().logWarn("ATHandler().SendMessage(): Still waiting for response (II) (" + responseRetries + ")...", null, getGateway().getGatewayId());
Thread.sleep(getGateway().getService().getSettings().OUTBOUND_RETRY_WAIT);
response = getModemDriver().getResponse();
}
if (getModemDriver().getLastError() == 0)
{
Matcher m = Pattern.compile("\\s*\\+CMGS: *(\\d+)").matcher(response);
if (m.find())
{
refNo = Integer.parseInt(m.group(1));
}
else
{
// Message-Reference ID not returned
refNo = -1;
}
break;
}
else if (getModemDriver().getLastError() > 0)
{
// CMS or CME error could happen here
errorRetries++;
if (errorRetries == getGateway().getService().getSettings().OUTBOUND_RETRIES)
{
getGateway().getService().getLogger().logError(getModemDriver().getLastErrorText() + ": Quit retrying, message lost...", null, getGateway().getGatewayId());
refNo = -1;
break;
}
getGateway().getService().getLogger().logWarn(getModemDriver().getLastErrorText() + ": Retrying...", null, getGateway().getGatewayId());
Thread.sleep(getGateway().getService().getSettings().OUTBOUND_RETRY_WAIT);
}
else refNo = -1;
}
}
else if (getGateway().getProtocol() == Protocols.TEXT)
{
getModemDriver().write("AT+CMGS=\"_1_\"\r".replaceAll("_1_", phone));
getModemDriver().clearBuffer();
getModemDriver().write(text);
Thread.sleep(getGateway().getService().getSettings().AT_WAIT_CGMS);
getModemDriver().write((char) 26);
response = getModemDriver().getResponse();
if (response.indexOf("OK\r") >= 0)
{
int i;
String tmp = "";
i = response.indexOf(":");
while (!Character.isDigit(response.charAt(i)))
i++;
while (Character.isDigit(response.charAt(i)))
{
tmp += response.charAt(i);
i++;
}
refNo = Integer.parseInt(tmp);
}
else refNo = -1;
}
return refNo;
}
@Override
public String listMessages(MessageClasses messageClass) throws TimeoutException, GatewayException, IOException, InterruptedException
{
if (getGateway().getProtocol() == Protocols.PDU)
{
if (messageClass == MessageClasses.ALL) getModemDriver().write("AT+CMGL=4\r");
else if (messageClass == MessageClasses.UNREAD) getModemDriver().write("AT+CMGL=0\r");
else if (messageClass == MessageClasses.READ) getModemDriver().write("AT+CMGL=1\r");
}
else if (getGateway().getProtocol() == Protocols.TEXT)
{
if (messageClass == MessageClasses.ALL) getModemDriver().write("AT+CMGL=\"ALL\"\r");
else if (messageClass == MessageClasses.UNREAD) getModemDriver().write("AT+CMGL=\"REC UNREAD\"\r");
else if (messageClass == MessageClasses.READ) getModemDriver().write("AT+CMGL=\"REC READ\"\r");
}
return getModemDriver().getResponse();
}
@Override
public String getMessageByIndex(int msgIndex) throws TimeoutException, GatewayException, IOException, InterruptedException
{
getModemDriver().write("AT+CMGR=" + msgIndex + "\r");
return (getModemDriver().getResponse());
}
@Override
public boolean deleteMessage(int memIndex, String memLocation) throws TimeoutException, GatewayException, IOException, InterruptedException
{
if (!switchStorageLocation(memLocation)) return false;
Thread.sleep(getGateway().getService().getSettings().AT_WAIT);
getModemDriver().write("AT+CMGD=_1_\r".replaceAll("_1_", "" + memIndex));
getModemDriver().getResponse();
return (getModemDriver().isOk());
}
@Override
public String getGprsStatus() throws TimeoutException, GatewayException, IOException, InterruptedException
{
getModemDriver().write("AT+CGATT?\r");
return (getModemDriver().getResponse());
}
@Override
public String send(String s) throws TimeoutException, GatewayException, IOException, InterruptedException
{
getModemDriver().write(s);
return (getModemDriver().getResponse());
}
@Override
public String getNetworkRegistration() throws GatewayException, TimeoutException, IOException, InterruptedException
{
getModemDriver().write("AT+CREG?\r");
return (getModemDriver().getResponse());
}
@Override
public void readStorageLocations() throws Exception
{
String response, loc;
StringTokenizer tokens;
getModemDriver().write("AT+CPMS?\r");
response = getModemDriver().getResponse();
try
{
if (response.indexOf("+CPMS:") >= 0)
{
response = response.replaceAll("\\s*\\+CPMS:\\s*", "");
tokens = new StringTokenizer(response, ",");
while (tokens.hasMoreTokens())
{
loc = tokens.nextToken().replaceAll("\"", "");
if (getStorageLocations().indexOf(loc) < 0) addStorageLocation(loc);
tokens.nextToken();
tokens.nextToken();
}
}
else
{
addStorageLocation("MT");
getGateway().getService().getLogger().logWarn("CPMS detection failed, proceeding with default storage 'MT'.", null, getGateway().getGatewayId());
}
}
catch (Exception e)
{
addStorageLocation("MT");
getGateway().getService().getLogger().logWarn("CPMS detection failed, proceeding with default storage 'MT'.", null, getGateway().getGatewayId());
}
}
@Override
public String readPhonebookLocations() throws GatewayException, TimeoutException, IOException, InterruptedException
{
String response;
getModemDriver().write("AT+CPBS=?\r");
response = getModemDriver().getResponse();
if (response.indexOf("+CPBS:") >= 0)
{
response = response.replaceAll("\\s*\\+CPBS:\\s*", "");
response = response.replaceAll("[()]", "");
return response;
}
else return "";
}
@Override
public String readPhonebook(String loc) throws GatewayException, TimeoutException, IOException
{
String response;
int minIndex, maxIndex;
try
{
getModemDriver().write("AT+CPBS=\"" + loc + "\"\r");
getModemDriver().getResponse();
getModemDriver().write("AT+CPBR=?\r");
response = getModemDriver().getResponse();
response = response.replaceAll("\\s*\\+CPBR:\\s*", "");
response = response.replaceAll("[()]", "");
StringTokenizer tokens1 = new StringTokenizer(response, ",");
StringTokenizer tokens2 = new StringTokenizer(tokens1.nextToken(), "-");
minIndex = Integer.parseInt(tokens2.nextToken());
maxIndex = Integer.parseInt(tokens2.nextToken());
getModemDriver().write("AT+CPBR=" + minIndex + "," + maxIndex + "\r");
response = getModemDriver().getResponse();
return response;
}
catch (Exception e)
{
getGateway().getService().getLogger().logWarn("Phonebook detection failed.", null, getGateway().getGatewayId());
return "";
}
}
@Override
public String sendCustomATCommand(String atCommand) throws GatewayException, TimeoutException, IOException, InterruptedException
{
getModemDriver().write(atCommand);
return getModemDriver().getResponse();
}
@Override
public AsyncEvents processUnsolicitedEvents(String response) throws IOException
{
AsyncEvents event = AsyncEvents.NOTHING;
if (response.indexOf(getUnsolicitedResponse(0)) >= 0) event = AsyncEvents.INBOUNDMESSAGE;
else if (response.indexOf(getUnsolicitedResponse(1)) >= 0) event = AsyncEvents.INBOUNDSTATUSREPORTMESSAGE;
else if (response.indexOf(getUnsolicitedResponse(2)) >= 0) event = AsyncEvents.NOTHING;
else if (response.indexOf(getUnsolicitedResponse(3)) >= 0) event = AsyncEvents.INBOUNDCALL;
return event;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -