RemoteViewer.DeviceKit.Files 0.9.9

dotnet add package RemoteViewer.DeviceKit.Files --version 0.9.9
                    
NuGet\Install-Package RemoteViewer.DeviceKit.Files -Version 0.9.9
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="RemoteViewer.DeviceKit.Files" Version="0.9.9" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="RemoteViewer.DeviceKit.Files" Version="0.9.9" />
                    
Directory.Packages.props
<PackageReference Include="RemoteViewer.DeviceKit.Files" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add RemoteViewer.DeviceKit.Files --version 0.9.9
                    
#r "nuget: RemoteViewer.DeviceKit.Files, 0.9.9"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package RemoteViewer.DeviceKit.Files@0.9.9
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=RemoteViewer.DeviceKit.Files&version=0.9.9
                    
Install as a Cake Addin
#tool nuget:?package=RemoteViewer.DeviceKit.Files&version=0.9.9
                    
Install as a Cake Tool

DeviceKit

"ConnectKit gives you the pipe. DeviceKit gives you the protocol."

DeviceKit is the application-protocol layer that rides ConnectKit's end-to-end-encrypted pipe. ConnectKit guarantees an authenticated, NAT-traversing byte channel and deliberately leaves what rides it to you. DeviceKit fills that in — once, OS-independently — for the domains that aren't remote-desktop: IoT, RMM, robotics, and industrial.

// You already have a ConnectKit channel (the pipe):
await using var ck = new ConnectKitClient(new ConnectKitOptions { Secret = "s3cr3t", /* … */ });
await using var channel = await ck.ConnectAsync("device-1");

// DeviceKit layers structure on top:
await using var peer = channel.ToDevicePeer();               // via DeviceKit.ConnectKit adapter

var info = await peer.CallAsync<InfoReq, InfoResp>("sys.info", new InfoReq());   // RPC
peer.Subscribe<Reading>("telemetry/temp", r => Log(r));                          // pub/sub
peer.Publish("telemetry/temp", new Reading(21.4, DateTimeOffset.Now));

The core references nothing but the BCL — no P/Invoke, no platform APIs, no native dependencies — so it runs anywhere .NET does. The ConnectKit binding lives in a separate adapter package, and the core is unit-tested with an in-memory channel (no server, no socket, no OS).

Install

dotnet add package RemoteViewer.DeviceKit             # the core (RPC / streaming / pub-sub / presence / sub-channels)
dotnet add package RemoteViewer.DeviceKit.ConnectKit  # ride a ConnectKit end-to-end-encrypted pipe

Add only the profiles/bridges you need: RemoteViewer.DeviceKit. Iot · Rmm · Robotics · Industrial · Files · Codec.Cbor · Bridge.Mqtt · Bridge.OpcUa · Bridge.Dds.

Targets net8.0 and net9.0. v0.9.9 — release candidate for 1.0. DeviceKit is commercial software (see LICENSE.txt); the client libraries are free, and installation requires accepting the license. New here? Follow the 5-minute quickstart in GETTING-STARTED.md.

What you get

