ChargeLink

Install and Activate

What you receive

The package is delivered as ChargeLink-<VERSION>-bench-kit-win64.zip (30 MB) with its .sha256 file. It contains everything this manual documents: chargelink.exe is one binary with every command, for the charger role and the vehicle role. The kit also contains the NI VeriStand bench files for a plant-coupled ISO 15118-20 DC EIM charger (NI VeriStand 2024, simulated power stage) and the vehicle-side launcher with its EV case files. It contains no certificate or key, no NI software, no .NET runtime, no source code and no private keys.

The kit has a charger\ and a vehicle\ folder.

ChargeLink-<VERSION>-bench-kit-win64\
  README.md, KIT_CONTENTS.md
  docs\        INSTALL-CHARGER.md, INSTALL-VEHICLE.md, OPERATION.md, KNOWN_LIMITATIONS.md, SECURITY.md, SIGNING.md, CHANGELOG.md
  manifest\    SHA256SUMS and the release records
  licenses\    NOTICE.txt, THIRD_PARTY_LICENSES.txt, chargelink-<VERSION>.cdx.json (SBOM), DOTNET_AND_NI.txt
  charger\bin\chargelink.exe           the CLI: every command in this manual
  charger\host\                       ChargeLink.Veristand.XilHost (owner host, .NET 10) and its config
  charger\broker\                     ChargeLink.Veristand.NativeClientBroker (.NET Framework 4.8)
  charger\veristand\                  the system definition and FMI 2.0 plant model
  charger\config\, charger\templates\     the kit's bench configuration and per-session templates (do not edit)
  charger\New-BenchConfiguration.ps1, Start-SeccSession.ps1, Send-OwnerCommand.ps1, BenchKit.psm1, tools\
  vehicle\chargelink.exe              the same bytes as charger\bin\chargelink.exe
  vehicle\Start-Evcc.ps1, vehicle\cases\, vehicle\tls\ (empty: your vehicle material goes here)

Provenance: manifest\SHA256SUMS lists the SHA-256 of every file, and the other files in manifest\ record the release identity; keep them with your installation record. Third-party notices and an SBOM ship in licenses\. The package's own docs\ describe the NI VeriStand bench procedure; this manual covers the same binary in more depth.

No installer. Installation is an extraction. Verify the archive and every file against the published SHA-256 checksums as shown below, and keep the package ZIP with its SHA-256 as your installation record.

Prerequisites

  • Windows 10 or Windows 11, 64-bit (reference PC: Windows 11 Pro build 26200). The Microsoft Visual C++ 2015-2022 Redistributable x64 on every ChargeLink PC; the .NET 10 runtime x64 on the NI VeriStand PC for the owner host. A real powerline (PLC) link to a vehicle or charger goes through the DEVlink PLC Relay Unit; see Connecting to Real PLC Hardware and contact DEVlink for availability.
  • A user account that can write to the chosen installation and data directories. Administrator rights are needed only for Windows Firewall rules.
  • IPv6 enabled on the network adapter that connects the ChargeLink PC to your DUT for ISO 15118 / DIN 70121 traffic. ChargeLink uses link-local IPv6 (fe80::/10); no IPv6 router is required.
  • A ChargeLink license file (.cllic) from your order. Every command that runs a session, including its dry-run, needs it; inspection and status commands work without it.
  • For the NI VeriStand bench: NI VeriStand 2024 Q4, licensed, and the .NET 10 runtime x64. See Set Up the VeriStand Bench.

Step 1 — verify and extract the package

Get-FileHash 'C:\Downloads\ChargeLink-<VERSION>-bench-kit-win64.zip' -Algorithm SHA256
Get-Content 'C:\Downloads\ChargeLink-<VERSION>-bench-kit-win64.zip.sha256'
Expand-Archive 'C:\Downloads\ChargeLink-<VERSION>-bench-kit-win64.zip' -DestinationPath 'C:\ChargeLink\<VERSION>' -Force
cd C:\ChargeLink\<VERSION>
Get-Content .\manifest\SHA256SUMS | ForEach-Object {
  $hash, $path = $_ -split '  ', 2
  if ((Get-FileHash -LiteralPath $path -Algorithm SHA256).Hash -ne $hash.ToUpperInvariant()) { throw "Changed: $path" }
}
'all files verified'

