Établir la connexion avec l'adaptateur
Dernière modification :
La fonction établit la connexion avec l'adaptateur ScanDoc. Les paramètres de connexion (adresse IP ou nom du périphérique BLE) sont lus dans le fichier de configuration j2534.json.
long PassThruOpen(void* pName, unsigned long* pDeviceID)
NULL ou un pointeur vers une chaîne vide. Les paramètres de connexion sont lus dans le fichier de configuration.PassThruConnect(), PassThruClose() et autres.
Les paramètres de connexion sont stockés dans le fichier j2534.json. L'emplacement du fichier dépend du système d'exploitation :
| Système d'exploitation | Chemin du fichier |
|---|---|
| Windows | %APPDATA%\Quantex\j2534.jsonPar exemple : C:\Users\User\AppData\Roaming\Quantex\j2534.json |
| macOS | ~/Library/Application Support/Quantex/j2534.json |
| Linux | ~/.config/quantex/j2534.json |
Si le fichier n'existe pas, il sera créé automatiquement avec les paramètres par défaut.
{
"current_device": 0,
"devices": [
{
"name": "ScanDoc",
"connection_type": "LAN",
"device_ip": "192.168.1.3",
"device_name": ""
}
],
"logs_directory": "",
"debug": false
}
| Champ | Type | Description |
|---|---|---|
| current_device | number | Index du périphérique actif dans le tableau devices (en commençant par 0) |
| devices | array | Tableau des périphériques. Pour l'API v04.04, un seul périphérique avec l'index current_device est utilisé |
| name | string | Nom affiché du périphérique (pour la commodité de l'utilisateur) |
| connection_type | string | "LAN" pour WLAN/Ethernet ou "BLE" pour BLE Low Energy |
| device_ip | string | Adresse IP de l'adaptateur (utilisée avec connection_type = "LAN") |
| device_name | string | Numéro de série ou nom du périphérique BLE (utilisé avec connection_type = "BLE") |
| logs_directory | string | Dossier des fichiers journaux. S'il est vide, les journaux sont enregistrés dans <config_dir>/sdlogs |
| debug | boolean | true - activer l'enregistrement des journaux, false - le désactiver |
Connexion par WLAN/LAN :
{
"current_device": 0,
"devices": [
{
"name": "ScanDoc FD",
"connection_type": "LAN",
"device_ip": "192.168.1.100",
"device_name": ""
}
],
"debug": false
}
Connexion par BLE :
{
"current_device": 0,
"devices": [
{
"name": "ScanDoc FD",
"connection_type": "BLE",
"device_ip": "",
"device_name": "N4999"
}
],
"debug": true
}
PassThruOpen() → Établir la connexion avec l'adaptateur
↓
PassThruConnect() → Ouvrir le canal de communication avec l'ECU
↓
PassThruReadMsg() / PassThruWriteMsg() → Échange de messages
↓
PassThruDisconnect() → Fermer le canal
↓
PassThruClose() → Libérer les ressources de l'adaptateur
PassThruClose() avant de terminer le programme. Sinon, la connexion suivante renverra l'erreur ERR_DEVICE_IN_USE.
Délai d'attente de connexion : 500 ms. Si l'adaptateur n'est pas disponible, la fonction renverra
ERR_DEVICE_NOT_CONNECTED à l'expiration du délai d'attente.
| Code | Description | Causes possibles et solutions |
|---|---|---|
| STATUS_NOERROR | La fonction s'est exécutée avec succès | - |
| ERR_DEVICE_NOT_CONNECTED | Aucune connexion avec l'adaptateur |
|
| ERR_DEVICE_IN_USE | Le périphérique est déjà utilisé |
|
| ERR_NULL_PARAMETER | Le pointeur pDeviceID n'est pas spécifié | Passez un pointeur valide vers la variable |
| ERR_FAILED | Erreur interne |
|
#include "j2534_dll.hpp"
unsigned long DeviceID;
long ret;
// pName = NULL - les paramètres sont lus dans j2534.json
ret = PassThruOpen(NULL, &DeviceID);
if (ret != STATUS_NOERROR)
{
char error[256];
PassThruGetLastError(error);
printf("Error: %s\n", error);
return;
}
// Travail avec le périphérique...
// Fermeture obligatoire de la connexion
PassThruClose(DeviceID);
Dans cet exemple, l'enveloppe JNI J2534JNI est utilisée pour appeler les fonctions natives J2534 depuis Kotlin.
// J2534JNI - est une classe enveloppe pour JNI
val j2534 = J2534JNI(context)
// On passe null - les paramètres sont lus dans j2534.json
val deviceResult = j2534.ptOpen(null)
if (deviceResult.status == STATUS_NOERROR) {
val deviceID = deviceResult.deviceId
Log.i("J2534", "Adaptateur ouvert, DeviceID: $deviceID")
// Travail avec le périphérique...
// Fermeture obligatoire de la connexion
j2534.ptClose(deviceID)
} else {
Log.e("J2534", "Erreur: ${deviceResult.status}")
}
from ctypes import *
import platform
# Chargement de la bibliothèque selon le système d'exploitation
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 - les paramètres sont lus dans j2534.json
ret = j2534.PassThruOpen(None, byref(device_id))
if ret == 0: # STATUS_NOERROR
print(f"Adaptateur ouvert, DeviceID: {device_id.value}")
# Travail avec le périphérique...
# Fermeture obligatoire de la connexion
j2534.PassThruClose(device_id)
else:
error = create_string_buffer(256)
j2534.PassThruGetLastError(error)
print(f"Erreur: {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);
}
// Utilisation :
uint deviceId;
// IntPtr.Zero = NULL - les paramètres sont lus dans j2534.json
int ret = J2534.PassThruOpen(IntPtr.Zero, out deviceId);
if (ret == 0) // STATUS_NOERROR
{
Console.WriteLine($"Adaptateur ouvert, DeviceID: {deviceId}");
// Travail avec le périphérique...
// Fermeture obligatoire de la connexion
J2534.PassThruClose(deviceId);
}
else
{
var error = new System.Text.StringBuilder(256);
J2534.PassThruGetLastError(error);
Console.WriteLine($"Erreur: {error}");
}