Capability API Standard it echoes
RPC (request/response) CallAsync / OnCall CoAP request/response
Streaming (feedback + result, cancelable) InvokeStreamingAsync / OnStreaming
Pub/Sub (topics, telemetry, MQTT-style +/# wildcards) Publish / Subscribe MQTT / CoAP Observe
Presence (heartbeat, online/stale/offline) EnableHeartbeat / PresenceChanged MQTT LWT / Sparkplug
Capability negotiation Announce / Remote

Open extension model

New domains plug in through IPeerExtension (+ IMessageInterceptor, ICodec) with zero core changes — and the built-ins use the very same seams. Four profiles ship as optional packages, all built purely on the public API:

  • DeviceKit.Iot: typed telemetry streams and a device twin (desired state from the app, reported state from the device) — Azure/AWS-shadow-flavored, brokerless.
  • DeviceKit.Rmm: device inventory (RPC), live metrics (pub/sub), and remote command execution with streamed output and an exit result (streaming RPC).
  • DeviceKit.Robotics (ROS 2 / DDS-flavored): Actions (goal → feedback stream → result, cancelable), Services, typed Topics with QoS hints.
  • DeviceKit.Industrial (OPC-UA / Sparkplug-flavored): a tag address space (read/write/subscribe/browse), methods, and alarms.
peer.Use(new IotExtension());
peer.Use(new RmmExtension());
peer.Use(new RoboticsExtension());
peer.Use(new IndustrialExtension());
peer.Use(new MyOwnDomainExtension());   // third parties, same way

The default codec is JSON (great DX). For constrained/low-bandwidth links, drop in the optional DeviceKit.Codec.Cbor (CBOR / RFC 8949, the CoAP/LwM2M payload format) — one line, on both peers, wire header unchanged:

var peer = new DevicePeer(channel, new DevicePeerOptions { Codec = new CborCodec() });

Interop with existing MQTT infrastructure

Bridge DeviceKit's pub/sub to an external MQTT broker with the optional DeviceKit.Bridge.Mqtt — relay matching topics both ways, so a DeviceKit peer coexists with brownfield MQTT assets:

var link = new MqttNetLink(new MqttConnection { Host = "broker.local" });
var opts = new MqttBridgeOptions().ForwardDevicePrefix("sensor/").SubscribeMqtt("cmd/#");
await using var bridge = await MqttBridge.StartAsync(peer, link, opts);

Layout

src/DeviceKit/               core SDK (BCL only) — messaging/wire, DevicePeer, RPC, PubSub, Presence, extension seams
src/DeviceKit.ConnectKit/    the only project that references ConnectKit — IConnectChannel → IMessageChannel adapter
src/DeviceKit.Iot/           IoT profile (telemetry + device twin)
src/DeviceKit.Rmm/           RMM profile (inventory + metrics + remote exec)
src/DeviceKit.Robotics/      robotics profile (actions/services/topics)
src/DeviceKit.Industrial/    industrial profile (tag space/methods/alarms)
src/DeviceKit.Codec.Cbor/    optional CBOR codec for low-bandwidth links
src/DeviceKit.Bridge.Mqtt/   optional MQTT bridge — relay topics to/from an external broker (brownfield interop)
src/DeviceKit.Bridge.OpcUa/  optional OPC-UA bridge — back the industrial address space with a real OPC-UA server
src/DeviceKit.Bridge.Dds/    optional DDS bridge — relay topics to/from a DDS domain (ROS 2 interop); BYO vendor via IDdsLink
samples/DeviceKit.Sample/            self-contained in-memory loopback demo (four domains in one process)
samples/DeviceKit.Sample.ConnectKit/ end-to-end over a real ConnectKit E2E socket (direct TCP loopback)
samples/DeviceKit.Sample.EdgeReach/  one connection carrying control + config-push + firmware + a session sub-channel
tests/DeviceKit.Tests/       NUnit (54) — envelope codec, RPC, streaming, pub/sub, presence, sub-channels, all profiles, files, config, bridges, CBOR
docs/DESIGN.md               the design document

Build & run

dotnet build DeviceKit.slnx -c Release
dotnet test  DeviceKit.slnx -c Release
dotnet run --project samples/DeviceKit.Sample -c Release

Requires the .NET 8 or 9 SDK. The core multi-targets net8.0;net9.0. Pricing follows the family model: the DeviceKit client is free, like ConnectKit — connection and its protocol layer are never the paywall.

Docs

  • GETTING-STARTED.md — 5-minute quickstart (app ↔ device over ConnectKit).
  • docs/USAGE.md — cookbook: every capability and profile with copy-paste examples.
  • docs/DESIGN.md — architecture, wire protocol, open extension model, roadmap.
  • docs/STANDARDS.md — how much of MQTT/CoAP/OPC-UA/DDS/Sparkplug is reflected, and the gaps.
  • docs/MARKET.md — objective demand & competitive assessment.
  • docs/API.md — the public surface (0.9.9, the 1.0 release candidate), per package.
  • docs/WIRE-PROTOCOL.md — language-neutral wire spec for non-.NET bindings.
  • docs/BRIDGES.md — MQTT/OPC-UA/DDS bridge integration, vendor adapters, validation.

Part of the RemoteViewer Kit family: ConnectKit (pipe) · SessionKit (remote-desktop) · ServerKit (server) · DeviceKit (IoT/RMM/robotics/industrial).

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.9.9 104 9/6/2026