Quantex GmbH
DE RU EN EL
Ваш регион: Европа

PassThruScanForDevices v5.0

Сканирование устройств

Последнее изменение:

Описание

Функция сканирует доступные адаптеры ScanDoc и возвращает количество найденных устройств. Эта функция является частью стандарта SAE J2534-1 и предназначена для обнаружения устройств перед вызовом PassThruOpen().

long PassThruScanForDevices(unsigned long* pDeviceCount)
Примечание: После вызова этой функции используйте PassThruGetNextDevice() для получения информации о каждом найденном устройстве.

Параметры

Алгоритм работы

Функция выполняет следующие действия:

  1. Сканирует доступные устройства ScanDoc в локальной сети (LAN/WiFi)
  2. При включённом Bluetooth сканирует BLE-устройства
  3. Записывает количество найденных устройств в pDeviceCount
  4. Сохраняет список устройств для последующего получения через PassThruGetNextDevice()

Порядок вызова функций

PassThruScanForDevices()  → Сканировать доступные устройства
    ↓
PassThruGetNextDevice()   → Получить информацию о каждом устройстве (повторять N раз)
    ↓
PassThruOpen()            → Открыть соединение с выбранным устройством
    ↓
...
Важно: Вызов PassThruScanForDevices() не является обязательным. Если имя устройства известно заранее, можно сразу вызвать PassThruOpen() с нужными параметрами подключения.

Таймауты

Таймаут сканирования сети: 2000 мс. Таймаут сканирования BLE: 3000 мс. Общее время выполнения функции может составлять до 5 секунд при включённом Bluetooth.

Возвращаемые коды ошибок

Код Описание Возможные причины и решения
STATUS_NOERROR Функция выполнена успешно Количество найденных устройств записано в pDeviceCount (может быть 0)
ERR_NULL_PARAMETER Не задан указатель pDeviceCount Передайте корректный указатель на переменную unsigned long
ERR_CONCURRENT_API_CALL Функция J2534 API уже выполняется
  • Другая функция J2534 ещё не завершила выполнение
  • Решение: дождитесь завершения предыдущего вызова
ERR_NOT_SUPPORTED Функция не поддерживается
  • DLL не поддерживает динамическое сканирование устройств
  • Решение: используйте PassThruOpen() напрямую с известными параметрами
ERR_FAILED Внутренняя ошибка
  • Ошибка сетевого интерфейса
  • Ошибка инициализации Bluetooth
  • Решение: используйте PassThruGetLastError() для получения деталей

Примеры

Пример на C/C++

#include "j2534_dll.hpp"

unsigned long deviceCount = 0;

// Сканируем устройства
long ret = PassThruScanForDevices(&deviceCount);
if (ret != STATUS_NOERROR)
{
    char error[256];
    PassThruGetLastError(error);
    printf("Ошибка сканирования: %s\n", error);
    return;
}

printf("Найдено устройств: %lu\n", deviceCount);

if (deviceCount == 0)
{
    printf("Устройства не найдены\n");
    return;
}

// Получаем информацию о каждом устройстве
SDEVICE deviceInfo;
for (unsigned long i = 0; i < deviceCount; i++)
{
    ret = PassThruGetNextDevice(&deviceInfo);
    if (ret == STATUS_NOERROR)
    {
        printf("Устройство %lu: %s\n", i + 1, deviceInfo.DeviceName);
    }
}

Пример на Kotlin (Android)

val j2534 = J2534JNI(context)

// Сканируем устройства
val scanResult = j2534.ptScanForDevices()

if (scanResult.status == STATUS_NOERROR) {
    Log.i("J2534", "Найдено устройств: ${scanResult.deviceCount}")

    // Получаем информацию о каждом устройстве
    for (i in 0 until scanResult.deviceCount) {
        val deviceInfo = j2534.ptGetNextDevice()
        if (deviceInfo.status == STATUS_NOERROR) {
            Log.i("J2534", "Устройство ${i + 1}: ${deviceInfo.deviceName}")
        }
    }
} else {
    Log.e("J2534", "Ошибка сканирования: ${scanResult.status}")
}

Пример на Python (ctypes)

from ctypes import *
import platform

# Загрузка библиотеки
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()

# Сканируем устройства
ret = j2534.PassThruScanForDevices(byref(device_count))

if ret == 0:  # STATUS_NOERROR
    print(f"Найдено устройств: {device_count.value}")

    # Структура SDEVICE для получения информации об устройстве
    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)
        ]

    # Получаем информацию о каждом устройстве
    for i in range(device_count.value):
        device_info = SDEVICE()
        ret = j2534.PassThruGetNextDevice(byref(device_info))
        if ret == 0:
            print(f"Устройство {i + 1}: {device_info.DeviceName.decode()}")
else:
    error = create_string_buffer(256)
    j2534.PassThruGetLastError(error)
    print(f"Ошибка: {error.value.decode()}")

Пример на 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);
}

// Использование:
uint deviceCount;
int ret = J2534.PassThruScanForDevices(out deviceCount);

if (ret == 0) // STATUS_NOERROR
{
    Console.WriteLine($"Найдено устройств: {deviceCount}");

    for (uint i = 0; i < deviceCount; i++)
    {
        SDEVICE deviceInfo;
        ret = J2534.PassThruGetNextDevice(out deviceInfo);
        if (ret == 0)
        {
            Console.WriteLine($"Устройство {i + 1}: {deviceInfo.DeviceName}");
        }
    }
}
else
{
    var error = new System.Text.StringBuilder(256);
    J2534.PassThruGetLastError(error);
    Console.WriteLine($"Ошибка: {error}");
}

Связанные функции