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

PassThruGetNextDevice v5.0

Получение информации об устройстве

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

Описание

Функция последовательно возвращает информацию об устройствах, найденных при последнем вызове PassThruScanForDevices(). При каждом вызове возвращается информация о следующем устройстве из списка. Порядок устройств может отличаться при каждом новом сканировании.

long PassThruGetNextDevice(SDEVICE* psDevice)
Примечание: Вызов PassThruOpen() не требуется перед использованием этой функции. Достаточно предварительно вызвать PassThruScanForDevices().

Параметры

Структура SDEVICE

typedef struct {
    char          DeviceName[80];       // Имя устройства (ASCII, null-terminated)
    unsigned long DeviceAvailable;      // Состояние доступности устройства
    unsigned long DeviceDLLFWStatus;    // Совместимость DLL и прошивки
    unsigned long DeviceConnectMedia;   // Тип подключения (проводное/беспроводное)
    unsigned long DeviceConnectSpeed;   // Скорость соединения (бит/с)
    unsigned long DeviceSignalQuality;  // Качество сигнала (0-100%, 0xFFFFFFFF если неизвестно)
    unsigned long DeviceSignalStrength; // Уровень сигнала (0-100%, 0xFFFFFFFF если неизвестно)
} SDEVICE;

Описание полей структуры

Поле Описание
DeviceName ASCII-строка с именем устройства (до 80 символов включая NULL-терминатор). Имя предназначено для отображения пользователю и должно однозначно идентифицировать устройство. Примеры: "ScanDoc FD #N4999", "ScanDoc PRO (WiFi)"
DeviceAvailable Состояние доступности устройства. См. таблицу значений
DeviceDLLFWStatus Статус совместимости DLL и прошивки устройства. См. таблицу значений
DeviceConnectMedia Тип подключения к устройству. См. таблицу значений
DeviceConnectSpeed Скорость соединения с устройством в битах в секунду
DeviceSignalQuality Качество сигнала от 0 до 100%. Значение 0xFFFFFFFF если не определено
DeviceSignalStrength Уровень сигнала от 0 до 100%. Значение 0xFFFFFFFF если не определено

Значения DeviceAvailable

Константа Значение Описание
DEVICE_STATE_UNKNOWN 0 Состояние устройства не удалось определить
DEVICE_AVAILABLE 1 Устройство свободно и готово к подключению
DEVICE_IN_USE 2 Устройство уже используется (открыто другим приложением)

Значения DeviceDLLFWStatus

Константа Значение Описание
DEVICE_DLL_FW_COMPATIBILTY_UNKNOWN 0 Совместимость DLL и прошивки не удалось определить
DEVICE_DLL_FW_COMPATIBLE 1 DLL и прошивка совместимы
DEVICE_DLL_OR_FW_NOT_COMPATIBLE 2 DLL или прошивка устарели или несовместимы
DEVICE_DLL_NOT_COMPATIBLE 3 DLL устарела или несовместима с устройством
DEVICE_FW_NOT_COMPATIBLE 4 Прошивка устройства устарела или несовместима с DLL

Значения DeviceConnectMedia

Константа Значение Описание
DEVICE_CONN_UNKNOWN 0 Тип подключения не удалось определить
DEVICE_CONN_WIRELESS 1 Беспроводное подключение (WiFi, BLE)
DEVICE_CONN_WIRED 2 Проводное подключение (USB, Ethernet)

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

PassThruScanForDevices(&count)  → Получить количество устройств
    ↓
for (i = 0; i < count; i++) {
    PassThruGetNextDevice(&device) → Получить информацию об устройстве
}
    ↓
PassThruOpen(deviceName)        → Открыть выбранное устройство
Важно: Приложение не обязано вызывать PassThruGetNextDevice() для всех устройств. Можно прекратить перебор в любой момент. Однако последующие вызовы будут продолжать возвращать оставшиеся устройства до конца списка, выгрузки DLL или нового вызова PassThruScanForDevices().

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

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

Примеры

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

#include "j2534_dll.hpp"

unsigned long deviceCount = 0;

// Сканируем устройства
long ret = PassThruScanForDevices(&deviceCount);
if (ret != STATUS_NOERROR || deviceCount == 0)
{
    printf("Устройства не найдены\n");
    return;
}

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

// Перебираем все найденные устройства
SDEVICE device;
for (unsigned long i = 0; i < deviceCount; i++)
{
    ret = PassThruGetNextDevice(&device);
    if (ret != STATUS_NOERROR)
    {
        break;
    }

    printf("\nУстройство %lu:\n", i + 1);
    printf("  Имя: %s\n", device.DeviceName);
    printf("  Доступно: %s\n",
        device.DeviceAvailable == DEVICE_AVAILABLE ? "Да" :
        device.DeviceAvailable == DEVICE_IN_USE ? "Занято" : "Неизвестно");
    printf("  Совместимость: %s\n",
        device.DeviceDLLFWStatus == DEVICE_DLL_FW_COMPATIBLE ? "OK" : "Требуется обновление");
    printf("  Подключение: %s\n",
        device.DeviceConnectMedia == DEVICE_CONN_WIRELESS ? "Беспроводное" :
        device.DeviceConnectMedia == DEVICE_CONN_WIRED ? "Проводное" : "Неизвестно");

    if (device.DeviceSignalStrength != 0xFFFFFFFF)
    {
        printf("  Уровень сигнала: %lu%%\n", device.DeviceSignalStrength);
    }
}