The archive hash must equal the .sha256 file and the delivery note; the loop checks every file against manifest\SHA256SUMS. Use a local folder without spaces; this manual uses C:\ChargeLink\<VERSION>, and every example sets $CL to charger\bin\chargelink.exe under it. That binary runs either role. A PC that runs only the vehicle role can take a copy of the vehicle folder instead (its chargelink.exe is byte-identical).

Step 2 — put the binary on PATH

Add the bin directory to the user PATH (no administrator rights needed) and open a new PowerShell window:

$BinDir = 'C:\ChargeLink\<VERSION>\charger\bin'
$userPath = [Environment]::GetEnvironmentVariable('Path', 'User')
if ($userPath -notlike "*$BinDir*") {
  [Environment]::SetEnvironmentVariable('Path', "$userPath;$BinDir", 'User')
}

The examples in this manual call chargelink from PATH. Where a full path is needed (firewall rules, file hashes) they use $CL. If you do not want to change PATH, write the full path in place of chargelink.

Step 3 — verify the binary

$CL = 'C:\ChargeLink\<VERSION>\charger\bin\chargelink.exe'
chargelink --version
chargelink --help

Expected: chargelink 0.5.0 and the list of 40 top-level commands. If the version differs from this manual, read the Release and Version Matrix before continuing.

Step 4 — create the data directories

Where ChargeLink stores state: package directory, data root, VeriStand bench runs Package (read-only) C:\ChargeLink\0.3.1 charger\bin\chargelink.exe charger\host\ charger\broker\ charger\veristand\ charger\config\ charger\templates\ charger\*.ps1 vehicle\ (copied to the vehicle PC) docs\ licenses\ manifest\SHA256SUMS Never write runtime data here. Replace the whole directory on upgrade. Data root (you choose) C:\ChargeLinkData runtime\ ← --runtime-root sessions\<run-id>\ active\ recovery\ integration\ artifacts\ ← --artifact-root <run-id>\manifest.json traces\ licenses\ ← from runtime root active_license.cllic activation_record.json pki\ tests\ support\ Back up as one unit. Restrict pki\ and licenses\; verify integrity after restore. VeriStand bench runs (charger PC) C:\ChargeLink\0.3.1\runs\ (runs_root) <stamp>-automation\ SESSION.json host.log campaign-configuration.json native.json host-output\ external_evcc_artifacts\ <stamp>-manual\ the same, plus owner-commands\ %ProgramData%\DEVlink\ChargeLink\ RuntimeOwnership\ tls\ One folder per session; keep it with the package hashes.
Package, data root and the VeriStand bench run folders live in separate places.

ChargeLink writes session state and evidence under two roots that you pass on every command. Do not keep runtime data under Program Files.

$Data = 'C:\ChargeLinkData'
foreach ($d in 'runtime','artifacts','licenses','pki','tests','support','veristand') {
  New-Item -ItemType Directory -Force "$Data\$d" | Out-Null
}
DirectoryUsed byContents
runtime--runtime-rootsessions\<run-id>\ state, PID, lock, heartbeat and lifecycle log; active\evse.lock.json / evcc.lock.json; recovery\; integration\ gRPC state.
artifacts--artifact-rootOne directory per run with manifest.json, command_result.json, traces, reports.
licensesderived from the runtime rootactive_license.cllic and activation_record.json after activation. ChargeLink always uses <parent of runtime root>\licenses.
pkiyouCertificates, keys, PFX files and trust anchors. Restrict the ACL (see Production Security).
tests, support, veristandyouCampaign outputs, support cases, VeriStand configuration copies.

Persist $CL and $Data in your PowerShell profile (notepad $PROFILE) so that every new window has them.

Step 5 — run the environment doctor

chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json doctor
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json doctor --strict

The doctor checks that the runtime root and artifact root are writable, reports the license state and checks the installation. A result of "status": "ok" with the license check skipped is normal before activation.

Step 6 — activate the license

Copy the license file you received into the data root, verify it without activating, then activate:

Copy-Item '<PATH_TO_YOUR_FILE>.cllic' "$Data\licenses\customer.cllic"
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json license verify --file "$Data\licenses\customer.cllic"
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json license activate --file "$Data\licenses\customer.cllic"
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json license status
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json license entitlements

