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
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
}
| Directory | Used by | Contents |
|---|---|---|
runtime | --runtime-root | sessions\<run-id>\ state, PID, lock, heartbeat and lifecycle log; active\evse.lock.json / evcc.lock.json; recovery\; integration\ gRPC state. |
artifacts | --artifact-root | One directory per run with manifest.json, command_result.json, traces, reports. |
licenses | derived from the runtime root | active_license.cllic and activation_record.json after activation. ChargeLink always uses <parent of runtime root>\licenses. |
pki | you | Certificates, keys, PFX files and trust anchors. Restrict the ACL (see Production Security). |
tests, support, veristand | you | Campaign 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:
| Port | Transport | Direction | Purpose |
|---|---|---|---|
| 15118 | UDP / IPv6 | Inbound (EVSE role) | SECC Discovery Protocol (SDP) |
| 50118 (default) or 49152–65535 | TCP / IPv6 | Inbound (EVSE role) | V2GTP session, plain or TLS. --tcp-port 0 auto-allocates from the dynamic range. |
15118 to ff02::1, 49152–65535 | UDP, TCP / IPv6 | Outbound (EVCC role) | SDP multicast request and V2GTP connection |
| 50051 | TCP / IPv4 loopback | Local only | gRPC 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
- Stop all sessions:
chargelink --json evse stop,chargelink --json evcc stop, close anyintegration servewindow, thenchargelink --json runtime listmust show no live session. - Back up
C:\ChargeLinkData. - Extract the new package to a new directory (for example
C:\ChargeLink\0.3.2) and repoint$CLand PATH. Keeping the old directory lets you roll back. - Run
--version,license status,doctor --strictandprofile list. - 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
- Stop sessions as above.
chargelink --json license deactivateif the license is node-locked and will move to another PC.- Remove the package directory and the PATH entry.
- Archive or delete
C:\ChargeLinkDataaccording to your evidence retention policy. - Remove the firewall rules you created.

