📄 amodemdriver.java
字号:
}
catch (TimeoutException e)
{
getGateway().getService().getLogger().logDebug("Buffer contents on timeout: " + buffer, null, getGateway().getGatewayId());
throw e;
}
return buffer.toString();
}
public void clearBuffer() throws IOException, InterruptedException
{
synchronized (getSYNCCommander())
{
getGateway().getService().getLogger().logDebug("clearBuffer() called.", null, getGateway().getGatewayId());
Thread.sleep(getGateway().getService().getSettings().SERIAL_CLEAR_WAIT);
clear();
getCharQueue().clear();
}
}
protected boolean waitForNetworkRegistration() throws GatewayException, TimeoutException, IOException, InterruptedException
{
//TODO: Move the magic number "6" (network retries) to settings(?)
StringTokenizer tokens;
String response;
int answer;
int retries = 0;
while (true)
{
response = getGateway().getATHandler().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, ",");
tokens.nextToken();
try
{
answer = Integer.parseInt(tokens.nextToken());
}
catch (Exception e)
{
answer = -1;
}
switch (answer)
{
case 0:
getGateway().getService().getLogger().logError("GSM: Auto-registration disabled!", null, getGateway().getGatewayId());
throw new GatewayException("GSM Network Auto-Registration disabled!");
case 1:
getGateway().getService().getLogger().logInfo("GSM: Registered to home network.", null, getGateway().getGatewayId());
return true;
case 2:
getGateway().getService().getLogger().logWarn("GSM: Not registered, searching for network...", null, getGateway().getGatewayId());
if (++retries == 6) throw new GatewayException("GSM Network Registration failed, give up trying!");
break;
case 3:
getGateway().getService().getLogger().logError("GSM: Network registration denied!", null, getGateway().getGatewayId());
throw new GatewayException("GSM Network Registration denied!");
case 4:
getGateway().getService().getLogger().logError("GSM: Unknown registration error!", null, getGateway().getGatewayId());
throw new GatewayException("GSM Network Registration error!");
case 5:
getGateway().getService().getLogger().logInfo("GSM: Registered to foreign network (roaming).", null, getGateway().getGatewayId());
return true;
case -1:
getGateway().getService().getLogger().logInfo("GSM: Invalid CREG response.", null, getGateway().getGatewayId());
throw new GatewayException("GSM: Invalid CREG response.");
}
Thread.sleep(getGateway().getService().getSettings().AT_WAIT_NETWORK);
}
}
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 ((c >= 32) && (c < 128))
{
response.append(c);
}
else
{
response.append("(" + (int) c + ")");
}
break;
}
}
return response.toString();
}
private class CharQueue
{
byte[] buffer;
int bufferStart, bufferEnd;
public CharQueue()
{
this.buffer = null;
this.bufferStart = 0;
this.bufferEnd = 0;
}
public synchronized void put(byte c)
{
if (this.buffer == null) this.buffer = new byte[getGateway().getService().getSettings().SERIAL_BUFFER_SIZE];
this.buffer[this.bufferEnd] = c;
this.bufferEnd++;
if (this.bufferEnd == getGateway().getService().getSettings().SERIAL_BUFFER_SIZE) this.bufferEnd = 0;
if (System.getProperty("smslib.dumpqueues") != null) getGateway().getService().getLogger().logDebug("IN READER QUEUE : " + (int) c + " / " + (char) c, null, getGateway().getGatewayId());
notifyAll();
}
public synchronized void put(String s)
{
for (int i = 0; i < s.length(); i++)
put((byte) s.charAt(i));
}
public synchronized byte get() throws TimeoutException, InterruptedException
{
byte c;
if (this.buffer == null) this.buffer = new byte[getGateway().getService().getSettings().SERIAL_BUFFER_SIZE];
while (true)
{
try
{
if (this.bufferStart == this.bufferEnd) wait(getGateway().getService().getSettings().SERIAL_TIMEOUT);
if (this.bufferStart == this.bufferEnd) throw new TimeoutException("No response from device.");
c = this.buffer[this.bufferStart];
this.bufferStart++;
if (this.bufferStart == getGateway().getService().getSettings().SERIAL_BUFFER_SIZE) this.bufferStart = 0;
return c;
}
catch (InterruptedException e)
{
if (getGateway().getStatus() == GatewayStatuses.STARTED) getGateway().getService().getLogger().logWarn("Ignoring InterruptedException in Queue.get().", null, getGateway().getGatewayId());
else
{
getGateway().getService().getLogger().logWarn("Re-throwing InterruptedException in Queue.get() - should be during shutdown...", null, getGateway().getGatewayId());
throw new InterruptedException();
}
}
}
}
public synchronized byte peek() throws InterruptedException
{
if (this.buffer == null) this.buffer = new byte[getGateway().getService().getSettings().SERIAL_BUFFER_SIZE];
while (true)
{
try
{
if (this.bufferStart == this.bufferEnd) wait(getGateway().getService().getSettings().SERIAL_TIMEOUT);
if (this.bufferStart == this.bufferEnd) return -1;
return this.buffer[this.bufferStart];
}
catch (InterruptedException e)
{
if (getGateway().getStatus() == GatewayStatuses.STARTED) getGateway().getService().getLogger().logWarn("Ignoring InterruptedException in Queue.peek().", e, getGateway().getGatewayId());
else
{
getGateway().getService().getLogger().logWarn("Re-throwing InterruptedException in Queue.peek() - should be during shutdown...", e, getGateway().getGatewayId());
throw new InterruptedException();
}
}
}
}
public synchronized String peek(int sizeToRead)
{
int i, size;
StringBuffer result;
if (this.buffer == null) this.buffer = new byte[getGateway().getService().getSettings().SERIAL_BUFFER_SIZE];
size = sizeToRead;
if (this.bufferStart == this.bufferEnd) return "";
result = new StringBuffer(size);
i = this.bufferStart;
while (size > 0)
{
if ((this.buffer[i] != 0x0a) && (this.buffer[i] != 0x0d))
{
result.append((char) this.buffer[i]);
size--;
}
i++;
if (i == getGateway().getService().getSettings().SERIAL_BUFFER_SIZE) i = 0;
if (i == this.bufferEnd) break;
}
return result.toString();
}
public synchronized void clear()
{
this.bufferStart = 0;
this.bufferEnd = 0;
}
public void dump()
{
int i;
i = this.bufferStart;
while (i < this.bufferEnd)
{
System.out.println(this.buffer[i] + " -> " + (char) this.buffer[i]);
i++;
}
}
}
private class ModemReader extends Thread
{
public ModemReader()
{
setName("SMSlib-ModemReader-" + getGateway().getGatewayId());
setDaemon(true);
start();
getGateway().getService().getLogger().logDebug("ModemReader thread started.", null, getGateway().getGatewayId());
}
@Override
public void run()
{
int c;
String data;
while (isConnected())
{
try
{
synchronized (getSYNCReader())
{
if (!isDataReceived()) getSYNCReader().wait();
if (!isConnected()) break;
c = read();
while (c != -1)
{
getCharQueue().put((byte) c);
if (!portHasData()) break;
c = read();
}
setDataReceived(false);
}
data = getCharQueue().peek(6);
for (int i = 0; i < getGateway().getATHandler().getUnsolicitedResponses().length; i++)
{
if (data.indexOf(getGateway().getATHandler().getUnsolicitedResponse(i)) >= 0)
{
getGateway().getService().getScheduler().executeOnceAfter(getKeepAlive(), 100, TimeUnit.MILLISECONDS);
break;
}
}
}
catch (InterruptedException e)
{
if (!isConnected()) break;
}
catch (Exception e)
{
e.printStackTrace();
}
}
getGateway().getService().getLogger().logDebug("ModemReader thread ended.", null, getGateway().getGatewayId());
}
}
private class KeepAlive extends ASchedulerTask
{
public KeepAlive(String myName, Service myService)
{
super(myName, myService);
}
public void process()
{
try
{
if (!isConnected()) return;
if (getGateway().getStatus() == GatewayStatuses.STARTED)
{
synchronized (getSYNCCommander())
{
if (!isConnected()) return;
getGateway().getService().getLogger().logDebug("** KeepAlive START **", null, getGateway().getGatewayId());
try
{
if (!getGateway().getATHandler().isAlive()) getGateway().setStatus(GatewayStatuses.RESTART);
}
catch (Exception e)
{
getGateway().setStatus(GatewayStatuses.RESTART);
}
getGateway().getService().getLogger().logDebug("** KeepAlive END **", null, getGateway().getGatewayId());
}
}
}
catch (Exception e)
{
getGateway().getService().getLogger().logError("ModemDriver: KeepAlive Error.", e, getGateway().getGatewayId());
getGateway().setStatus(GatewayStatuses.RESTART);
}
}
}
private class AsyncNotifier extends Thread
{
class Event
{
AsyncEvents event;
String response;
public Event(AsyncEvents myEvent, String myResponse)
{
this.event = myEvent;
this.response = myResponse;
}
@Override
public String toString()
{
return "Event: " + this.event + " / Response: " + this.response;
}
}
private BlockingQueue<Event> eventQueue;
private Object SYNC;
public AsyncNotifier()
{
this.SYNC = new Object();
this.eventQueue = new LinkedBlockingQueue<Event>();
setPriority(MIN_PRIORITY);
setName("SMSLib-AsyncNotifier : " + getGateway().getGatewayId());
setDaemon(true);
start();
getGateway().getService().getLogger().logDebug("AsyncNotifier thread started.", null, getGateway().getGatewayId());
}
protected void setEvent(AsyncEvents event, String response)
{
synchronized (this.SYNC)
{
Event ev = new Event(event, response);
getGateway().getService().getLogger().logDebug("Storing AsyncEvent: " + ev, null, getGateway().getGatewayId());
this.eventQueue.add(ev);
this.SYNC.notify();
}
}
protected String getMemLoc(String indication)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -