New protocol implementation

ak20158 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 Tananaev8 years ago

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

ak20158 years ago

Hi Anton,

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

Anton Tananaev8 years ago

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

ak20158 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 Tananaev8 years ago

Please provide proper full documentation.

ak20158 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 Tananaev8 years ago

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

ak20158 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 Tananaev8 years ago

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

ak20158 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 Tananaev8 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.

ak20158 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 Tananaev8 years ago

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

ak20158 years ago

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