new protocol

Roberto Sousa18 days ago

good morning, nem protocol xml custom correct ?
Captura de tela 2025-03-27 105915.png

Anton Tananaev18 days ago

Have you checked the official documentation first?

https://www.traccar.org/configuration-file/

Roberto Sousa18 days ago

yes!
I am receiving events on port 6822 but it still says unknown device. I look at the database and it is registered correctly, but it does not record events and remains offline. logs:

2025-03-27 11:48:10  INFO: [Td90bbb0f: daycom < 177.69.143.153] VRL,2.608,000000,P,L,010104,000043,862749050347078,89550532010059595623|724|05|01|1a37|4e9a|10,0,4.103|87,n,5,001,00000002|0|0,29,999,0,00000000000000,724,05,1,1a37,4e9a,010,1a37,5e19,006,0000,0000,000,0000,0000,000,8\r\n

2025-03-27 11:51:20  INFO: [Tc8024723: daycom < 177.69.143.153] VRL,2.608,000000,P,L,010104,000108,862749050347078,89550532010059595623|724|05|01|1a37|5e19|30,0,4.087|85,n,15,001,80000002|0|0,30,999,0,00000000000000,724,05,1,1a37,5e19,030,1a37,5e17,010,1a37,5f30,008,1a37,57c4,005,8\r\n

2025-03-27 11:52:35  INFO: [Tea3610af: daycom < 177.69.143.154] VRL,2.608,000000,P,L,010104,000029,862749050347078,89550532010059595623|724|05|01|1a37|5e19|17,0,4.087|85,n,9,001,00000002|0|0,30,999,0,00000000000000,724,05,1,1a37,5e19,017,1a37,57c4,012,1a37,4e4c,009,0000,ffff,016,8\r\n
Anton Tananaev18 days ago

Most likely something is wrong with your implementation of the protocol.

Roberto Sousa18 days ago
public class DaycomProtocol extends BaseProtocol {
    public DaycomProtocol() {
        setSupportedDataCommands(
            Command.TYPE_CUSTOM,
            Command.TYPE_POSITION_SINGLE,
            Command.TYPE_POSITION_PERIODIC
        );
        addServer(new TrackerServer(false, getName()) {
            @Override
            protected void addProtocolHandlers(PipelineBuilder pipeline, Protocol protocol) {
                pipeline.addLast(new StringEncoder());
                pipeline.addLast(new StringDecoder());
                pipeline.addLast(new DaycomProtocolDecoder(protocol));
            }
        });
    }
}
///--------------------------///

GNU nano 4.8 /home/tarkan/traccar/src/main/java/org/traccar/protocol/DaycomProtocolDecoder.java

package org.traccar.protocol;

import java.net.SocketAddress;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Arrays;
import io.netty.channel.Channel;
import org.traccar.BaseProtocolDecoder;
import org.traccar.helper.UnitsConverter;
import org.traccar.model.Position;
import org.traccar.session.DeviceSession;

public class DaycomProtocolDecoder extends BaseProtocolDecoder {

    public DaycomProtocolDecoder(DaycomProtocol protocol) {
        super(protocol);
    }

    @Override
    protected Object decode(Channel channel, SocketAddress remoteAddress, Object msg) throws Exception {
        String message = (String) msg;
        System.out.println("[Daycom] Pacote recebido: " + message);

        String[] parts = message.split(",");
        System.out.println("[Daycom DEBUG] Mensagem recebida: " + message);
        System.out.println("[Daycom DEBUG] Partes separadas: " + Arrays.toString(parts));

        if (parts.length < 25 || !parts[0].equals("VRL")) {
            return null;
        }

        String imei = parts[8].trim();
        System.out.println("[Daycom] IMEI: " + imei);

        DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei);
        if (deviceSession == null) {
            System.out.println("[Daycom] Dispositivo desconhecido: " + imei);
            return null;
        }

        Position position = new Position(getProtocolName());
        position.setDeviceId(deviceSession.getDeviceId());

        Date currentDate = new Date();
        position.setTime(currentDate);
        position.setFixTime(currentDate);

        String positionType = parts[4];
        switch (positionType) {
            case "G":
                position.setLatitude(Double.parseDouble(parts[20]));
                position.setLongitude(Double.parseDouble(parts[21]));
                position.setSpeed(UnitsConverter.knotsFromKph(Double.parseDouble(parts[22])));
                position.setValid(true);
                break;
            case "L":
            case "Q":
                Map<String, Object> attributes = new HashMap<>();
                attributes.put("mcc", parts[20]);
                attributes.put("mnc", parts[21]);
                attributes.put("lac", parts[23]);
                attributes.put("cid", parts[24]);
                position.setAttributes(attributes);
                position.setValid(false);
                break;
        }
        
        try {
            String batteryInfo = parts[11];
            if (batteryInfo.contains("|")) {
                String[] batteryParts = batteryInfo.split("\\|");
                position.set("batteryVoltage", Double.parseDouble(batteryParts[0]));
                if (batteryParts.length > 1) {
                    position.set("batteryPercentage", Integer.parseInt(batteryParts[1]));
                }
            } else {
                position.set("batteryVoltage", Double.parseDouble(batteryInfo));
            }
        } catch (Exception ignored) {}

        position.set("firmware", parts[1]);
        position.set("moduleId", parts[2]);
        position.set("signalQuality", parts[13]);

        return position;
    }
}