News Protocols ALT, STT, ALV, UEX

Cosme Alves7 months ago

Dear,

I have to enable new features in the tracker to obtain protocols (ALT, STT, ALV, UEX) below from the Suntech ST4305 4G device.

Could anyone help with how I can configure these new features in traccar or even in the source code!

Anton Tananaev7 months ago

Documentation?

Cosme Alves7 months ago

I have a script that provides this converted data

import subprocess
import time
import re

# Comando a ser executado localmente
comando = 'sudo tail -f /opt/traccar/logs/tracker-server.log'

# Executa o comando localmente
processo = subprocess.Popen(comando.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)

def calcular_soc(tensao, V_cheio=4.2, V_vazio=3.0):
    soc = ((float(tensao) - V_vazio) / (V_cheio - V_vazio)) * 100
    if soc > 100:
        soc = 100
    elif tensao < V_vazio:
        soc = 0
    return round(soc, 2)

def calcular_y(ADC):               #CALCULO PARA TENSAO DE ENTRADA 9V
    ADC = float(ADC)
    y = (1.1856 * ADC**6 
         - 4.8729 * ADC**5 
         + 51.867 * ADC**4 
         - 285.27 * ADC**3 
         + 853.52 * ADC**2 
         - 1305 * ADC 
         + 793.79)
    return round(y, 2)
