Функция последовательно возвращает информацию об устройствах, найденных при последнем вызове
PassThruScanForDevices(). При каждом вызове возвращается информация о следующем
устройстве из списка. Порядок устройств может отличаться при каждом новом сканировании.
long PassThruGetNextDevice(SDEVICE* psDevice)
Примечание: Вызов PassThruOpen() не требуется
перед использованием этой функции. Достаточно предварительно вызвать PassThruScanForDevices().
Параметры
psDevice - Указатель на структуру SDEVICE, выделенную приложением.
После успешного выполнения функции структура будет заполнена информацией об устройстве.
Структура 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)"
Скорость соединения с устройством в битах в секунду
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);
}
}