// Подключаемся к первому доступному устройству
// (в реальном приложении нужно дать пользователю выбор)
unsigned long deviceID;
ret = PassThruOpen(device.DeviceName, &deviceID);
if (ret == STATUS_NOERROR)
{
    printf("\nПодключено к: %s\n", device.DeviceName);
    // ... работа с устройством ...
    PassThruClose(deviceID);
}

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

val j2534 = J2534JNI(context)

// Сканируем устройства
val scanResult = j2534.ptScanForDevices()
if (scanResult.status != STATUS_NOERROR || scanResult.deviceCount == 0) {
    Log.w("J2534", "Устройства не найдены")
    return
}

// Собираем информацию обо всех устройствах
val devices = mutableListOf<DeviceInfo>()

for (i in 0 until scanResult.deviceCount) {
    val result = j2534.ptGetNextDevice()
    if (result.status == STATUS_NOERROR) {
        devices.add(result.device)
        Log.i("J2534", """
            Устройство ${i + 1}:
              Имя: ${result.device.name}
              Доступно: ${result.device.available}
              Сигнал: ${result.device.signalStrength}%
        """.trimIndent())
    }
}

// Показываем диалог выбора устройства
showDeviceSelectionDialog(devices) { selectedDevice ->
    val openResult = j2534.ptOpen(selectedDevice.name)
    if (openResult.status == STATUS_NOERROR) {
        // Работа с устройством...
    }
}

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

# Определение структуры 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)
    ]

# Константы
DEVICE_AVAILABLE = 1
DEVICE_IN_USE = 2
DEVICE_DLL_FW_COMPATIBLE = 1
DEVICE_CONN_WIRELESS = 1
DEVICE_CONN_WIRED = 2

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

if ret != 0 or device_count.value == 0:
    print("Устройства не найдены")
    exit()

print(f"Найдено устройств: {device_count.value}\n")

# Получаем информацию о каждом устройстве
devices = []
for i in range(device_count.value):
    device = SDEVICE()
    ret = j2534.PassThruGetNextDevice(byref(device))

    if ret == 0:
        devices.append(device)
        name = device.DeviceName.decode('utf-8')
        available = "Да" if device.DeviceAvailable == DEVICE_AVAILABLE else \
                    "Занято" if device.DeviceAvailable == DEVICE_IN_USE else "?"
        media = "WiFi/BLE" if device.DeviceConnectMedia == DEVICE_CONN_WIRELESS else \
                "USB/LAN" if device.DeviceConnectMedia == DEVICE_CONN_WIRED else "?"

        print(f"Устройство {i + 1}:")
        print(f"  Имя: {name}")
        print(f"  Доступно: {available}")
        print(f"  Подключение: {media}")

        if device.DeviceSignalStrength != 0xFFFFFFFF:
            print(f"  Сигнал: {device.DeviceSignalStrength}%")
        print()

# Подключаемся к первому доступному устройству
if devices:
    device_id = c_ulong()
    ret = j2534.PassThruOpen(devices[0].DeviceName, byref(device_id))
    if ret == 0:
        print(f"Подключено к: {devices[0].DeviceName.decode()}")
        # ... работа с устройством ...
        j2534.PassThruClose(device_id)

Пример на C# (P/Invoke)

using System;
using System.Collections.Generic;
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;
}

public enum DeviceAvailable : uint
{
    Unknown = 0,
    Available = 1,
    InUse = 2
}

public enum DeviceConnectMedia : uint
{
    Unknown = 0,
    Wireless = 1,
    Wired = 2
}

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

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

    [DllImport("j2534sd_v05_00_x64.dll")]
    public static extern int PassThruOpen(string pName, out uint pDeviceID);

    [DllImport("j2534sd_v05_00_x64.dll")]
    public static extern int PassThruClose(uint DeviceID);
}

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

if (ret != 0 || deviceCount == 0)
{
    Console.WriteLine("Устройства не найдены");
    return;
}

Console.WriteLine($"Найдено устройств: {deviceCount}\n");

var devices = new List<SDEVICE>();

for (uint i = 0; i < deviceCount; i++)
{
    SDEVICE device;
    ret = J2534.PassThruGetNextDevice(out device);

    if (ret == 0)
    {
        devices.Add(device);
        Console.WriteLine($"Устройство {i + 1}:");
        Console.WriteLine($"  Имя: {device.DeviceName}");
        Console.WriteLine($"  Доступно: {(DeviceAvailable)device.DeviceAvailable}");
        Console.WriteLine($"  Подключение: {(DeviceConnectMedia)device.DeviceConnectMedia}");

        if (device.DeviceSignalStrength != 0xFFFFFFFF)
            Console.WriteLine($"  Сигнал: {device.DeviceSignalStrength}%");

        Console.WriteLine();
    }
}

// Подключаемся к первому устройству
if (devices.Count > 0)
{
    uint deviceId;
    ret = J2534.PassThruOpen(devices[0].DeviceName, out deviceId);
    if (ret == 0)
    {
        Console.WriteLine($"Подключено к: {devices[0].DeviceName}");
        // ... работа с устройством ...
        J2534.PassThruClose(deviceId);
    }
}

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