I'm trying to implement the lock/unlock commands for the JMAK protocol but I'm not having any success. Could someone help? Am I doing something wrong?
Link to the command protocol

Jmak Protocol
public class JmakProtocol extends BaseProtocol {
@Inject
public JmakProtocol(Config config) {
setSupportedDataCommands(
Command.TYPE_CUSTOM,
Command.TYPE_ENGINE_STOP,
Command.TYPE_ENGINE_RESUME);
addServer(new TrackerServer(config, getName(), false) {
@Override
protected void addProtocolHandlers(PipelineBuilder pipeline, Config config) {
pipeline.addLast(new LoggingHandler(LogLevel.DEBUG));
pipeline.addLast(new JmakFrameDecoder());
pipeline.addLast(new StringEncoder());
pipeline.addLast(new StringDecoder());
pipeline.addLast(new JmakProtocolEncoder(JmakProtocol.this));
pipeline.addLast(new JmakProtocolDecoder(JmakProtocol.this));
}
});
}
}
JmakProtocolEncoder
public class JmakProtocolEncoder extends BaseProtocolEncoder {
public JmakProtocolEncoder(Protocol protocol) {
super(protocol);
}
@Override
protected Object encodeCommand(Command command) {
return switch (command.getType()) {
case Command.TYPE_ENGINE_STOP -> "$34;1;#";
case Command.TYPE_ENGINE_RESUME -> "$34;0;#";
case Command.TYPE_CUSTOM -> {
String data = command.getString(Command.KEY_DATA);
yield data != null ? formatCustomCommand(data) : null;
}
default -> null;
};
}
private String formatCustomCommand(String data) {
data = data.trim();
if (data.startsWith("$")) data = data.substring(1);
if (data.endsWith("#")) data = data.substring(0, data.length() - 1);
return "$" + data + "#";
}
}
LOGS
2025-11-13 10:41:47 INFO: Preparando comando: type=engineStop, deviceId=6
2025-11-13 10:41:47 INFO: Comando CORTA CORRENTE ATIVAR para deviceId: 6
2025-11-13 10:41:47 INFO: Comando formatado para envio ao dispositivo 6: $34;1;#
2025-11-13 10:41:47 INFO: Aguardando resposta do dispositivo no formato: $IMEI;ok;# ou $IMEI;err;ID;#
2025-11-13 10:41:47 INFO: [Td9f7593f] id: 860710052018036, command type: engineStop sent
2025-11-13 10:41:47 INFO: [Td9f7593f: jmak > 177.69.143.158] $34;1;#
2025-11-13 10:42:05 INFO: [Td9f7593f: jmak < 177.69.143.158] ~000000001D63FFFF;202509-00104-0018490;860710052018036;5982;Bancada;1763041316000;-24.33366;-50.62481;749.20;B;0.00;33;18;0.74;46.40;0;0;19.17;4.37;12693;4108;4;3;0;0$
2025-11-13 10:42:05 INFO: Recebido JMAK: ~000000001D63FFFF;202509-00104-0018490;860710052018036;5982;Bancada;1763041316000;-24.33366;-50.62481;749.20;B;0.00;33;18;0.74;46.40;0;0;19.17;4.37;12693;4108;4;3;0;0$
2025-11-13 10:42:05 INFO: [Td9f7593f: jmak > 177.69.143.158] ACK
The command is being sent successfully, but the device does not perform the engine cut (no blocking action happens).
That's right, @Anton, could you help us? Logs no print erros.
This is probably beyond what I can do via forum.
I thought this would help the community, but if you're not interested, we'll figure it out anyway.
Great. Please share once you figure it out.
I'm trying to implement the lock/unlock commands for the JMAK protocol but I'm not having any success. Could someone help? Am I doing something wrong?
Link to the command protocol

Jmak Protocol
public class JmakProtocol extends BaseProtocol { @Inject public JmakProtocol(Config config) { setSupportedDataCommands( Command.TYPE_CUSTOM, Command.TYPE_ENGINE_STOP, Command.TYPE_ENGINE_RESUME); addServer(new TrackerServer(config, getName(), false) { @Override protected void addProtocolHandlers(PipelineBuilder pipeline, Config config) { pipeline.addLast(new LoggingHandler(LogLevel.DEBUG)); pipeline.addLast(new JmakFrameDecoder()); pipeline.addLast(new StringEncoder()); pipeline.addLast(new StringDecoder()); pipeline.addLast(new JmakProtocolEncoder(JmakProtocol.this)); pipeline.addLast(new JmakProtocolDecoder(JmakProtocol.this)); } }); } }JmakProtocolEncoder
public class JmakProtocolEncoder extends BaseProtocolEncoder { public JmakProtocolEncoder(Protocol protocol) { super(protocol); } @Override protected Object encodeCommand(Command command) { return switch (command.getType()) { case Command.TYPE_ENGINE_STOP -> "$34;1;#"; case Command.TYPE_ENGINE_RESUME -> "$34;0;#"; case Command.TYPE_CUSTOM -> { String data = command.getString(Command.KEY_DATA); yield data != null ? formatCustomCommand(data) : null; } default -> null; }; } private String formatCustomCommand(String data) { data = data.trim(); if (data.startsWith("$")) data = data.substring(1); if (data.endsWith("#")) data = data.substring(0, data.length() - 1); return "$" + data + "#"; } }LOGS