Установить связь с адаптером
Последнее изменение:
Функция устанавливает связь с адаптером ScanDoc. Параметры подключения (IP-адрес или имя BLE устройства)
читаются из конфигурационного файла j2534.json.
long PassThruOpen(void* pName, unsigned long* pDeviceID)
NULL или указатель на пустую строку.
Параметры подключения читаются из конфигурационного файла.PassThruConnect(), PassThruClose() и других.
Настройки подключения хранятся в файле 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 | Нет соединения с адаптером |
|
| ERR_DEVICE_IN_USE | Устройство уже используется |
|
| ERR_NULL_PARAMETER | Не задан указатель pDeviceID | Передайте корректный указатель на переменную |
| ERR_FAILED | Внутренняя ошибка |
|
#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);
В данном примере используется 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}")
}
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()}")
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}");
}