Skanowanie urządzeń
Ostatnia modyfikacja:
Funkcja skanuje dostępne adaptery ScanDoc i zwraca liczbę znalezionych urządzeń. Funkcja ta jest częścią standardu SAE J2534-1 i służy do wykrywania urządzeń przed wywołaniem PassThruOpen().
long PassThruScanForDevices(unsigned long* pDeviceCount)
PassThruGetNextDevice(), aby uzyskać informacje o każdym znalezionym urządzeniu.
unsigned long, przydzieloną przez aplikację. Po pomyślnym wykonaniu funkcji zmienna będzie zawierać liczbę znalezionych urządzeń.Funkcja wykonuje następujące działania:
pDeviceCountPassThruGetNextDevice()PassThruScanForDevices() → Skanuj dostępne urządzenia
↓
PassThruGetNextDevice() → Pobierz informacje o każdym urządzeniu (powtórz N razy)
↓
PassThruOpen() → Otwórz połączenie z wybranym urządzeniem
↓
...
PassThruScanForDevices() nie jest obowiązkowe. Jeśli nazwa urządzenia jest znana z góry, można od razu wywołać
PassThruOpen() z odpowiednimi parametrami połączenia.
Limit czasu skanowania sieci: 2000 ms. Limit czasu skanowania BLE: 3000 ms. Całkowity czas wykonania funkcji może wynosić do 5 sekund przy włączonym BLE.
| Kod | Opis | Możliwe przyczyny i rozwiązania |
|---|---|---|
| STATUS_NOERROR | Funkcja wykonana pomyślnie | Liczba znalezionych urządzeń została zapisana w pDeviceCount (może wynosić 0) |
| ERR_NULL_PARAMETER | Nie podano wskaźnika pDeviceCount | Przekaż prawidłowy wskaźnik na zmienną unsigned long |
| ERR_CONCURRENT_API_CALL | Funkcja J2534 API jest już wykonywana |
|
| ERR_NOT_SUPPORTED | Funkcja nie jest obsługiwana |
|
| ERR_FAILED | Błąd wewnętrzny |
|
#include "j2534_dll.hpp"
unsigned long deviceCount = 0;
// Skanujemy urządzenia
long ret = PassThruScanForDevices(&deviceCount);
if (ret != STATUS_NOERROR)
{
char error[256];
PassThruGetLastError(error);
printf("Błąd skanowania: %s\n", error);
return;
}
printf("Znaleziono urządzeń: %lu\n", deviceCount);
if (deviceCount == 0)
{
printf("Nie znaleziono urządzeń\n");
return;
}
// Pobieramy informacje o każdym urządzeniu
SDEVICE deviceInfo;
for (unsigned long i = 0; i < deviceCount; i++)
{
ret = PassThruGetNextDevice(&deviceInfo);
if (ret == STATUS_NOERROR)
{
printf("Urządzenie %lu: %s\n", i + 1, deviceInfo.DeviceName);
}
}
val j2534 = J2534JNI(context)
// Skanujemy urządzenia
val scanResult = j2534.ptScanForDevices()
if (scanResult.status == STATUS_NOERROR) {
Log.i("J2534", "Znaleziono urządzeń: ${scanResult.deviceCount}")
// Pobieramy informacje o każdym urządzeniu
for (i in 0 until scanResult.deviceCount) {
val deviceInfo = j2534.ptGetNextDevice()
if (deviceInfo.status == STATUS_NOERROR) {
Log.i("J2534", "Urządzenie ${i + 1}: ${deviceInfo.deviceName}")
}
}
} else {
Log.e("J2534", "Błąd skanowania: ${scanResult.status}")
}
from ctypes import *
import platform
# Ładowanie biblioteki
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")
device_count = c_ulong()
# Skanujemy urządzenia
ret = j2534.PassThruScanForDevices(byref(device_count))
if ret == 0: # STATUS_NOERROR
print(f"Znaleziono urządzeń: {device_count.value}")
# Struktura SDEVICE do pobierania informacji o urządzeniu
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)
]
# Pobieramy informacje o każdym urządzeniu
for i in range(device_count.value):
device_info = SDEVICE()
ret = j2534.PassThruGetNextDevice(byref(device_info))
if ret == 0:
print(f"Urządzenie {i + 1}: {device_info.DeviceName.decode()}")
else:
error = create_string_buffer(256)
j2534.PassThruGetLastError(error)
print(f"Błąd: {error.value.decode()}")
using System;
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;
}
class J2534
{
[DllImport("j2534sd_v05_00_x64.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int PassThruScanForDevices(out uint pDeviceCount);
[DllImport("j2534sd_v05_00_x64.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int PassThruGetNextDevice(out SDEVICE psDevice);
[DllImport("j2534sd_v05_00_x64.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int PassThruGetLastError(
[MarshalAs(UnmanagedType.LPStr)] System.Text.StringBuilder pErrorDescription);
}
// Użycie:
uint deviceCount;
int ret = J2534.PassThruScanForDevices(out deviceCount);
if (ret == 0) // STATUS_NOERROR
{
Console.WriteLine($"Znaleziono urządzeń: {deviceCount}");
for (uint i = 0; i < deviceCount; i++)
{
SDEVICE deviceInfo;
ret = J2534.PassThruGetNextDevice(out deviceInfo);
if (ret == 0)
{
Console.WriteLine($"Urządzenie {i + 1}: {deviceInfo.DeviceName}");
}
}
}
else
{
var error = new System.Text.StringBuilder(256);
J2534.PassThruGetLastError(error);
Console.WriteLine($"Błąd: {error}");
}
PassThruGetNextDevice() - Pobieranie informacji o znalezionych urządzeniachPassThruOpen() - Nawiązanie połączenia z adapterem