Quantex GmbH
Su región: Europa

PassThruOpen v4.04 v5.0

Establecer la conexión con el adaptador

Última modificación:

Descripción

La función establece la conexión con el adaptador ScanDoc. Los parámetros de conexión (dirección IP o nombre del dispositivo BLE) se leen del archivo de configuración j2534.json.

long PassThruOpen(void* pName, unsigned long* pDeviceID)

Parámetros

Archivo de configuración

Los ajustes de conexión se almacenan en el archivo j2534.json. La ubicación del archivo depende del sistema operativo:

Sistema operativo Ruta al archivo
Windows %APPDATA%\Quantex\j2534.json
Por ejemplo: C:\Users\User\AppData\Roaming\Quantex\j2534.json
macOS ~/Library/Application Support/Quantex/j2534.json
Linux ~/.config/quantex/j2534.json

Si el archivo no existe, se creará automáticamente con los ajustes predeterminados.

Formato del archivo de configuración

{
    "current_device": 0,
    "devices": [
        {
            "name": "ScanDoc",
            "connection_type": "LAN",
            "device_ip": "192.168.1.3",
            "device_name": ""
        }
    ],
    "logs_directory": "",
    "debug": false
}

Descripción de los campos

Campo Tipo Descripción
current_device number Índice del dispositivo activo en el arreglo devices (empezando desde 0)
devices array Arreglo de dispositivos. Para la API v04.04 se usa solo un dispositivo con el índice current_device
name string Nombre mostrado del dispositivo (para comodidad del usuario)
connection_type string "LAN" para WLAN/Ethernet o "BLE" para BLE Low Energy
device_ip string Dirección IP del adaptador (se usa con connection_type = "LAN")
device_name string Número de serie o nombre del dispositivo BLE (se usa con connection_type = "BLE")
logs_directory string Carpeta para los archivos de registro. Si está vacía, los registros se guardan en <config_dir>/sdlogs
debug boolean true - activar el registro, false - desactivarlo

Ejemplos de configuración

Conexión por WLAN/LAN:

{
    "current_device": 0,
    "devices": [
        {
            "name": "ScanDoc FD",
            "connection_type": "LAN",
            "device_ip": "192.168.1.100",
            "device_name": ""
        }
    ],
    "debug": false
}

Conexión por BLE:

{
    "current_device": 0,
    "devices": [
        {
            "name": "ScanDoc FD",
            "connection_type": "BLE",
            "device_ip": "",
            "device_name": "N4999"
        }
    ],
    "debug": true
}

Orden de llamada de las funciones

PassThruOpen()       → Establecer la conexión con el adaptador
    ↓
PassThruConnect()    → Abrir el canal de comunicación con la ECU
    ↓
PassThruReadMsg() / PassThruWriteMsg()  → Intercambio de mensajes
    ↓
PassThruDisconnect() → Cerrar el canal
    ↓
PassThruClose()      → Liberar los recursos del adaptador
Llame siempre a PassThruClose() antes de finalizar el programa. De lo contrario, la siguiente conexión devolverá el error ERR_DEVICE_IN_USE.

Tiempos de espera

Tiempo de espera de conexión: 500 ms. Si el adaptador no está disponible, la función devolverá ERR_DEVICE_NOT_CONNECTED tras agotarse el tiempo de espera.

Códigos de error devueltos

Código Descripción Posibles causas y soluciones
STATUS_NOERROR La función se ejecutó correctamente -
ERR_DEVICE_NOT_CONNECTED No hay conexión con el adaptador
  • El adaptador está apagado
  • No hay conexión de red
  • Dirección IP incorrecta en la configuración
  • Solución: compruebe la alimentación del adaptador, ejecute ping a la dirección IP
ERR_DEVICE_IN_USE El dispositivo ya está en uso
  • No se llamó a PassThruClose() en la sesión anterior
  • Otro programa está usando el adaptador
  • Solución: reinicie el programa o el adaptador
ERR_NULL_PARAMETER No se especificó el puntero pDeviceID Pase un puntero válido a la variable
ERR_FAILED Error interno
  • Error de lectura del archivo de configuración
  • Error de asignación de memoria
  • Solución: use PassThruGetLastError() para obtener los detalles

Ejemplos

Ejemplo en C/C++

#include "j2534_dll.hpp"

unsigned long DeviceID;
long ret;

// pName = NULL - los ajustes se leen de j2534.json
ret = PassThruOpen(NULL, &DeviceID);
if (ret != STATUS_NOERROR)
{
    char error[256];
    PassThruGetLastError(error);
    printf("Error: %s\n", error);
    return;
}

// Trabajo con el dispositivo...

// Cerramos la conexión obligatoriamente
PassThruClose(DeviceID);

Ejemplo en Kotlin (Android)

En este ejemplo se usa el envoltorio JNI J2534JNI para llamar a las funciones nativas J2534 desde Kotlin.

// J2534JNI - es una clase envoltorio para JNI
val j2534 = J2534JNI(context)

// Pasamos null - los ajustes se leen de j2534.json
val deviceResult = j2534.ptOpen(null)

if (deviceResult.status == STATUS_NOERROR) {
    val deviceID = deviceResult.deviceId
    Log.i("J2534", "Adaptador abierto, DeviceID: $deviceID")

    // Trabajo con el dispositivo...

    // Cerramos la conexión obligatoriamente
    j2534.ptClose(deviceID)
} else {
    Log.e("J2534", "Error: ${deviceResult.status}")
}

Ejemplo en Python (ctypes)

from ctypes import *
import platform

# Carga de la biblioteca según el sistema operativo
if platform.system() == "Windows":
    j2534 = windll.LoadLibrary("j2534sd_v04_04_x64.dll")
elif platform.system() == "Darwin":
    j2534 = cdll.LoadLibrary("libj2534_v04_04.dylib")
else:
    j2534 = cdll.LoadLibrary("libj2534_v04_04.so")

device_id = c_ulong()

# pName = None - los ajustes se leen de j2534.json
ret = j2534.PassThruOpen(None, byref(device_id))

if ret == 0:  # STATUS_NOERROR
    print(f"Adaptador abierto, DeviceID: {device_id.value}")

    # Trabajo con el dispositivo...

    # Cerramos la conexión obligatoriamente
    j2534.PassThruClose(device_id)
else:
    error = create_string_buffer(256)
    j2534.PassThruGetLastError(error)
    print(f"Error: {error.value.decode()}")

Ejemplo en C# (P/Invoke)

using System;
using System.Runtime.InteropServices;

class J2534
{
    [DllImport("j2534sd_v04_04_x64.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern int PassThruOpen(IntPtr pName, out uint pDeviceID);

    [DllImport("j2534sd_v04_04_x64.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern int PassThruClose(uint DeviceID);

    [DllImport("j2534sd_v04_04_x64.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern int PassThruGetLastError(
        [MarshalAs(UnmanagedType.LPStr)] System.Text.StringBuilder pErrorDescription);
}

// Uso:
uint deviceId;
// IntPtr.Zero = NULL - los ajustes se leen de j2534.json
int ret = J2534.PassThruOpen(IntPtr.Zero, out deviceId);

if (ret == 0) // STATUS_NOERROR
{
    Console.WriteLine($"Adaptador abierto, DeviceID: {deviceId}");

    // Trabajo con el dispositivo...

    // Cerramos la conexión obligatoriamente
    J2534.PassThruClose(deviceId);
}
else
{
    var error = new System.Text.StringBuilder(256);
    J2534.PassThruGetLastError(error);
    Console.WriteLine($"Error: {error}");
}