aboutsummaryrefslogtreecommitdiff
path: root/src/org/traccar/database
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/traccar/database')
-rw-r--r--src/org/traccar/database/ActiveDevice.java18
-rw-r--r--src/org/traccar/database/DeviceManager.java50
2 files changed, 52 insertions, 16 deletions
diff --git a/src/org/traccar/database/ActiveDevice.java b/src/org/traccar/database/ActiveDevice.java
index 6109bc517..f491111e1 100644
--- a/src/org/traccar/database/ActiveDevice.java
+++ b/src/org/traccar/database/ActiveDevice.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2015 Anton Tananaev (anton@traccar.org)
+ * Copyright 2015 - 2017 Anton Tananaev (anton@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,12 +18,8 @@ package org.traccar.database;
import org.jboss.netty.channel.Channel;
import org.traccar.Protocol;
import org.traccar.model.Command;
-import org.traccar.model.CommandType;
import java.net.SocketAddress;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
public class ActiveDevice {
@@ -47,18 +43,8 @@ public class ActiveDevice {
return deviceId;
}
- public Collection<CommandType> getCommandTypes() {
- List<CommandType> result = new ArrayList<>();
-
- for (String commandKey : protocol.getSupportedCommands()) {
- result.add(new CommandType(commandKey));
- }
-
- return result;
- }
-
public void sendCommand(Command command) {
- protocol.sendCommand(this, command);
+ protocol.sendDataCommand(this, command);
}
public void write(Object message) {
diff --git a/src/org/traccar/database/DeviceManager.java b/src/org/traccar/database/DeviceManager.java
index 8e75903db..f5fde9e1f 100644
--- a/src/org/traccar/database/DeviceManager.java
+++ b/src/org/traccar/database/DeviceManager.java
@@ -26,9 +26,12 @@ 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;
+import org.traccar.model.Command;
+import org.traccar.model.CommandType;
import org.traccar.model.Device;
import org.traccar.model.DeviceTotalDistance;
import org.traccar.model.Group;
@@ -53,11 +56,14 @@ public class DeviceManager implements IdentityManager {
private final Map<Long, Position> positions = new ConcurrentHashMap<>();
+ private boolean fallbackToText;
+
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");
+ fallbackToText = config.getBoolean("command.fallbackToSms");
if (dataManager != null) {
try {
updateGroupCache(true);
@@ -420,4 +426,48 @@ public class DeviceManager implements IdentityManager {
throw new IllegalArgumentException();
}
}
+
+ public void sendCommand(Command command) throws Exception {
+ long deviceId = command.getDeviceId();
+ if (command.getTextChannel()) {
+ Position lastPosition = getLastPosition(deviceId);
+ if (lastPosition != null) {
+ BaseProtocol protocol = Context.getServerManager().getProtocol(lastPosition.getProtocol());
+ protocol.sendTextCommand(devicesById.get(deviceId).getPhone(), command);
+ } else if (command.getType().equals(Command.TYPE_CUSTOM)) {
+ 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(deviceId);
+ if (activeDevice != null) {
+ activeDevice.sendCommand(command);
+ } else {
+ if (fallbackToText) {
+ command.setTextChannel(true);
+ sendCommand(command);
+ } else {
+ throw new RuntimeException("Device is not online");
+ }
+ }
+ }
+ }
+
+ public Collection<CommandType> getCommandTypes(long deviceId, boolean textChannel) {
+ List<CommandType> result = new ArrayList<>();
+ Position lastPosition = Context.getDeviceManager().getLastPosition(deviceId);
+ if (lastPosition != null) {
+ BaseProtocol protocol = Context.getServerManager().getProtocol(lastPosition.getProtocol());
+ Collection<String> commands;
+ commands = textChannel ? protocol.getSupportedTextCommands() : protocol.getSupportedDataCommands();
+ for (String commandKey : commands) {
+ result.add(new CommandType(commandKey));
+ }
+ } else {
+ result.add(new CommandType(Command.TYPE_CUSTOM));
+ }
+ return result;
+ }
}