Expected: verify reports "status": "verified"; activate copies the file to C:\ChargeLinkData\licenses\active_license.cllic and writes activation_record.json next to it; status reports verified and shows the active path; entitlements lists strings such as base.runtime, role.evse, protocol.iso15118-20 and the package.* entitlements you purchased.

To use a license for one command without activating it, pass the global option --license <FILE>.

Offline request

If you were given a customer ID but no license file, generate an offline request and send it to your ChargeLink contact:

chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json license request-offline `
  --customer-id '<CUSTOMER_ID>' `
  --entitlement base.runtime --entitlement role.evse --entitlement role.evcc `
  --output "$Data\licenses\offline-request.json"

The request contains a request ID, the requested entitlements and a fingerprint derived from the OS, architecture and computer name. It contains no personal data. When the issued .cllic file comes back, activate it as shown above.

Step 7 — Windows Firewall

Open only the ports your role needs, and only on the adapter that connects the ChargeLink PC to your DUT. For ISO 15118 / DIN 70121 the peers are link-local, so scope the rules to fe80::/10:

PortTransportDirectionPurpose
15118UDP / IPv6Inbound (charger role)SECC Discovery Protocol (SDP)
50118 (default) or 49152–65535TCP / IPv6Inbound (charger role)V2GTP session, plain or TLS. --tcp-port 0 auto-allocates from the dynamic range.
15118 to ff02::1, 49152–65535UDP, TCP / IPv6Outbound (vehicle role)SDP multicast request and V2GTP connection
50051TCP / IPv4 loopbackLocal onlygRPC Integration API. Keep it on 127.0.0.1.
$Alias = '<DUT_ADAPTER_NAME>'
New-NetFirewallRule -DisplayName 'ChargeLink EVSE SDP UDP 15118' -Direction Inbound -Action Allow `
  -InterfaceAlias $Alias -Protocol UDP -LocalPort 15118 -RemoteAddress 'fe80::/10' -Program $CL
New-NetFirewallRule -DisplayName 'ChargeLink EVSE TCP' -Direction Inbound -Action Allow `
  -InterfaceAlias $Alias -Protocol TCP -LocalPort 50118 -RemoteAddress 'fe80::/10' -Program $CL

Add the rules before the charger role runs for the first time. For the NI VeriStand bench, use the rules in Set Up the VeriStand Bench (names prefixed DEVlink ChargeLink); MCS adds TCP 50119 (MCS). Do not add rules for port 50051: the gRPC server listens on loopback only (a non-loopback --listen is refused) and has no TLS transport; every call needs its per-start access token.

Step 8 — record the installation

$Rec = "$Data\support\install-$(Get-Date -Format yyyyMMdd-HHmmss)"
New-Item -ItemType Directory -Force $Rec | Out-Null
chargelink --version              | Out-File -Encoding utf8 "$Rec\version.txt"
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json doctor              | Out-File -Encoding utf8 "$Rec\doctor.json"
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json license status      | Out-File -Encoding utf8 "$Rec\license-status.json"
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json license entitlements| Out-File -Encoding utf8 "$Rec\license-entitlements.json"
Get-FileHash $CL -Algorithm SHA256 | Out-File -Encoding utf8 "$Rec\binary-hash.txt"

Continue with First Session with Your Device Under Test.

Upgrade

  1. Stop all sessions: chargelink --json evse stop, chargelink --json evcc stop, close any integration serve window, then chargelink --json runtime list must show no live session.
  2. Back up C:\ChargeLinkData.
  3. Extract the new package to a new directory (for example C:\ChargeLink\<NEW_VERSION>) and repoint $CL and PATH. Keeping the old directory lets you roll back.
  4. Run --version, license status, doctor --strict and profile list.
  5. Repeat your golden reference runs before you reconnect your DUT or a physical bench.

The activated license survives an upgrade because it lives in the data root, not in the package directory. If license status reports not_activated after the upgrade, you are using a different runtime root; check $Data.

Uninstall

  1. Stop sessions as above.
  2. chargelink --json license deactivate if the license is node-locked and will move to another PC.
  3. Remove the package directory and the PATH entry.
  4. Archive or delete C:\ChargeLinkData according to your evidence retention policy.
  5. Remove the firewall rules you created.