ChargeLink Native

Install and Activate

What you receive

The package is delivered as ChargeLink-0.5.0-rc2-bench-kit-win64.zip (30 MB) with its .sha256 file. It sets up an ISO 15118-20 DC EIM bench with the charger on PC1 (NI VeriStand 2024, simulated power stage) and the vehicle on PC2, and it contains everything this manual documents: chargelink.exe is one binary with every command. It contains no certificate or key, no NI software, no .NET runtime, no source code and no private keys.

ChargeLink-0.5.0-rc2-bench-kit-win64\
  README.md, KIT_CONTENTS.md
  docs\        INSTALL-PC1.md, INSTALL-PC2.md, OPERATION.md, KNOWN_LIMITATIONS.md, SECURITY.md, SIGNING.md, CHANGELOG.md
  manifest\    SHA256SUMS, files.json, source.json, reproducible-build.json, gates.json, osv-report.md
  licenses\    NOTICE.txt, THIRD_PARTY_LICENSES.txt, chargelink-0.5.0-rc2.cdx.json (SBOM), libcbv2g and OpenSSL 3.5.9 notices, DOTNET_AND_NI.txt
  pc1\bin\chargelink.exe           the CLI: every command in this manual
  pc1\host\                       ChargeLink.Veristand.XilHost (owner host, .NET 10) and its config
  pc1\broker\                     ChargeLink.Veristand.NativeClientBroker (.NET Framework 4.8)
  pc1\veristand\                  the system definition and FMI 2.0 plant model
  pc1\config\, pc1\templates\     runtime profile, channel contract, signal mapping, per-session templates
  pc1\New-BenchConfiguration.ps1, Start-SeccSession.ps1, Send-OwnerCommand.ps1, BenchKit.psm1, tools\
  pc2\chargelink.exe              the same bytes as pc1\bin\chargelink.exe
  pc2\Start-Evcc.ps1, pc2\cases\, pc2\tls\ (empty: your vehicle material goes here)

Provenance: manifest\source.json names the source commit, manifest\reproducible-build.json records two byte-identical builds of chargelink.exe (SHA-256 74D121EA0938C50F2E0F093D6CF6EEE0BFC21E4D059CFDBEC726BBBBDB39162D, commit 2cf6edb8, Rust 1.97.1), and manifest\gates.json lists every packaging check with its result. The package's own docs\ describe the two-PC 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 PC1: Windows 11 Pro build 26200). The Microsoft Visual C++ 2015-2022 Redistributable x64 on every PC; the .NET 10 runtime x64 on PC1 for the owner host. (The binary also builds for Linux; this manual covers Windows.) A real powerline (PLC) link to a vehicle or charger also needs the DEVlink PLC Relay Unit, which is in development; see Connecting to Real PLC Hardware.
  • 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 used for ISO 15118 / DIN 70121 traffic. ChargeLink uses link-local IPv6 (fe80::/10); no IPv6 router is required.
  • A ChargeLink Native license file (.cllic) from your commercial order. Without it, dry-runs, profiles, loopback and the gRPC server work; licensed conformance packages and commercial features are blocked.
  • For the NI VeriStand bench on PC1: 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-0.5.0-rc2-bench-kit-win64.zip' -Algorithm SHA256
Get-Content 'C:\Downloads\ChargeLink-0.5.0-rc2-bench-kit-win64.zip.sha256'
Expand-Archive 'C:\Downloads\ChargeLink-0.5.0-rc2-bench-kit-win64.zip' -DestinationPath 'C:\ChargeLink\0.5.0-rc2' -Force
cd C:\ChargeLink\0.5.0-rc2
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\0.5.0-rc2, and every example sets $CL to pc1\bin\chargelink.exe under it. PC2 receives a copy of the pc2 folder (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\0.5.0-rc2\pc1\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\0.5.0-rc2\pc1\bin\chargelink.exe'
chargelink --version
chargelink --help

Expected: chargelink 0.5.0-rc2 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 pc1\bin\chargelink.exe pc1\host\ pc1\broker\ pc1\veristand\ pc1\config\ pc1\templates\ pc1\*.ps1 pc2\ (copied to PC2) 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 (PC1) 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 confirms the native product boundary. 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 topology needs, and only on the bench adapter. For ISO 15118 / DIN 70121 the peers are link-local, so scope the rules to fe80::/10:

PortTransportDirectionPurpose
15118UDP / IPv6Inbound (EVSE role)SECC Discovery Protocol (SDP)
50118 (default) or 49152–65535TCP / IPv6Inbound (EVSE role)V2GTP session, plain or TLS. --tcp-port 0 auto-allocates from the dynamic range.
15118 to ff02::1, 49152–65535UDP, TCP / IPv6Outbound (EVCC role)SDP multicast request and V2GTP connection
50051TCP / IPv4 loopbackLocal onlygRPC Integration API. Keep it on 127.0.0.1.
$Alias = '<BENCH_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

For the NI VeriStand bench, use the rules in Set Up the VeriStand Bench (names prefixed DEVlink ChargeLink). 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 Successful Session.

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\0.3.2) 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 reconnecting 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.