📄 modemdriver.java
字号:
answer = -1;
}
switch (answer)
{
case 0:
gateway.getLogger().error("GSM: Auto-registration disabled!");
throw new GatewayException("GSM Network Auto-Registration disabled!");
case 1:
gateway.getLogger().info("GSM: Registered to home network.");
return true;
case 2:
gateway.getLogger().warn("GSM: Not registered, searching for network...");
break;
case 3:
gateway.getLogger().error("GSM: Network registration denied!");
throw new GatewayException("GSM Network Registration denied!");
case 4:
gateway.getLogger().error("GSM: Unknown registration error!");
throw new GatewayException("GSM Network Registration error!");
case 5:
gateway.getLogger().info("GSM: Registered to foreign network (roaming).");
return true;
case -1:
gateway.getLogger().info("GSM: Invalid CREG response.");
throw new GatewayException("GSM: Invalid CREG response.");
}
Thread.sleep(15000);
}
}
private String formatLog(StringBuffer s)
{
StringBuffer response = new StringBuffer();
int i;
char c;
for (i = 0; i < s.length(); i++)
{
c = s.charAt(i);
switch (c)
{
case 13:
response.append("(cr)");
break;
case 10:
response.append("(lf)");
break;
case 9:
response.append("(tab)");
break;
default:
if (((int) c >= 32) && ((int) c < 128))
{
response.append(c);
}
else
{
response.append("(" + (int) c + ")");
}
break;
}
}
return response.toString();
}
private class CharQueue
{
byte[] buffer;
int bufferStart, bufferEnd;
public CharQueue()
{
buffer = new byte[BUFFER_SIZE];
bufferStart = 0;
bufferEnd = 0;
}
public synchronized void put(byte c)
{
buffer[bufferEnd] = c;
bufferEnd++;
if (bufferEnd == BUFFER_SIZE) bufferEnd = 0;
if (ENABLE_QUEUE_DEBUG) gateway.getLogger().debug("IN READER QUEUE : " + (int) c + " / " + (char) c);
notifyAll();
}
public synchronized byte get() throws TimeoutException, InterruptedException
{
byte c;
if (bufferStart == bufferEnd) wait(RECEIVE_TIMEOUT);
if (bufferStart == bufferEnd) throw new TimeoutException("No response from device.");
c = buffer[bufferStart];
bufferStart++;
if (bufferStart == BUFFER_SIZE) bufferStart = 0;
return c;
}
public synchronized byte peek() throws InterruptedException
{
if (bufferStart == bufferEnd) wait(RECEIVE_TIMEOUT);
if (bufferStart == bufferEnd) return -1;
return buffer[bufferStart];
}
public synchronized String peek(int sizeToRead)
{
int i, size;
StringBuffer result;
size = sizeToRead;
if (bufferStart == bufferEnd) return "";
result = new StringBuffer(size);
i = bufferStart;
while (size > 0)
{
if ((buffer[i] != 0x0a) && (buffer[i] != 0x0d))
{
result.append((char) buffer[i]);
size--;
}
i++;
if (i == BUFFER_SIZE) i = 0;
if (i == bufferEnd) break;
}
return result.toString();
}
public synchronized void clear()
{
bufferStart = 0;
bufferEnd = 0;
}
public void dump()
{
int i;
i = bufferStart;
while (i < bufferEnd)
{
System.out.println(buffer[i] + " -> " + (char) buffer[i]);
i++;
}
}
}
private class ModemReader extends Thread
{
private KeepAlive keepAlive;
public ModemReader(KeepAlive keepAlive)
{
this.keepAlive = keepAlive;
start();
gateway.getLogger().debug("ModemReader thread started.");
}
public void run()
{
int c;
String data;
while (connected)
{
try
{
synchronized (SYNC_Reader)
{
if (!dataReceived) SYNC_Reader.wait();
if (!connected) break;
c = read();
while (c != -1)
{
queue.put((byte) c);
if (!portHasData()) break;
c = read();
}
dataReceived = false;
}
data = queue.peek(6);
if ((data.indexOf("CMTI") >= 0) || (data.indexOf("CSDI") >= 0) || (data.indexOf("RING") >= 0)) keepAlive.interrupt();
}
catch (InterruptedException e)
{
if (!connected) break;
}
catch (Exception e)
{
e.printStackTrace();
}
}
gateway.getLogger().debug("ModemReader thread ended.");
}
}
private class KeepAlive extends Thread
{
public KeepAlive()
{
setPriority(MIN_PRIORITY);
start();
gateway.getLogger().debug("ModemDriver: KeepAlive thread started.");
}
public void run()
{
while (true)
{
try
{
try
{
sleep(KEEP_ALIVE);
}
catch (InterruptedException e)
{
}
if (!connected) break;
synchronized (SYNC_Commander)
{
if (!connected) break;
gateway.getLogger().debug("** KeepAlive **");
gateway.getATHandler().isAlive();
}
}
catch (Exception e)
{
gateway.getLogger().error("ModemDriver: KeepAlive Error: " + e.getMessage());
}
}
gateway.getLogger().debug("ModemDriver: KeepAlive thread ended.");
}
}
private class AsyncNotifier extends Thread
{
private AsyncEvents event;
private Object SYNC;
public AsyncNotifier()
{
SYNC = new Object();
setPriority(MIN_PRIORITY);
start();
gateway.getLogger().debug("AsyncNotifier thread started.");
}
protected void setEvent(AsyncEvents event)
{
synchronized (SYNC)
{
this.event = event;
SYNC.notify();
}
}
protected String getMemLoc(String indication)
{
Pattern p = Pattern.compile("\\+?\"\\S+\"");
Matcher m = p.matcher(indication);
if (m.find()) return indication.substring(m.start(), m.end()).replaceAll("\"", "");
else return "";
}
protected int getMemIndex(String indication)
{
Pattern p = Pattern.compile("\\+?\\d+");
Matcher m = p.matcher(indication);
if (m.find()) return Integer.parseInt(indication.substring(m.start(), m.end()).replaceAll("\"", ""));
else return -1;
}
protected String getOriginator(String indication)
{
Pattern p = Pattern.compile("\\+?\"\\S+\"");
Matcher m = p.matcher(indication);
if (m.find()) return indication.substring(m.start(), m.end()).replaceAll("\"", "");
else return "";
}
public void run()
{
String response;
while (true)
{
try
{
synchronized (SYNC)
{
SYNC.wait();
if (!connected) break;
if (event == AsyncEvents.INBOUNDMESSAGE)
{
event = AsyncEvents.NOTHING;
response = gateway.getATHandler().getAsyncEventResponse(AsyncEvents.INBOUNDMESSAGE);
if (gateway.getInboundNotification() != null) gateway.getInboundNotification().process(gateway.gtwId, MessageTypes.INBOUND, getMemLoc(response), getMemIndex(response));
}
else if (event == AsyncEvents.INBOUNDSTATUSREPORTMESSAGE)
{
event = AsyncEvents.NOTHING;
response = gateway.getATHandler().getAsyncEventResponse(AsyncEvents.INBOUNDSTATUSREPORTMESSAGE);
if (gateway.getInboundNotification() != null) gateway.getInboundNotification().process(gateway.gtwId, MessageTypes.STATUSREPORT, getMemLoc(response), getMemIndex(response));
}
else if (event == AsyncEvents.INBOUNDCALL)
{
event = AsyncEvents.NOTHING;
response = gateway.getATHandler().getAsyncEventResponse(AsyncEvents.INBOUNDCALL);
if (gateway.getCallNotification() != null) gateway.getCallNotification().process(gateway.gtwId, getOriginator(response));
}
}
}
catch (InterruptedException e)
{
if (!connected) break;
}
catch (Exception e)
{
}
}
gateway.getLogger().debug("AsyncNotifier thread ended.");
}
}
int getLastError()
{
return lastError;
}
String getLastErrorText()
{
if (lastError == 0) return "OK";
else if (lastError == -1) return "Invalid or empty response";
else if ((lastError / 1000) == 5) return "CME Error " + (lastError % 1000);
else if ((lastError / 1000) == 6) return "CMS Error " + (lastError % 1000);
else return "Error: unknown";
}
boolean isOk()
{
return (lastError == OK);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -