diff options
-rw-r--r-- | src/org/traccar/model/Command.java | 1 | ||||
-rw-r--r-- | src/org/traccar/protocol/WialonProtocol.java | 16 | ||||
-rw-r--r-- | src/org/traccar/protocol/WialonProtocolDecoder.java | 13 | ||||
-rw-r--r-- | src/org/traccar/protocol/WialonProtocolEncoder.java | 42 | ||||
-rw-r--r-- | web/app/view/CommandDialog.js | 33 | ||||
-rw-r--r-- | web/app/view/CommandDialogController.js | 37 | ||||
-rw-r--r-- | web/l10n/en.json | 5 |
7 files changed, 145 insertions, 2 deletions
diff --git a/src/org/traccar/model/Command.java b/src/org/traccar/model/Command.java index d1b9aa793..7ec9b414e 100644 --- a/src/org/traccar/model/Command.java +++ b/src/org/traccar/model/Command.java @@ -33,6 +33,7 @@ public class Command extends Message { public static final String TYPE_REQUEST_PHOTO = "requestPhoto"; public static final String TYPE_REBOOT_DEVICE = "rebootDevice"; public static final String TYPE_SEND_SMS = "sendSms"; + public static final String TYPE_SEND_USSD = "sendUssd"; public static final String TYPE_SOS_NUMBER = "sosNumber"; public static final String TYPE_SILENCE_TIME = "silenceTime"; public static final String TYPE_SET_PHONEBOOK = "setPhonebook"; diff --git a/src/org/traccar/protocol/WialonProtocol.java b/src/org/traccar/protocol/WialonProtocol.java index d0d3aa446..e0255c888 100644 --- a/src/org/traccar/protocol/WialonProtocol.java +++ b/src/org/traccar/protocol/WialonProtocol.java @@ -21,14 +21,22 @@ import org.jboss.netty.handler.codec.frame.LineBasedFrameDecoder; import org.jboss.netty.handler.codec.string.StringDecoder; import org.jboss.netty.handler.codec.string.StringEncoder; import org.traccar.BaseProtocol; +import org.traccar.Context; import org.traccar.TrackerServer; +import org.traccar.model.Command; +import java.nio.charset.StandardCharsets; import java.util.List; public class WialonProtocol extends BaseProtocol { public WialonProtocol() { super("wialon"); + setSupportedCommands( + Command.TYPE_REBOOT_DEVICE, + Command.TYPE_SEND_USSD, + Command.TYPE_IDENTIFICATION, + Command.TYPE_OUTPUT_CONTROL); } @Override @@ -38,7 +46,13 @@ public class WialonProtocol extends BaseProtocol { protected void addSpecificHandlers(ChannelPipeline pipeline) { pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(4 * 1024)); pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); + boolean utf8 = Context.getConfig().getBoolean(getName() + ".utf8"); + if (utf8) { + pipeline.addLast("stringDecoder", new StringDecoder(StandardCharsets.UTF_8)); + } else { + pipeline.addLast("stringDecoder", new StringDecoder()); + } + pipeline.addLast("objectEncoder", new WialonProtocolEncoder()); pipeline.addLast("objectDecoder", new WialonProtocolDecoder(WialonProtocol.this)); } }); diff --git a/src/org/traccar/protocol/WialonProtocolDecoder.java b/src/org/traccar/protocol/WialonProtocolDecoder.java index 627b93b1c..0043354d5 100644 --- a/src/org/traccar/protocol/WialonProtocolDecoder.java +++ b/src/org/traccar/protocol/WialonProtocolDecoder.java @@ -24,6 +24,7 @@ import org.traccar.helper.PatternBuilder; import org.traccar.model.Position; import java.net.SocketAddress; +import java.util.Date; import java.util.LinkedList; import java.util.List; import java.util.regex.Matcher; @@ -171,6 +172,18 @@ public class WialonProtocolDecoder extends BaseProtocolDecoder { return positions; } + } else if (sentence.startsWith("#M#")) { + DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); + if (deviceSession != null) { + Position position = new Position(); + position.setProtocol(getProtocolName()); + position.setDeviceId(deviceSession.getDeviceId()); + getLastLocation(position, new Date()); + position.setValid(false); + position.set(Position.KEY_RESULT, sentence.substring(sentence.indexOf('#', 1) + 1)); + sendResponse(channel, "#AM#", 1); + return position; + } } return null; diff --git a/src/org/traccar/protocol/WialonProtocolEncoder.java b/src/org/traccar/protocol/WialonProtocolEncoder.java new file mode 100644 index 000000000..7cdc0c63c --- /dev/null +++ b/src/org/traccar/protocol/WialonProtocolEncoder.java @@ -0,0 +1,42 @@ +/* + * Copyright 2016 Anton Tananaev (anton.tananaev@gmail.com) + * Copyright 2016 Andrey Kunitsyn (abyss@fox5.ru) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.traccar.protocol; + +import org.traccar.StringProtocolEncoder; +import org.traccar.helper.Log; +import org.traccar.model.Command; + +public class WialonProtocolEncoder extends StringProtocolEncoder { + + @Override + protected Object encodeCommand(Command command) { + switch (command.getType()) { + case Command.TYPE_REBOOT_DEVICE: + return formatCommand(command, "reboot\r\n"); + case Command.TYPE_SEND_USSD: + return formatCommand(command, "USSD:{%s}\r\n", Command.KEY_PHONE_NUMBER); + case Command.TYPE_IDENTIFICATION: + return formatCommand(command, "VER?\r\n"); + case Command.TYPE_OUTPUT_CONTROL: + return formatCommand(command, "L{%s}={%s}\r\n", Command.KEY_INDEX, Command.KEY_DATA); + default: + Log.warning(new UnsupportedOperationException(command.getType())); + break; + } + return null; + } +} diff --git a/web/app/view/CommandDialog.js b/web/app/view/CommandDialog.js index 8e9a80dbf..d9c3beeb3 100644 --- a/web/app/view/CommandDialog.js +++ b/web/app/view/CommandDialog.js @@ -55,6 +55,39 @@ Ext.define('Traccar.view.CommandDialog', { valueField: 'factor' }] }, { + xtype: 'fieldcontainer', + reference: 'paramOutputControl', + name: 'attributes', + hidden: true, + + items: [{ + xtype: 'numberfield', + fieldLabel: Strings.commandIndex, + name: 'index', + allowBlank: false + }, { + xtype: 'textfield', + fieldLabel: Strings.commandData, + name: 'data' + }] + }, { + xtype: 'fieldcontainer', + reference: 'paramSendSmsUssd', + name: 'attributes', + hidden: true, + + items: [{ + xtype: 'textfield', + fieldLabel: Strings.commandPhoneNumber, + name: 'phoneNumber' + }, { + xtype: 'textfield', + reference: 'paramSmsMessage', + fieldLabel: Strings.commandMessage, + name: 'message', + hidden: true + }] + }, { xtype: 'textfield', reference: 'paramCustom', fieldLabel: Strings.commandCustom, diff --git a/web/app/view/CommandDialogController.js b/web/app/view/CommandDialogController.js index 9da5bd42e..120854df1 100644 --- a/web/app/view/CommandDialogController.js +++ b/web/app/view/CommandDialogController.js @@ -21,12 +21,18 @@ Ext.define('Traccar.view.CommandDialogController', { onSelect: function (selected) { this.lookupReference('paramPositionPeriodic').setHidden( selected.getValue() !== 'positionPeriodic'); + this.lookupReference('paramOutputControl').setHidden( + selected.getValue() !== 'outputControl'); + this.lookupReference('paramSendSmsUssd').setHidden( + selected.getValue() !== 'sendSms' && selected.getValue() !== 'sendUssd'); + this.lookupReference('paramSmsMessage').setHidden( + selected.getValue() !== 'sendSms'); this.lookupReference('paramCustom').setHidden( selected.getValue() !== 'custom'); }, onSendClick: function (button) { - var attributes, value, record, form; + var attributes, value, record, form, index, phoneNumber; form = button.up('window').down('form'); form.updateRecord(); @@ -42,6 +48,35 @@ Ext.define('Traccar.view.CommandDialogController', { }); } + if (record.get('type') === 'outputControl') { + attributes = this.lookupReference('paramOutputControl'); + index = attributes.down('numberfield[name="index"]').getValue(); + value = attributes.down('textfield[name="data"]').getValue(); + + record.set('attributes', { + index: index, + data: value + }); + } + + if (record.get('type') === 'sendUssd') { + attributes = this.lookupReference('paramSendSmsUssd'); + phoneNumber = attributes.down('textfield[name="phoneNumber"]').getValue(); + record.set('attributes', { + phoneNumber: phoneNumber + }); + } + + if (record.get('type') === 'sendSms') { + attributes = this.lookupReference('paramSendSmsUssd'); + phoneNumber = attributes.down('textfield[name="phoneNumber"]').getValue(); + value = attributes.down('textfield[name="message"]').getValue(); + record.set('attributes', { + phoneNumber: phoneNumber, + message: value + }); + } + if (record.get('type') === 'custom') { value = this.lookupReference('paramCustom').getValue(); record.set('attributes', { diff --git a/web/l10n/en.json b/web/l10n/en.json index a16322bca..e51c5445c 100644 --- a/web/l10n/en.json +++ b/web/l10n/en.json @@ -107,6 +107,7 @@ "commandRequestPhoto": "Request Photo", "commandRebootDevice": "Reboot Device", "commandSendSms": "Send SMS", + "commandSendUssd": "Send USSD", "commandSosNumber": "Set SOS Number", "commandSilenceTime": "Set Silence Time", "commandSetPhonebook": "Set Phonebook", @@ -114,6 +115,10 @@ "commandOutputControl": "Output Control", "commandAlarmSpeed": "Overspeed Alarm", "commandDeviceIdentification": "Device Identification", + "commandIndex": "Index", + "commandData": "Data", + "commandPhoneNumber": "Phone Number", + "commandMessage": "Message", "eventDeviceOnline": "Device is online", "eventDeviceOffline": "Device is offline", "eventDeviceMoving": "Device is moving", |