Begin Cityeasy protocol implementation

This commit is contained in:
Anton Tananaev 2015-07-24 15:24:55 +12:00
parent 2c7ee9ab27
commit 9de2c56179
4 changed files with 181 additions and 0 deletions

View File

@ -304,5 +304,6 @@
<entry key='avl301.port'>5085</entry>
<entry key='castel.port'>5086</entry>
<entry key='mxt.port'>5087</entry>
<entry key='cityeasy.port'>5088</entry>
</properties>

View File

@ -0,0 +1,43 @@
/*
* Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com)
*
* 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.LengthFieldBasedFrameDecoder;
import org.traccar.BaseProtocol;
import org.traccar.TrackerServer;
import java.util.List;
public class CityeasyProtocol extends BaseProtocol {
public CityeasyProtocol() {
super("cityeasy");
}
@Override
public void initTrackerServers(List<TrackerServer> serverList) {
serverList.add(new TrackerServer(new ServerBootstrap(), this.getName()) {
@Override
protected void addSpecificHandlers(ChannelPipeline pipeline) {
pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 2, 2, -2, 0));
pipeline.addLast("objectDecoder", new CityeasyProtocolDecoder(CityeasyProtocol.this));
}
});
}
}

View File

@ -0,0 +1,115 @@
/*
* Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com)
*
* 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.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.Channel;
import org.traccar.BaseProtocolDecoder;
import org.traccar.model.Event;
import org.traccar.model.Position;
import java.net.SocketAddress;
import java.util.Calendar;
import java.util.TimeZone;
public class CityeasyProtocolDecoder extends BaseProtocolDecoder {
public CityeasyProtocolDecoder(CityeasyProtocol protocol) {
super(protocol);
}
private static final int MSG_LOCATION_REPORT = 0x0003;
private static final int MSG_LOCATION_INQUIRY_RESPONSE = 0x0004;
@Override
protected Object decode(
Channel channel, SocketAddress remoteAddress, Object msg)
throws Exception {
ChannelBuffer buf = (ChannelBuffer) msg;
/*buf.skipBytes(2); // header
buf.readByte(); // size
// Zero for location messages
buf.readByte(); // voltage
buf.readByte(); // gsm signal
String imei = readImei(buf);
long index = buf.readUnsignedShort();
int type = buf.readUnsignedByte();
if (type == MSG_HEARTBEAT) {
if (channel != null) {
byte[] response = {0x54, 0x68, 0x1A, 0x0D, 0x0A};
channel.write(ChannelBuffers.wrappedBuffer(response));
}
}
else if (type == MSG_DATA) {
// Create new position
Position position = new Position();
position.setProtocol(getProtocolName());
position.set(Event.KEY_INDEX, index);
// Get device id
if (!identify(imei, channel)) {
return null;
}
position.setDeviceId(getDeviceId());
// Date and time
Calendar time = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
time.clear();
time.set(Calendar.YEAR, 2000 + buf.readUnsignedByte());
time.set(Calendar.MONTH, buf.readUnsignedByte() - 1);
time.set(Calendar.DAY_OF_MONTH, buf.readUnsignedByte());
time.set(Calendar.HOUR_OF_DAY, buf.readUnsignedByte());
time.set(Calendar.MINUTE, buf.readUnsignedByte());
time.set(Calendar.SECOND, buf.readUnsignedByte());
position.setTime(time.getTime());
// Latitude
double latitude = buf.readUnsignedInt() / (60.0 * 30000.0);
// Longitude
double longitude = buf.readUnsignedInt() / (60.0 * 30000.0);
// Speed
position.setSpeed(buf.readUnsignedByte());
// Course
position.setCourse(buf.readUnsignedShort());
buf.skipBytes(3); // reserved
// Flags
long flags = buf.readUnsignedInt();
position.setValid((flags & 0x1) == 0x1);
if ((flags & 0x2) == 0) latitude = -latitude;
if ((flags & 0x4) == 0) longitude = -longitude;
position.setLatitude(latitude);
position.setLongitude(longitude);
return position;
}*/
return null;
}
}

View File

@ -0,0 +1,22 @@
package org.traccar.protocol;
import org.jboss.netty.buffer.ChannelBuffers;
import org.junit.Test;
import org.traccar.helper.ChannelBufferTools;
import static org.junit.Assert.assertNull;
import static org.traccar.helper.DecoderVerifier.verify;
public class CityeasyProtocolDecoderTest extends ProtocolDecoderTest {
@Test
public void testDecode() throws Exception {
CityeasyProtocolDecoder decoder = new CityeasyProtocolDecoder(new CityeasyProtocol());
verify(decoder.decode(null, null, ChannelBuffers.wrappedBuffer(ChannelBufferTools.convertHexString(
"5454006135200000000001000332303134313131303039353430392C412C342C4E2C32322E3533373232382C452C3131342E3032323737342C302E312C312E392C35302E363B3436302C302C31303137332C343635322C34310000000B63130D0A"))));
}
}