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

PassThruOpen v4.04 v5.0

Установить связь с адаптером

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

Описание

Функция устанавливает связь с адаптером ScanDoc. Параметры подключения (IP-адрес или имя BLE устройства) читаются из конфигурационного файла j2534.json.

long PassThruOpen(void* pName, unsigned long* pDeviceID)

Параметры

Конфигурационный файл

Настройки подключения хранятся в файле j2534.json. Расположение файла зависит от операционной системы:

ОС Путь к файлу
Windows %APPDATA%\Quantex\j2534.json
Например: C:\Users\User\AppData\Roaming\Quantex\j2534.json
macOS ~/Library/Application Support/Quantex/j2534.json
Linux ~/.config/quantex/j2534.json

Если файл не существует, он будет создан автоматически с настройками по умолчанию.

Формат конфигурационного файла

{
    "current_device": 0,
    "devices": [
        {
            "name": "ScanDoc",
            "connection_type": "LAN",
            "device_ip": "192.168.1.3",
            "device_name": ""
        }
    ],
    "logs_directory": "",
    "debug": false
}

Описание полей

Поле Тип Описание
current_device number Индекс активного устройства в массиве devices (начиная с 0)
devices array Массив устройств. Для API v04.04 используется только одно устройство с индексом current_device
name string Отображаемое имя устройства (для удобства пользователя)
connection_type string "LAN" для WiFi/Ethernet или "BLE" для BLE Low Energy
device_ip string IP-адрес адаптера (используется при connection_type = "LAN")
device_name string Серийный номер или имя BLE устройства (используется при connection_type = "BLE")
logs_directory string Папка для лог-файлов. Если пустая, логи сохраняются в <config_dir>/sdlogs
debug boolean true - включить запись логов, false - отключить

Примеры конфигурации

Подключение по WiFi/LAN:

{
    "current_device": 0,
    "devices": [
        {
            "name": "ScanDoc FD",
            "connection_type": "LAN",
            "device_ip": "192.168.1.100",
            "device_name": ""
        }
    ],
    "debug": false
}

Подключение по BLE (BLE):

{
    "current_device": 0,
    "devices": [
        {
            "name": "ScanDoc FD",
            "connection_type": "BLE",
            "device_ip": "",
            "device_name": "N4999"
        }
    ],
    "debug": true
}

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

PassThruOpen()       → Установить связь с адаптером
    ↓
PassThruConnect()    → Открыть канал связи с ECU
    ↓
PassThruReadMsg() / PassThruWriteMsg()  → Обмен сообщениями
    ↓
PassThruDisconnect() → Закрыть канал
    ↓
PassThruClose()      → Освободить ресурсы адаптера
Всегда вызывайте PassThruClose() перед завершением программы. Иначе следующее подключение вернёт ошибку ERR_DEVICE_IN_USE.

Таймауты

Таймаут подключения: 500 мс. При недоступности адаптера функция вернёт ERR_DEVICE_NOT_CONNECTED после истечения таймаута.

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

Код Описание Возможные причины и решения
STATUS_NOERROR Функция выполнена успешно -
ERR_DEVICE_NOT_CONNECTED Нет соединения с адаптером
  • Адаптер выключен
  • Нет сетевого соединения
  • Неверный IP-адрес в конфигурации
  • Решение: проверьте питание адаптера, выполните ping на IP-адрес
ERR_DEVICE_IN_USE Устройство уже используется
  • Не была вызвана PassThruClose() в предыдущей сессии
  • Другая программа использует адаптер
  • Решение: перезапустите программу или адаптер
ERR_NULL_PARAMETER Не задан указатель pDeviceID Передайте корректный указатель на переменную
ERR_FAILED Внутренняя ошибка
  • Ошибка чтения конфигурационного файла
  • Ошибка выделения памяти
  • Решение: используйте PassThruGetLastError() для получения деталей

Примеры

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

#include "j2534_dll.hpp"

unsigned long DeviceID;
long ret;

// pName = NULL - настройки читаются из j2534.json
ret = PassThruOpen(NULL, &DeviceID);
if (ret != STATUS_NOERROR)
{
    char error[256];
    PassThruGetLastError(error);
    printf("Error: %s\n", error);
    return;
}

// Работа с устройством...

// Обязательно закрываем соединение
PassThruClose(DeviceID);

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

В данном примере используется JNI-обертка J2534JNI для вызова нативных функций J2534 из Kotlin.

// J2534JNI - это класс-обертка для JNI
val j2534 = J2534JNI(context)

// Передаём null - настройки читаются из j2534.json
val deviceResult = j2534.ptOpen(null)

if (deviceResult.status == STATUS_NOERROR) {
    val deviceID = deviceResult.deviceId
    Log.i("J2534", "Адаптер открыт, DeviceID: $deviceID")

    // Работа с устройством...

    // Обязательно закрываем соединение
    j2534.ptClose(deviceID)
} else {
    Log.e("J2534", "Ошибка: ${deviceResult.status}")
}

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

from ctypes import *
import platform

# Загрузка библиотеки в зависимости от ОС
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 - настройки читаются из j2534.json
ret = j2534.PassThruOpen(None, byref(device_id))

if ret == 0:  # STATUS_NOERROR
    print(f"Адаптер открыт, DeviceID: {device_id.value}")

    # Работа с устройством...

    # Обязательно закрываем соединение
    j2534.PassThruClose(device_id)
else:
    error = create_string_buffer(256)
    j2534.PassThruGetLastError(error)
    print(f"Ошибка: {error.value.decode()}")

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

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);
}

// Использование:
uint deviceId;
// IntPtr.Zero = NULL - настройки читаются из j2534.json
int ret = J2534.PassThruOpen(IntPtr.Zero, out deviceId);

if (ret == 0) // STATUS_NOERROR
{
    Console.WriteLine($"Адаптер открыт, DeviceID: {deviceId}");

    // Работа с устройством...

    // Обязательно закрываем соединение
    J2534.PassThruClose(deviceId);
}
else
{
    var error = new System.Text.StringBuilder(256);
    J2534.PassThruGetLastError(error);
    Console.WriteLine($"Ошибка: {error}");
}