Skip to content

Commit

Permalink
Working on laipac2
Browse files Browse the repository at this point in the history
  • Loading branch information
kevingoos committed Mar 14, 2018
1 parent 0c5fa5c commit 82eace3
Show file tree
Hide file tree
Showing 5 changed files with 207 additions and 3 deletions.
47 changes: 47 additions & 0 deletions src/org/traccar/protocol/Laipac2Protocol.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/*
* Copyright 2015 Anton Tananaev ([email protected])
*
* 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.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.ChannelPipeline;
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.TrackerServer;

import java.util.List;

public class Laipac2Protocol extends BaseProtocol {

public Laipac2Protocol() {
super("laipac2");
}

@Override
public void initTrackerServers(List<TrackerServer> serverList) {
serverList.add(new TrackerServer(new ServerBootstrap(), getName()) {
@Override
protected void addSpecificHandlers(ChannelPipeline pipeline) {
pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024));
pipeline.addLast("stringEncoder", new StringEncoder());
pipeline.addLast("stringDecoder", new StringDecoder());
pipeline.addLast("objectDecoder", new Laipac2ProtocolDecoder(Laipac2Protocol.this));
}
});
}

}
123 changes: 123 additions & 0 deletions src/org/traccar/protocol/Laipac2ProtocolDecoder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
/*
* Copyright 2013 - 2017 Anton Tananaev ([email protected])
*
* 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.jboss.netty.channel.Channel;
import org.traccar.BaseProtocolDecoder;
import org.traccar.DeviceSession;
import org.traccar.helper.Checksum;
import org.traccar.helper.DateBuilder;
import org.traccar.helper.Parser;
import org.traccar.helper.PatternBuilder;
import org.traccar.model.Position;

import java.net.SocketAddress;
import java.util.regex.Pattern;

public class Laipac2ProtocolDecoder extends BaseProtocolDecoder {

public Laipac2ProtocolDecoder(Laipac2Protocol protocol) {
super(protocol);
}

private static final Pattern PATTERN = new PatternBuilder()
.text("$AVRMC,")
.expression("([^,]+),") // identifier
.number("(dd)(dd)(dd),") // time (hhmmss)
.expression("([AVRPavrp]),") // validity
.number("(dd)(dd.d+),") // latitude
.expression("([NS]),")
.number("(ddd)(dd.d+),") // longitude
.number("([EW]),")
.number("(d+.d+),") // speed
.number("(d+.d+),") // course
.number("(dd)(dd)(dd),") // date (ddmmyy)
.expression("([abZXMHE86430]),") // event code
.number("(d+),") // battery voltage
.number("(d+),") // current mileage
.number("(d),") // GPS on/off (1 = on, 0 = off)
.number("(d),") // Analog port 1
.number("(d+),") // Analog port 2
.expression("([0-9a-fA-F]{4})") // Cell 1 - Cell Net Code
.expression("([0-9a-fA-F]{4}),") // Cell 1 - Cell ID Code
.number("(d+)") // Cell 2
.text("*")
.number("(xx)") // checksum
.compile();

@Override
protected Object decode(Channel channel, SocketAddress remoteAddress, Object msg) throws Exception {
String sentence = (String) msg;

if (sentence.startsWith("$ECHK") && channel != null) {
channel.write(sentence + "\r\n"); // heartbeat
return null;
}

Parser parser = new Parser(PATTERN, sentence);
if (!parser.matches()) {
return null;
}

DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next());
if (deviceSession == null) {
return null;
}

Position position = new Position(getProtocolName());
position.setDeviceId(deviceSession.getDeviceId());

DateBuilder dateBuilder = new DateBuilder()
.setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0));

String status = parser.next();
position.setValid(status.toUpperCase().equals("A"));

position.setLatitude(parser.nextCoordinate());
position.setLongitude(parser.nextCoordinate());
position.setSpeed(parser.nextDouble(0));
position.setCourse(parser.nextDouble(0));

dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0));
position.setTime(dateBuilder.getDate());

String type = parser.next();
position.set(Position.KEY_BATTERY_LEVEL, parser.nextDouble());
//position.set(Position.KEY_, parser.nextDouble());
String checksum = parser.next();

if (channel != null) {

if (Character.isLowerCase(status.charAt(0))) {
String response = "$EAVACK," + type + "," + checksum;
response += Checksum.nmea(response);
channel.write(response);
}

if (type.equals("S") || type.equals("T")) {
channel.write("$AVCFG,00000000,t*21");
} else if (type.equals("3")) {
channel.write("$AVCFG,00000000,d*31");
} else if (type.equals("X") || type.equals("4")) {
channel.write("$AVCFG,00000000,x*2D");
}

}

return position;
}

}
3 changes: 1 addition & 2 deletions src/org/traccar/protocol/OsmAndProtocolDecoder.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,7 @@ public OsmAndProtocolDecoder(OsmAndProtocol protocol) {
}

@Override
protected Object decode(
Channel channel, SocketAddress remoteAddress, Object msg) throws Exception {
protected Object decode(Channel channel, SocketAddress remoteAddress, Object msg) throws Exception {

HttpRequest request = (HttpRequest) msg;
QueryStringDecoder decoder = new QueryStringDecoder(request.getUri());
Expand Down
35 changes: 35 additions & 0 deletions tools/translate.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#!/usr/bin/python

import os
import optparse
import urllib2
import json
import base64

parser = optparse.OptionParser()
parser.add_option("-u", "--user", dest="username", help="transifex user login")
parser.add_option("-p", "--password", dest="password", help="transifex user password")

(options, args) = parser.parse_args()

if not options.username or not options.password:
parser.error('User name and password are required')

os.chdir(os.path.dirname(os.path.abspath(__file__)))

path = "../web/l10n/"

def request(url):
req = urllib2.Request(url)
auth = base64.encodestring("%s:%s" % (options.username, options.password)).replace("\n", "")
req.add_header("Authorization", "Basic %s" % auth)
return urllib2.urlopen(req)

resource = json.load(request("https://www.transifex.com/api/2/project/traccar/resource/web/?details"))

for language in resource["available_languages"]:
code = language["code"]
data = request("https://www.transifex.com/api/2/project/traccar/resource/web/translation/" + code + "?file")
file = open(path + code + ".json", "wb")
file.write(data.read())
file.close()
2 changes: 1 addition & 1 deletion traccar-web
Submodule traccar-web updated 77 files
+4 −0 web/app.css
+3 −0 web/app/model/Device.js
+4 −1 web/app/model/Notification.js
+4 −1 web/app/model/Server.js
+4 −1 web/app/model/User.js
+5 −0 web/app/store/DeviceAttributes.js
+5 −0 web/app/store/GroupAttributes.js
+31 −0 web/app/view/ClearableComboBox.js
+1 −1 web/app/view/DeviceMenuController.js
+1 −1 web/app/view/ReportController.js
+10 −0 web/app/view/State.js
+16 −3 web/app/view/dialog/Device.js
+29 −0 web/app/view/dialog/DeviceController.js
+2 −2 web/app/view/dialog/Geofence.js
+6 −3 web/app/view/dialog/Group.js
+17 −2 web/app/view/dialog/Notification.js
+27 −0 web/app/view/dialog/NotificationController.js
+10 −7 web/app/view/dialog/Server.js
+11 −8 web/app/view/dialog/User.js
+12 −3 web/app/view/edit/Devices.js
+12 −22 web/app/view/edit/GroupsController.js
+1 −1 web/app/view/edit/Users.js
+13 −2 web/app/view/map/BaseMap.js
+8 −0 web/app/view/permissions/Devices.js
+22 −19 web/l10n/ar.json
+335 −332 web/l10n/az.json
+4 −1 web/l10n/bg.json
+4 −1 web/l10n/bn.json
+20 −17 web/l10n/cs.json
+4 −1 web/l10n/da.json
+5 −2 web/l10n/de.json
+4 −1 web/l10n/el.json
+4 −1 web/l10n/en.json
+7 −4 web/l10n/es.json
+5 −2 web/l10n/fa.json
+4 −1 web/l10n/fi.json
+24 −21 web/l10n/fr.json
+4 −1 web/l10n/he.json
+4 −1 web/l10n/hi.json
+4 −1 web/l10n/hr.json
+4 −1 web/l10n/hu.json
+4 −1 web/l10n/id.json
+22 −19 web/l10n/it.json
+39 −36 web/l10n/ja.json
+4 −1 web/l10n/ka.json
+4 −1 web/l10n/kk.json
+4 −1 web/l10n/km.json
+4 −1 web/l10n/ko.json
+4 −1 web/l10n/lo.json
+4 −1 web/l10n/lt.json
+61 −58 web/l10n/lv.json
+4 −1 web/l10n/ml.json
+4 −1 web/l10n/ms.json
+181 −178 web/l10n/nb.json
+4 −1 web/l10n/ne.json
+4 −1 web/l10n/nl.json
+4 −1 web/l10n/nn.json
+5 −2 web/l10n/pl.json
+6 −3 web/l10n/pt.json
+5 −2 web/l10n/pt_BR.json
+4 −1 web/l10n/ro.json
+4 −1 web/l10n/ru.json
+4 −1 web/l10n/si.json
+10 −7 web/l10n/sk.json
+4 −1 web/l10n/sl.json
+4 −1 web/l10n/sq.json
+4 −1 web/l10n/sr.json
+4 −1 web/l10n/sv.json
+4 −1 web/l10n/ta.json
+4 −1 web/l10n/th.json
+22 −19 web/l10n/tr.json
+4 −1 web/l10n/uk.json
+4 −1 web/l10n/uz.json
+4 −1 web/l10n/vi.json
+32 −29 web/l10n/zh.json
+4 −1 web/l10n/zh_TW.json
+1 −1 web/load.js

0 comments on commit 82eace3

Please sign in to comment.