diff options
Diffstat (limited to 'src/org/traccar/database')
-rw-r--r-- | src/org/traccar/database/ActiveDevice.java | 16 | ||||
-rw-r--r-- | src/org/traccar/database/DeviceManager.java | 49 |
2 files changed, 50 insertions, 15 deletions
diff --git a/src/org/traccar/database/ActiveDevice.java b/src/org/traccar/database/ActiveDevice.java index 6109bc517..9c96382fe 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,16 +43,6 @@ 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); } diff --git a/src/org/traccar/database/DeviceManager.java b/src/org/traccar/database/DeviceManager.java index 8e75903db..f60109770 100644 --- a/src/org/traccar/database/DeviceManager.java +++ b/src/org/traccar/database/DeviceManager.java @@ -29,12 +29,19 @@ import java.util.concurrent.atomic.AtomicLong; 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; 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; @@ -420,4 +427,46 @@ public class DeviceManager implements IdentityManager { throw new IllegalArgumentException(); } } + + public void sendCommand(Command command) throws RecoverablePduException, UnrecoverablePduException, + SmppTimeoutException, SmppChannelException, InterruptedException { + if (command.getSms()) { + Position lastPosition = getLastPosition(command.getDeviceId()); + if (lastPosition != null) { + Context.getServerManager().getProtocol(lastPosition.getProtocol()) + .sendSmsCommand(devicesById.get(command.getDeviceId()).getPhone(), command); + } else if (command.getType().equals(Command.TYPE_CUSTOM)) { + Context.getSmppManager().sendMessageSync(devicesById.get(command.getDeviceId()).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()); + if (activeDevice != null) { + activeDevice.sendCommand(command); + } else { + throw new RuntimeException("Device is not online"); + } + } + } + + public Collection<CommandType> getCommandTypes(long deviceId, boolean sms) { + List<CommandType> result = new ArrayList<>(); + Position lastPosition = Context.getDeviceManager().getLastPosition(deviceId); + if (lastPosition != null) { + Collection<String> commands; + if (sms) { + commands = Context.getServerManager().getProtocol(lastPosition.getProtocol()).getSupportedSmsCommands(); + } else { + commands = Context.getServerManager().getProtocol(lastPosition.getProtocol()).getSupportedCommands(); + } + for (String commandKey : commands) { + result.add(new CommandType(commandKey)); + } + } else { + result.add(new CommandType(Command.TYPE_CUSTOM)); + } + return result; + } } |