Skip to content

OpenXbox/xbox-smartglass-csharp

master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
 
 
 
 
 
 
 
 
 
 

Xbox One SmartGlass client library for .NET

GitHub Workflow - Build NuGet Discord

Build from source

cd xbox-smartglass-sharp
dotnet build

Command line tool

Print usage

dotnet run -p SmartGlass.Cli -- --help

API usage

Discover consoles

using SmartGlass;

IEnumerable<SmartGlass.Device> devices = await SmartGlass.Device.DiscoverAsync();

foreach (SmartGlass.Device device in devices)
{
    Console.WriteLine($"{device.Name} ({device.HardwareId}) {device.Address}");
}

Power on console

using SmartGlass;

string liveId = "FD0123456789";
SmartGlass.Device device = await SmartGlass.Device.PowerOnAsync(liveId);
Console.WriteLine($"{device.Name} ({device.HardwareId}) {device.Address}");

Connect to console

using SmartGlass;

SmartGlassClient client = null;

try
{
    client = await SmartGlassClient.ConnectAsync("192.168.0.234");
}
catch (SmartGlassException e)
{
    Console.WriteLine($"Failed to connect: {e.Message}");
}
catch (TimeoutException)
{
    Console.WriteLine($"Timeout while connecting");
}

Start Nano (gamestreaming)

using SmartGlass;
using SmartGlass.Channels;
using SmartGlass.Channels.Broadcast;
using SmartGlass.Common;
using SmartGlass.Nano;
using SmartGlass.Nano.Packets;

SmartGlassClient client = /* Connect to console */;

// Get general gamestream configuration
GamestreamConfiguration config = GamestreamConfiguration.GetStandardConfig();
/* Modify standard config, if desired */

GamestreamSession session = await client.BroadcastChannel.StartGamestreamAsync(config);

Console.WriteLine(
    $"Connecting to NANO // TCP: {session.TcpPort}, UDP: {session.UdpPort}");

NanoClient nano = new NanoClient(hostName, session);

// General Handshaking & Opening channels
await nano.InitializeProtocolAsync();

// Audio & Video client handshaking
// Sets desired AV formats
AudioFormat audioFormat = nano.AudioFormats[0];
VideoFormat videoFormat = nano.VideoFormats[0];
await nano.InitializeStreamAsync(audioFormat, videoFormat);

// Start ChatAudio channel
AudioFormat chatAudioFormat = new AudioFormat(1, 24000, AudioCodec.Opus);
await nano.OpenChatAudioChannelAsync(chatAudioFormat);

IConsumer consumer = /* initialize consumer */;
nano.AddConsumer(consumer);

// Start consumer, if necessary
consumer.Start();

// Tell console to start sending AV frames
await nano.StartStreamAsync();

// Start Controller input channel
await nano.OpenInputChannelAsync(1280, 720);

/* Run a mainloop, to gather controller input events or similar */

Troubleshooting

The wrong network interface gets choosen for SmartGlass communication

Solution: Before doing any network I/O with the library, set the BindAddress to the local IP address of the desired interface.

using System.Net;
using SmartGlass;

// Adjust 192.168.0.1 to your actual local IP address
GlobalConfiguration.BindAddress = IPAddress.Parse("192.168.0.1");

// Do stuff

Project originally developed by Joel Day

Special thanks to Team OpenXbox for their contribution of documentation, tools and samples for the SmartGlass protocol.