ZwiftPacketMonitor
This project implements a TCP and UDP packet monitor for the Zwift cycling simulator. It listens for packets on a specific port of a local network adapter, and when found, deserializes the payload and dispatches events that can be consumed by the caller.
NOTE: Because this utilizes a network packet capture to intercept the UDP packets, your system may require this code to run using elevated privileges.
Prerequisites
- Packet capture relies on SharpPcap and requires the installation of libpcap (Linux), Npcap (Windows) or similar packet capture library.
Usage
See the included ZwiftPacketMonitor.Demo project for a complete working example.
var serviceCollection = new ServiceCollection();
serviceCollection.AddZwiftPacketMonitoring();
var serviceProvider = serviceCollection.BuildServiceProvider();
var logger = serviceProvider.GetService<ILogger<Program>>();
var monitor = serviceProvider.GetService<Monitor>();
monitor.IncomingPlayerEvent += (s, e) => {
logger.LogInformation($"INCOMING: {e.PlayerState}");
};
monitor.OutgoingPlayerEvent += (s, e) => {
logger.LogInformation($"OUTGOING: {e.PlayerState}");
};
monitor.IncomingChatMessageEvent += (s, e) => {
logger.LogInformation($"CHAT: {e.Message}");
};
monitor.IncomingPlayerEnteredWorldEvent += (s, e) => {
logger.LogInformation($"WORLD: {e.PlayerUpdate}");
};
monitor.IncomingRideOnGivenEvent += (s, e) => {
logger.LogInformation($"RIDEON: {e.RideOn}");
};
// network interface name or IP address
monitor.StartCaptureAsync("en0").Wait();
// This won't get called until the above Wait finishes
monitor.StopCaptureAsync().Wait();
Replay Zwift messages
Debugging is hard but it's even harder when having to do a Zwift work out at the same time!
To make life easier you can replay Zwift messages from a PCAP capture file instead of a network device so that you can debug and analyse without having to run Zwift at the same time.
Capture packets using SharpCap or Wireshark and save the results to a file, then run ZwiftPacketMonitor.Replay.exe <path to capture file>
and see the messages flow by.
Credit
This project is a .NET port of the zwift-packet-monitor project and borrows heavily from its packet handling and protobuf implementation.