aboutsummaryrefslogtreecommitdiff
path: root/src/org/traccar/database/DeviceManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/traccar/database/DeviceManager.java')
-rw-r--r--src/org/traccar/database/DeviceManager.java37
1 files changed, 19 insertions, 18 deletions
diff --git a/src/org/traccar/database/DeviceManager.java b/src/org/traccar/database/DeviceManager.java
index f60109770..8b28bec9d 100644
--- a/src/org/traccar/database/DeviceManager.java
+++ b/src/org/traccar/database/DeviceManager.java
@@ -26,6 +26,7 @@ import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
+import org.traccar.BaseProtocol;
import org.traccar.Config;
import org.traccar.Context;
import org.traccar.helper.Log;
@@ -37,11 +38,6 @@ import org.traccar.model.Group;
import org.traccar.model.Position;
import org.traccar.model.Server;
-import com.cloudhopper.smpp.type.RecoverablePduException;
-import com.cloudhopper.smpp.type.SmppChannelException;
-import com.cloudhopper.smpp.type.SmppTimeoutException;
-import com.cloudhopper.smpp.type.UnrecoverablePduException;
-
public class DeviceManager implements IdentityManager {
public static final long DEFAULT_REFRESH_DELAY = 300;
@@ -60,11 +56,14 @@ public class DeviceManager implements IdentityManager {
private final Map<Long, Position> positions = new ConcurrentHashMap<>();
+ private boolean fallbackToSms;
+
public DeviceManager(DataManager dataManager) {
this.dataManager = dataManager;
this.config = Context.getConfig();
dataRefreshDelay = config.getLong("database.refreshDelay", DEFAULT_REFRESH_DELAY) * 1000;
lookupGroupsAttribute = config.getBoolean("deviceManager.lookupGroupsAttribute");
+ fallbackToSms = config.getBoolean("command.fallbackToSms");
if (dataManager != null) {
try {
updateGroupCache(true);
@@ -428,25 +427,30 @@ public class DeviceManager implements IdentityManager {
}
}
- public void sendCommand(Command command) throws RecoverablePduException, UnrecoverablePduException,
- SmppTimeoutException, SmppChannelException, InterruptedException {
+ public void sendCommand(Command command) throws Exception {
+ long deviceId = command.getDeviceId();
if (command.getSms()) {
- Position lastPosition = getLastPosition(command.getDeviceId());
+ Position lastPosition = getLastPosition(deviceId);
if (lastPosition != null) {
- Context.getServerManager().getProtocol(lastPosition.getProtocol())
- .sendSmsCommand(devicesById.get(command.getDeviceId()).getPhone(), command);
+ BaseProtocol protocol = Context.getServerManager().getProtocol(lastPosition.getProtocol());
+ protocol.sendSmsCommand(devicesById.get(deviceId).getPhone(), command);
} else if (command.getType().equals(Command.TYPE_CUSTOM)) {
- Context.getSmppManager().sendMessageSync(devicesById.get(command.getDeviceId()).getPhone(),
+ Context.getSmppManager().sendMessageSync(devicesById.get(deviceId).getPhone(),
command.getString(Command.KEY_DATA), true);
} else {
throw new RuntimeException("Command " + command.getType() + " is not supported");
}
} else {
- ActiveDevice activeDevice = Context.getConnectionManager().getActiveDevice(command.getDeviceId());
+ ActiveDevice activeDevice = Context.getConnectionManager().getActiveDevice(deviceId);
if (activeDevice != null) {
activeDevice.sendCommand(command);
} else {
- throw new RuntimeException("Device is not online");
+ if (fallbackToSms) {
+ command.setSms(true);
+ sendCommand(command);
+ } else {
+ throw new RuntimeException("Device is not online");
+ }
}
}
}
@@ -455,12 +459,9 @@ public class DeviceManager implements IdentityManager {
List<CommandType> result = new ArrayList<>();
Position lastPosition = Context.getDeviceManager().getLastPosition(deviceId);
if (lastPosition != null) {
+ BaseProtocol protocol = Context.getServerManager().getProtocol(lastPosition.getProtocol());
Collection<String> commands;
- if (sms) {
- commands = Context.getServerManager().getProtocol(lastPosition.getProtocol()).getSupportedSmsCommands();
- } else {
- commands = Context.getServerManager().getProtocol(lastPosition.getProtocol()).getSupportedCommands();
- }
+ commands = sms ? protocol.getSupportedSmsCommands() : protocol.getSupportedCommands();
for (String commandKey : commands) {
result.add(new CommandType(commandKey));
}