Establecer la conexión con el adaptador
Última modificació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)
NULL o un puntero a una cadena vacía. Los parámetros de conexión se leen del archivo de configuración.PassThruConnect(), PassThruClose() y otras.
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.jsonPor 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.
{
"current_device": 0,
"devices": [
{
"name": "ScanDoc",
"connection_type": "LAN",
"device_ip": "192.168.1.3",
"device_name": ""
}
],
"logs_directory": "",
"debug": false
}
| 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 |
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
}
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
PassThruClose() antes de finalizar el programa. De lo contrario, la siguiente conexión devolverá el error ERR_DEVICE_IN_USE.
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ó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 |
|
| ERR_DEVICE_IN_USE | El dispositivo ya está en uso |
|
| ERR_NULL_PARAMETER | No se especificó el puntero pDeviceID | Pase un puntero válido a la variable |
| ERR_FAILED | Error interno |
|
#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);
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}")
}
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()}")
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}");
}