mirror of
https://github.com/traccar/traccar.git
synced 2026-01-31 10:43:39 -05:00
Implement Motor protocol
This commit is contained in:
@@ -278,5 +278,6 @@
|
||||
<entry key='topin.port'>5199</entry>
|
||||
<entry key='outsafe.port'>5200</entry>
|
||||
<entry key='solarpowered.port'>5201</entry>
|
||||
<entry key='motor.port'>5202</entry>
|
||||
|
||||
</properties>
|
||||
|
||||
37
src/main/java/org/traccar/protocol/MotorProtocol.java
Normal file
37
src/main/java/org/traccar/protocol/MotorProtocol.java
Normal file
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright 2019 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.
|
||||
* 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 io.netty.handler.codec.LineBasedFrameDecoder;
|
||||
import io.netty.handler.codec.string.StringDecoder;
|
||||
import org.traccar.BaseProtocol;
|
||||
import org.traccar.PipelineBuilder;
|
||||
import org.traccar.TrackerServer;
|
||||
|
||||
public class MotorProtocol extends BaseProtocol {
|
||||
|
||||
public MotorProtocol() {
|
||||
addServer(new TrackerServer(false, getName()) {
|
||||
@Override
|
||||
protected void addProtocolHandlers(PipelineBuilder pipeline) {
|
||||
pipeline.addLast(new LineBasedFrameDecoder(1024));
|
||||
pipeline.addLast(new StringDecoder());
|
||||
pipeline.addLast(new MotorProtocolDecoder(MotorProtocol.this));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
85
src/main/java/org/traccar/protocol/MotorProtocolDecoder.java
Normal file
85
src/main/java/org/traccar/protocol/MotorProtocolDecoder.java
Normal file
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* Copyright 2019 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.
|
||||
* 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 io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.channel.Channel;
|
||||
import org.traccar.BaseProtocolDecoder;
|
||||
import org.traccar.DeviceSession;
|
||||
import org.traccar.Protocol;
|
||||
import org.traccar.helper.BcdUtil;
|
||||
import org.traccar.helper.BitUtil;
|
||||
import org.traccar.helper.DataConverter;
|
||||
import org.traccar.helper.DateBuilder;
|
||||
import org.traccar.model.Position;
|
||||
|
||||
import java.net.SocketAddress;
|
||||
|
||||
public class MotorProtocolDecoder extends BaseProtocolDecoder {
|
||||
|
||||
public MotorProtocolDecoder(Protocol protocol) {
|
||||
super(protocol);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Object decode(
|
||||
Channel channel, SocketAddress remoteAddress, Object msg) throws Exception {
|
||||
|
||||
String sentence = (String) msg;
|
||||
ByteBuf buf = Unpooled.wrappedBuffer(DataConverter.parseHex(sentence));
|
||||
|
||||
String id = String.format("%08x", buf.readUnsignedIntLE());
|
||||
DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, id);
|
||||
if (deviceSession == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Position position = new Position(getProtocolName());
|
||||
position.setDeviceId(deviceSession.getDeviceId());
|
||||
|
||||
buf.skipBytes(2); // divider
|
||||
|
||||
position.set(Position.KEY_STATUS, buf.readUnsignedShortLE());
|
||||
|
||||
buf.skipBytes(2); // divider
|
||||
buf.readUnsignedMediumLE(); // command
|
||||
|
||||
int flags = buf.readUnsignedByte();
|
||||
position.setValid(BitUtil.check(flags, 7));
|
||||
if (BitUtil.check(flags, 0)) {
|
||||
position.set(Position.KEY_ALARM, Position.ALARM_GENERAL);
|
||||
}
|
||||
|
||||
position.setLatitude(BcdUtil.readInteger(buf, 2) + BcdUtil.readInteger(buf, 6) * 0.0001 / 60);
|
||||
position.setLongitude(BcdUtil.readInteger(buf, 4) + BcdUtil.readInteger(buf, 6) * 0.0001 / 60);
|
||||
position.setSpeed(BcdUtil.readInteger(buf, 4) * 0.1);
|
||||
position.setCourse(BcdUtil.readInteger(buf, 4) * 0.1);
|
||||
|
||||
position.setTime(new DateBuilder()
|
||||
.setYear(BcdUtil.readInteger(buf, 2))
|
||||
.setMonth(BcdUtil.readInteger(buf, 2))
|
||||
.setDay(BcdUtil.readInteger(buf, 2))
|
||||
.setHour(BcdUtil.readInteger(buf, 2))
|
||||
.setMinute(BcdUtil.readInteger(buf, 2))
|
||||
.setSecond(BcdUtil.readInteger(buf, 2)).getDate());
|
||||
|
||||
position.set(Position.KEY_RSSI, BcdUtil.readInteger(buf, 2));
|
||||
|
||||
return position;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package org.traccar.protocol;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.traccar.ProtocolTest;
|
||||
|
||||
public class MotorProtocolDecoderTest extends ProtocolTest {
|
||||
|
||||
@Test
|
||||
public void testDecode() throws Exception {
|
||||
|
||||
MotorProtocolDecoder decoder = new MotorProtocolDecoder(null);
|
||||
|
||||
verifyPosition(decoder, text(
|
||||
"341200007E7E00007E7E020301803955352401161766210162090501010108191625132655351234567F12345F"));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user