Verbindung zum Adapter herstellen
Letzte Änderung:
Die Funktion stellt die Verbindung zum ScanDoc-Adapter her. Die Verbindungsparameter (IP-Adresse oder Name des BLE-Geräts) werden aus der Konfigurationsdatei j2534.json gelesen.
long PassThruOpen(void* pName, unsigned long* pDeviceID)
NULL oder ein Zeiger auf eine leere Zeichenkette sein. Die Verbindungsparameter werden aus der Konfigurationsdatei gelesen.PassThruConnect(), PassThruClose() und anderen verwendet.
Die Verbindungseinstellungen werden in der Datei j2534.json gespeichert. Der Speicherort der Datei hängt vom Betriebssystem ab:
| Betriebssystem | Dateipfad |
|---|---|
| Windows | %APPDATA%\Quantex\j2534.jsonBeispiel: C:\Users\User\AppData\Roaming\Quantex\j2534.json |
| macOS | ~/Library/Application Support/Quantex/j2534.json |
| Linux | ~/.config/quantex/j2534.json |
Wenn die Datei nicht vorhanden ist, wird sie automatisch mit den Standardeinstellungen erstellt.
{
"current_device": 0,
"devices": [
{
"name": "ScanDoc",
"connection_type": "LAN",
"device_ip": "192.168.1.3",
"device_name": ""
}
],
"logs_directory": "",
"debug": false
}
| Feld | Typ | Beschreibung |
|---|---|---|
| current_device | number | Index des aktiven Geräts im Array devices (beginnend bei 0) |
| devices | array | Array der Geräte. Für die API v04.04 wird nur ein Gerät mit dem Index current_device verwendet |
| name | string | Anzeigename des Geräts (zur besseren Übersicht für den Benutzer) |
| connection_type | string | "LAN" für WLAN/Ethernet oder "BLE" für BLE Low Energy |
| device_ip | string | IP-Adresse des Adapters (wird bei connection_type = "LAN" verwendet) |
| device_name | string | Seriennummer oder Name des BLE-Geräts (wird bei connection_type = "BLE" verwendet) |
| logs_directory | string | Ordner für Log-Dateien. Wenn leer, werden die Logs in <config_dir>/sdlogs gespeichert |
| debug | boolean | true - Protokollierung aktivieren, false - deaktivieren |
Verbindung über WLAN/LAN:
{
"current_device": 0,
"devices": [
{
"name": "ScanDoc FD",
"connection_type": "LAN",
"device_ip": "192.168.1.100",
"device_name": ""
}
],
"debug": false
}
Verbindung über BLE:
{
"current_device": 0,
"devices": [
{
"name": "ScanDoc FD",
"connection_type": "BLE",
"device_ip": "",
"device_name": "N4999"
}
],
"debug": true
}
PassThruOpen() → Verbindung zum Adapter herstellen
↓
PassThruConnect() → Kommunikationskanal zum ECU öffnen
↓
PassThruReadMsg() / PassThruWriteMsg() → Nachrichtenaustausch
↓
PassThruDisconnect() → Kanal schließen
↓
PassThruClose() → Ressourcen des Adapters freigeben
PassThruClose() auf, bevor Sie das Programm beenden. Andernfalls liefert die nächste Verbindung den Fehler ERR_DEVICE_IN_USE zurück.
Verbindungs-Timeout: 500 ms. Ist der Adapter nicht erreichbar, liefert die Funktion nach Ablauf des Timeouts
ERR_DEVICE_NOT_CONNECTED zurück.
| Code | Beschreibung | Mögliche Ursachen und Lösungen |
|---|---|---|
| STATUS_NOERROR | Funktion erfolgreich ausgeführt | - |
| ERR_DEVICE_NOT_CONNECTED | Keine Verbindung zum Adapter |
|
| ERR_DEVICE_IN_USE | Gerät wird bereits verwendet |
|
| ERR_NULL_PARAMETER | Der Zeiger pDeviceID wurde nicht angegeben | Übergeben Sie einen gültigen Zeiger auf eine Variable |
| ERR_FAILED | Interner Fehler |
|
#include "j2534_dll.hpp"
unsigned long DeviceID;
long ret;
// pName = NULL - Einstellungen werden aus j2534.json gelesen
ret = PassThruOpen(NULL, &DeviceID);
if (ret != STATUS_NOERROR)
{
char error[256];
PassThruGetLastError(error);
printf("Error: %s\n", error);
return;
}
// Arbeit mit dem Gerät...
// Verbindung unbedingt schließen
PassThruClose(DeviceID);
In diesem Beispiel wird der JNI-Wrapper J2534JNI verwendet, um die nativen J2534-Funktionen aus Kotlin aufzurufen.
// J2534JNI - das ist eine Wrapper-Klasse für JNI
val j2534 = J2534JNI(context)
// Wir übergeben null - Einstellungen werden aus j2534.json gelesen
val deviceResult = j2534.ptOpen(null)
if (deviceResult.status == STATUS_NOERROR) {
val deviceID = deviceResult.deviceId
Log.i("J2534", "Adapter geöffnet, DeviceID: $deviceID")
// Arbeit mit dem Gerät...
// Verbindung unbedingt schließen
j2534.ptClose(deviceID)
} else {
Log.e("J2534", "Fehler: ${deviceResult.status}")
}
from ctypes import *
import platform
# Laden der Bibliothek je nach Betriebssystem
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 - Einstellungen werden aus j2534.json gelesen
ret = j2534.PassThruOpen(None, byref(device_id))
if ret == 0: # STATUS_NOERROR
print(f"Adapter geöffnet, DeviceID: {device_id.value}")
# Arbeit mit dem Gerät...
# Verbindung unbedingt schließen
j2534.PassThruClose(device_id)
else:
error = create_string_buffer(256)
j2534.PassThruGetLastError(error)
print(f"Fehler: {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);
}
// Verwendung:
uint deviceId;
// IntPtr.Zero = NULL - Einstellungen werden aus j2534.json gelesen
int ret = J2534.PassThruOpen(IntPtr.Zero, out deviceId);
if (ret == 0) // STATUS_NOERROR
{
Console.WriteLine($"Adapter geöffnet, DeviceID: {deviceId}");
// Arbeit mit dem Gerät...
// Verbindung unbedingt schließen
J2534.PassThruClose(deviceId);
}
else
{
var error = new System.Text.StringBuilder(256);
J2534.PassThruGetLastError(error);
Console.WriteLine($"Fehler: {error}");
}