# Lê a saída do comando continuamente
try:
    while True:
        # Lê a próxima linha da saída
        linha = processo.stdout.readline()
        if not linha:
            time.sleep(0.1)  # Aguarda um curto período antes de tentar novamente
            continue
        # Pula os primeiros 64 caracteres
        hex_string = linha.decode()[64:].strip()
        # Filtra apenas os caracteres hexadecimais
        hex_string = re.sub('[^0-9a-fA-F]', '', hex_string)

        # Verifica se a sequência começa com '535454', '554558', '414c56' ou '414c54'
        if hex_string.startswith(('535454', '554558', '414c56', '414c54')):
            # Divide a sequência em pares de caracteres hexadecimais e converte para ASCII
            ascii_string = "".join([chr(int(hex_string[i:i+2], 16)) for i in range(0, len(hex_string), 2)])
            # Imprime a conversão
            print("")
            print(ascii_string.strip())

            # Se a sequência começar com '554558', processa os valores ESN e outros dados relevantes
            if hex_string.startswith('554558'): #UEX
                   dados = ascii_string.split(";")
                   if len(dados) >= 22:
                    hdr = dados[0]
                    dev_id = dados[1]
                    report_map = dados[2]
                    modelo = dados[3]
                    sw_ver = dados[4]
                    msg_type = dados[5]
                    data = dados[6]
                    hora = dados[7]
                    latitude = dados[8]
                    longitude = dados[9]
                    spd = dados[10]
                    crs = dados[11]
                    satt = dados[12]
                    fix = dados[13]
                    in_state = dados[14]
                    out_state = dados[15]
                    len_data = dados[16]
                    RFID = dados[17]
                    velocidade_instantanea = dados[18]
                    velocidade_pico = dados[19]
                    temperatura_instantanea = dados[20]
                    temperatura_pico = dados[21]

                    # Imprime os dados relevantes
                    print("")
                    print("HDR:", hdr)
                    print("Device ID:", dev_id)
                    print("Report Map:", report_map)
                    print("Modelo:", modelo)
                    print("Software Version:", sw_ver)
                    print("Message Type:", msg_type)
                    print("Data:", data)
                    print("Hora:", hora)
                    print("Latitude:", latitude)
                    print("Longitude:", longitude)
                    print("Speed gps (Km/h):", spd)
                    print("Course:", crs)
                    print("Satellites:", satt)
                    print("Fix:", fix)
                    print("In State:", in_state)
                    print("Out State:", out_state)
                    print("Data Length:", len_data)
                    print("Id Motorista:", RFID)
                    print("Velocidade Instantânea:", velocidade_instantanea)
                    print("Velocidade de Pico:", velocidade_pico)
                    print("Temperatura Instantânea:", temperatura_instantanea)
                    print("Temperatura de Pico:", temperatura_pico)

                    
            elif hex_string.startswith('535454'): #STT
                   dados = ascii_string.split(";")
                   if len(dados) >= 33:
                    hdr = dados[0]
                    dev_id = dados[1]
                    report_map = dados[2]
                    model = dados[3]
                    sw_ver = dados[4]
                    msg_type = dados[5]
                    data = dados[6]
                    hora = dados[7]
                    latitude = dados[8]
                    longitude = dados[9]
                    spd = dados[10]
                    crs = dados[11]
                    satt = dados[12]
                    fix = dados[13]
                    in_state = dados[14]
                    out_state = dados[15]
                    mode = dados[16]
                    stt_rpt_type = dados[17]
                    msg_num = dados[18]
                    reserved = dados[19]
                    assign_map = dados[20]
                    pwr_voltage = float(dados[21])
                    bck_voltage = float(dados[22])
                    conn_rat = dados[23]
                    acc_x = round((float(dados[24]) / 256) ** 2, 2)
                    acc_y = round((float(dados[25]) / 256) ** 2, 2)
                    acc_z = round((float(dados[26]) / 256) ** 2, 2)
                    ADC = dados[27]
                    gps_odom = dados[28]
                    trip_distance = dados[29]
                    h_metter = dados[30]
                    trip_h_meter = dados[31]
                    idle_time = dados[32]
                
                    # Calcula o impacto
                    impacto = round((acc_x + acc_y + acc_z) ** 0.5, 2)
                    # Calcula SoC da tensão da bateria
                    soc_tensaost = calcular_soc(pwr_voltage)
                    temperatura = calcular_y(ADC)

                    # Print dos dados processados
                    print("")
                    print("HDR:", hdr)
                    print("Device ID:", dev_id)
                    print("Report Map:", report_map)
                    print("Model:", model)
                    print("Software Version:", sw_ver)
                    print("Message Type:", msg_type)
                    print("Data:", data)
                    print("Hora:", hora)
                    print("Latitude:", latitude)
                    print("Longitude:", longitude)
                    print("Speed gps (Km/h):", spd)
                    print("Course:", crs)
                    print("Satellites:", satt)
                    print("Fix Status:", fix)
                    print("In State:", in_state)
                    print("Out State:", out_state)
                    print("Mode:", mode)
                    print("Report Type:", stt_rpt_type)
                    print("Message Number:", msg_num)
                    print("Reserved:", reserved)
                    print("Assign Map:", assign_map)
                    print("Power Voltage:", pwr_voltage)
                    print("Bateria suntech:", bck_voltage)
                    print("Connection RAT:", conn_rat)
                    print("Acceleration X:", acc_x)
                    print("Acceleration Y:", acc_y)
                    print("Acceleration Z:", acc_z)
                    print("ADC:", ADC)
                    print("GPS Odometer:", gps_odom)
                    print("Trip Distance:", trip_distance)
                    print("Horimeter:", h_metter)
                    print("Trip Horimeter:", trip_h_meter)
                    print("Idle Time:", idle_time)
                    print("Impact:", impacto)
                    print("SoC (Battery Voltage):", soc_tensaost, "%")
                    print("Temperatura:", temperatura)
            elif hex_string.startswith('414c54'):   #ALT
                   dados = ascii_string.split(";")
                   if len(dados) >= 33:
                    hdr = dados[0]
                    dev_id = dados[1]
                    report_map = dados[2]
                    model = dados[3]
                    sw_ver = dados[4]
                    msg_type = dados[5]
                    data = dados[6]
                    hora = dados[7]
                    latitude = dados[8]
                    longitude = dados[9]
                    spd = dados[10]
                    crs = dados[11]
                    satt = dados[12]
                    fix = dados[13]
                    in_state = dados[14]
                    out_state = dados[15]
                    alert_id = dados[16]
                    alert_mod = dados[17]
                    alert_data = dados[18]
                    reserved = dados[19]
                    assign_map = dados[20]
                    pwr_voltage = float(dados[21])
                    bck_voltage = float(dados[22])
                    conn_rat = dados[23]
                    acc_x = round((float(dados[24]) / 256) ** 2, 2)
                    acc_y = round((float(dados[25]) / 256) ** 2, 2)
                    acc_z = round((float(dados[26]) / 256) ** 2, 2)
                    ADC = dados[27]
                    gps_odom = dados[28]
                    trip_distance = dados[29]
                    h_metter = dados[30]
                    trip_h_meter = dados[31]
                    idle_time = dados[32]

                    # Calcula o impacto
                    impacto = round((acc_x + acc_y + acc_z) ** 0.5, 2)
                    # Calcula SoC da tensão da bateria
                    soc_tensaost = calcular_soc(pwr_voltage)
                    temperatura = calcular_y(ADC)

                    # Print dos dados processados
                    print("")
                    print("HDR:", hdr)
                    print("Device ID:", dev_id)
                    print("Report Map:", report_map)
                    print("Model:", model)
                    print("Software Version:", sw_ver)
                    print("Message Type:", msg_type)
                    print("Data:", data)
                    print("Hora:", hora)
                    print("Latitude:", latitude)
                    print("Longitude:", longitude)
                    print("Speed gps (Km/h):", spd)
                    print("Course:", crs)
                    print("Satellites:", satt)
                    print("Fix Status:", fix)
                    print("In State:", in_state)
                    print("Out State:", out_state)
                    print("Alert ID:", alert_id)
                    print("Alert Modifier:", alert_mod)
                    print("Alert Data:", alert_data)
                    print("Reserved:", reserved)
                    print("Assign Map:", assign_map)
                    print("Power Voltage:", pwr_voltage)
                    print("Bateria suntech):", bck_voltage)
                    print("Connection RAT:", conn_rat)
                    print("Acceleration X:", acc_x)
                    print("Acceleration Y:", acc_y)
                    print("Acceleration Z:", acc_z)
                    print("ADC:", ADC)
                    print("GPS Odometer:", gps_odom)
                    print("Trip Distance:", trip_distance)
                    print("Trip Horimeter:", trip_h_meter)
                    print("Idle Time:", idle_time)
                    print("Impact:", impacto)
                    print("SoC (Battery Voltage):", soc_tensaost, "%")
                    print("Temperatura:", temperatura)

