New protocol implementation

ak2015 9 years ago

Hi Anton,

I have purchased a new GPS device from a local vendor, when I connected to Traccar server, getting data in ASCII format.

$loc,363879036739252,070915012535,A,29.631328,N,74.525853,E,033,53.150,09,192.20.0.1,0,0,0,0,0,0000,0454,0.0,0+

How can I add this in traccar server.

Anton Tananaev 9 years ago

Looks like this format is not supported yet. Do you have a protocol documentation?

ak2015 9 years ago

Hi Anton,

Can I use same logic as u did for osmAnd protocol ?

Anton Tananaev 9 years ago

Not sure what you mean by same logic, but OsmAnd is not a good example.

ak2015 9 years ago

Hi Anton,

Below are the details about protocol, please help me to add this device on server.

$loc				START Bytes
, 				COMMA
363879036739252		         IMEI No.
, 				COMMA
070915012535			Time as per GPS String in DDMMYYHHMMSS in UTC
, 				COMMA
A				GPS FIX either A or V in case not fixed
, 				COMMA
28.606225			Latitude 
, 				COMMA
N				Latitude Cardinal	
, 				COMMA
76.346434			Longitude 
, 				COMMA
E				Longitude Cardinal
, 				COMMA
033				speed in Kmph
, 				COMMA
53.150				Bearing (Track angle)
, 				COMMA
09				Number of Satellites
, 				COMMA
192.20				Altitude
, 				COMMA
0				Value of Digital input 1 
, 				COMMA
0				Value of Digital input 2 
, 				COMMA
0				Value of Digital input 3 AC ON/OFF
, 				COMMA
0	                        Value of Digital input 4 
, 				COMMA
0				Digital Output1 
, 				COMMA
0000	                       Fuel Sensor 
, 				COMMA
0944	                       Car Battery Power 
, 				COMMA
0.00	                       FW Versions
, 				COMMA
0	                       Tamper Value

Please copy above details in any file, seems formatting is not working,I was trying to use below code to encode and decode
pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, "\r\n", "\n", ";"));
pipeline.addLast("stringEncoder", new StringEncoder());
pipeline.addLast("stringDecoder", new StringDecoder());
pipeline.addLast("objectEncoder", new Gps103ProtocolEncoder());
pipeline.addLast("objectDecoder", new Gps103ProtocolDecoder(Gps103Protocol.this));
Is there necessary to write objectEncoder for above string ?

Anton Tananaev 9 years ago

Please provide proper full documentation.

ak2015 9 years ago

Hi Anton,

I have added new protocol for above device at port 5105.But when I see log, port is not open.
I also added protocol in traccar.xml. Is there any other configuration required ?

Anton Tananaev 9 years ago

No configuration is needed if you created all required classes, mainly Protocol class.

ak2015 9 years ago

Hi Anton,
I have created all required classes like protocol and decoder and added port no in traccar.xml. but when I check on console
-- sudo netstat -ntlp | grep :5105

No any port is open or listening

but when I check for others like
-- sudo netstat -ntlp | grep :5103

It is showing like below
tcp6 0 0 :::5103 :::* LISTEN 22081/java

Why 5105 is not listening ?

Anton Tananaev 9 years ago

Show me your code on GitHub or somewhere, but please don't paste the whole code here.

ak2015 9 years ago

Protocol

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

Decoder

	
	 private static final Pattern PATTERN = new PatternBuilder()
            .text("$loc,")                       
    .number("(d+),")                  
	.number("(dd)(dd)(dd)(dd)(dd)(dd),")      
	.expression("([AV]),")               
	.number("(-?d+.d+),")              
	.expression("([NS]),")
    .number("(-?d+.d+),")              
	.expression("([EW]),")
	.number("(d+),")                
    .number("(d+.d+),")                 
	.number("(d+),")                    
	.number("(d+.d+),")                 
	.expression("([01]+),")               
	.expression("([01]+),")              
	.expression("([01]+),")               
	.expression("([01]+),")               
	.expression("([01]+),")               
	.number("(d+),")                    
	.number("(d+),")                    
	.number("(d+.d+),")               
	.expression("([01]+)")             
	.expression("([+-]+)") 
        .compile();

    @Override
    protected Object decode(
            Channel channel, SocketAddress remoteAddress, Object msg) throws Exception {
		////String msg="$loc,865879026779232,050916092132,A,28.601224,N,77.326833,E,
        //033,53.150,09,192.20,0,0,0,0,0,0000,0944,0.0,0+";
        Parser parser = new Parser(PATTERN, (String) msg);
        if (!parser.matches()) {
            return null;
        }

        Position position = new Position();
        position.setProtocol(getProtocolName());

        if (!identify(parser.next(), channel, remoteAddress)) {
            return null;
        }
        position.setDeviceId(getDeviceId());

        DateBuilder dateBuilder = new DateBuilder()
                .setDate(parser.nextInt(), parser.nextInt(), parser.nextInt())
                .setTime(parser.nextInt(), parser.nextInt(), parser.nextInt());
        position.setTime(dateBuilder.getDate());

        position.setValid(parser.next().equals("A"));
        
        String direction=null;
        position.setLatitude(parser.nextDouble());
        direction=parser.next();
        position.setLongitude(parser.nextDouble());
        direction+=parser.next();
        //033,53.150,09,192.20,0,0,0,0,0,0000,0944,0.0,0+";
        position.set(Event.KEY_DIRECTION, direction);
        position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble()));
        position.setCourse(parser.nextDouble());
        position.set(Event.KEY_SATELLITES, parser.nextInt());
        position.set(Event.KEY_ALTITUDE, parser.nextInt());
        
        position.set(Event.KEY_DBI1, parser.nextInt());
        position.set(Event.KEY_DBI2, parser.nextInt());
        position.set(Event.KEY_DBI3, parser.nextInt());
        position.set(Event.KEY_DBI4, parser.nextInt());
        position.set(Event.KEY_DBO1, parser.nextInt());
        position.set(Event.KEY_FUEL, parser.nextDouble());
        position.set(Event.KEY_BATTERY, parser.nextInt());
        position.set(Event.KEY_FIRMWARE, parser.nextDouble());
        position.set(Event.KEY_TAMPER, parser.nextInt());
        position.set(Event.KEY_PACKET_LOC, parser.next());
       
        return position;
    }
Anton Tananaev 9 years ago

I explicitly asked you not to post code here and you posted it here.

I need to see all the modifications that you did, including config file. PLEASE DON'T POST CODE HERE.

ak2015 9 years ago

Hi Anton,

Really sorry,Please delete above post if possible.

Please have a look github link.
https://gist.github.com/amit22786/cf767acd6c457d9ad71917b5f95fc360
https://gist.github.com/amit22786/1e3abd2a63c78952eb69c99b8b178bd1

I added <entry key='trackingpath.port'>5128</entry> in traccar.xml

Anton Tananaev 9 years ago

In the "TrackingpathProtocol" class you have uppercase "Trackingpath", but in the config you use lowercase "trackingpath".

ak2015 9 years ago

r u talking about this super("Trackingpath"); ? Apart from this is everything ok ?