Quantex GmbH
Votre région : Europe

PassThruScanForDevices v5.0

Analyse des périphériques

Dernière modification :

Description

La fonction recherche les adaptateurs ScanDoc disponibles et renvoie le nombre de périphériques trouvés. Cette fonction fait partie de la norme SAE J2534-1 et est destinée à la détection des périphériques avant l'appel de PassThruOpen().

long PassThruScanForDevices(unsigned long* pDeviceCount)
Remarque : Après avoir appelé cette fonction, utilisez PassThruGetNextDevice() pour obtenir les informations sur chaque périphérique trouvé.

Paramètres

Algorithme de fonctionnement

La fonction effectue les actions suivantes :

  1. Recherche les périphériques ScanDoc disponibles sur le réseau local (LAN/WLAN)
  2. Lorsque le BLE est activé, recherche les périphériques BLE
  3. Inscrit le nombre de périphériques trouvés dans pDeviceCount
  4. Enregistre la liste des périphériques pour leur récupération ultérieure via PassThruGetNextDevice()

Ordre d'appel des fonctions

PassThruScanForDevices()  → Rechercher les périphériques disponibles
    ↓
PassThruGetNextDevice()   → Obtenir les informations de chaque périphérique (répéter N fois)
    ↓
PassThruOpen()            → Ouvrir la connexion avec le périphérique sélectionné
    ↓
...
Important : L'appel de PassThruScanForDevices() n'est pas obligatoire. Si le nom du périphérique est connu à l'avance, il est possible d'appeler directement PassThruOpen() avec les paramètres de connexion requis.

Délais d'attente

Délai d'attente de l'analyse du réseau : 2000 ms. Délai d'attente de l'analyse BLE : 3000 ms. Le temps total d'exécution de la fonction peut atteindre 5 secondes lorsque le BLE est activé.

Codes d'erreur renvoyés

Code Description Causes possibles et solutions
STATUS_NOERROR La fonction s'est exécutée avec succès Le nombre de périphériques trouvés a été inscrit dans pDeviceCount (peut être 0)
ERR_NULL_PARAMETER Le pointeur pDeviceCount n'est pas défini Passez un pointeur valide vers une variable unsigned long
ERR_CONCURRENT_API_CALL Une fonction de l'API J2534 est déjà en cours d'exécution
  • Une autre fonction J2534 n'a pas encore terminé son exécution
  • Solution : attendez la fin de l'appel précédent
ERR_NOT_SUPPORTED La fonction n'est pas prise en charge
  • La DLL ne prend pas en charge l'analyse dynamique des périphériques
  • Solution : utilisez PassThruOpen() directement avec des paramètres connus
ERR_FAILED Erreur interne
  • Erreur de l'interface réseau
  • Erreur d'initialisation du BLE
  • Solution : utilisez PassThruGetLastError() pour obtenir les détails

Exemples

Exemple en C/C++

#include "j2534_dll.hpp"

unsigned long deviceCount = 0;

// Recherche des périphériques
long ret = PassThruScanForDevices(&deviceCount);
if (ret != STATUS_NOERROR)
{
    char error[256];
    PassThruGetLastError(error);
    printf("Erreur d'analyse : %s\n", error);
    return;
}

printf("Périphériques trouvés : %lu\n", deviceCount);

if (deviceCount == 0)
{
    printf("Aucun périphérique trouvé\n");
    return;
}

// Obtention des informations de chaque périphérique
SDEVICE deviceInfo;
for (unsigned long i = 0; i < deviceCount; i++)
{
    ret = PassThruGetNextDevice(&deviceInfo);
    if (ret == STATUS_NOERROR)
    {
        printf("Périphérique %lu : %s\n", i + 1, deviceInfo.DeviceName);
    }
}

Exemple en Kotlin (Android)

val j2534 = J2534JNI(context)

// Recherche des périphériques
val scanResult = j2534.ptScanForDevices()

if (scanResult.status == STATUS_NOERROR) {
    Log.i("J2534", "Périphériques trouvés : ${scanResult.deviceCount}")

    // Obtention des informations de chaque périphérique
    for (i in 0 until scanResult.deviceCount) {
        val deviceInfo = j2534.ptGetNextDevice()
        if (deviceInfo.status == STATUS_NOERROR) {
            Log.i("J2534", "Périphérique ${i + 1} : ${deviceInfo.deviceName}")
        }
    }
} else {
    Log.e("J2534", "Erreur d'analyse : ${scanResult.status}")
}

Exemple en Python (ctypes)

from ctypes import *
import platform

# Chargement de la bibliothèque
if platform.system() == "Windows":
    j2534 = windll.LoadLibrary("j2534sd_v05_00_x64.dll")
elif platform.system() == "Darwin":
    j2534 = cdll.LoadLibrary("libj2534_v05_00.dylib")
else:
    j2534 = cdll.LoadLibrary("libj2534_v05_00.so")

device_count = c_ulong()

# Recherche des périphériques
ret = j2534.PassThruScanForDevices(byref(device_count))

if ret == 0:  # STATUS_NOERROR
    print(f"Périphériques trouvés : {device_count.value}")

    # Structure SDEVICE pour obtenir les informations du périphérique
    class SDEVICE(Structure):
        _fields_ = [
            ("DeviceName", c_char * 80),
            ("DeviceAvailable", c_ulong),
            ("DeviceDLLFWStatus", c_ulong),
            ("DeviceConnectMedia", c_ulong),
            ("DeviceConnectSpeed", c_ulong),
            ("DeviceSignalQuality", c_ulong),
            ("DeviceSignalStrength", c_ulong)
        ]

    # Obtention des informations de chaque périphérique
    for i in range(device_count.value):
        device_info = SDEVICE()
        ret = j2534.PassThruGetNextDevice(byref(device_info))
        if ret == 0:
            print(f"Périphérique {i + 1} : {device_info.DeviceName.decode()}")
else:
    error = create_string_buffer(256)
    j2534.PassThruGetLastError(error)
    print(f"Erreur : {error.value.decode()}")

Exemple en C# (P/Invoke)

using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct SDEVICE
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
    public string DeviceName;
    public uint DeviceAvailable;
    public uint DeviceDLLFWStatus;
    public uint DeviceConnectMedia;
    public uint DeviceConnectSpeed;
    public uint DeviceSignalQuality;
    public uint DeviceSignalStrength;
}

class J2534
{
    [DllImport("j2534sd_v05_00_x64.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern int PassThruScanForDevices(out uint pDeviceCount);

    [DllImport("j2534sd_v05_00_x64.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern int PassThruGetNextDevice(out SDEVICE psDevice);

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

// Utilisation :
uint deviceCount;
int ret = J2534.PassThruScanForDevices(out deviceCount);

if (ret == 0) // STATUS_NOERROR
{
    Console.WriteLine($"Périphériques trouvés : {deviceCount}");

    for (uint i = 0; i < deviceCount; i++)
    {
        SDEVICE deviceInfo;
        ret = J2534.PassThruGetNextDevice(out deviceInfo);
        if (ret == 0)
        {
            Console.WriteLine($"Périphérique {i + 1} : {deviceInfo.DeviceName}");
        }
    }
}
else
{
    var error = new System.Text.StringBuilder(256);
    J2534.PassThruGetLastError(error);
    Console.WriteLine($"Erreur : {error}");
}

Fonctions associées