except KeyboardInterrupt:
    # Se o usuário pressionar Ctrl+C, encerra o processo
    processo.terminate()

DATA RESULT:

STT;1610013739;FFF83F;161;3.0.7;1;20240604;22:37:21;-19.948785;-44.014357;0.93;231.01;11;1;00001001;00000000;2;1;2502;;000F807F;13.71;4.0;255;-185;-21;-30;6.68;247361;453;4536;625;600

HDR: STT
Device ID: 1610013739
Report Map: FFF83F
Model: 161
Software Version: 3.0.7
Message Type: 1
Data: 20240604
Hora: 22:37:21
Latitude: -19.948785
Longitude: -44.014357
Speed gps (Km/h): 0.93
Course: 231.01
Satellites: 11
Fix Status: 1
In State: 00001001
Out State: 00000000
Mode: 2
Report Type: 1
Message Number: 2502
Reserved:
Assign Map: 000F807F
Power Voltage: 13.71
Bateria suntech: 4.0
Connection RAT: 255
Acceleration X: 0.52
Acceleration Y: 0.01
Acceleration Z: 0.01
ADC: 6.68
GPS Odometer: 247361
Trip Distance: 453
Horimeter: 4536
Trip Horimeter: 625
Idle Time: 600
Impact: 0.73
SoC (Battery Voltage): 100 %
Temperatura: 88932.06