mirror of
https://github.com/traccar/traccar.git
synced 2025-01-09 04:07:38 +08:00
Begin Cityeasy protocol implementation
This commit is contained in:
parent
2c7ee9ab27
commit
9de2c56179
@ -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>
|
||||
|
43
src/org/traccar/protocol/CityeasyProtocol.java
Normal file
43
src/org/traccar/protocol/CityeasyProtocol.java
Normal 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));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
115
src/org/traccar/protocol/CityeasyProtocolDecoder.java
Normal file
115
src/org/traccar/protocol/CityeasyProtocolDecoder.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
22
test/org/traccar/protocol/CityeasyProtocolDecoderTest.java
Normal file
22
test/org/traccar/protocol/CityeasyProtocolDecoderTest.java
Normal 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"))));
|
||||
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user