Search code examples
c#win-universal-appwindows-10-iot-core

Windows Universal (IoT) Websocket server to broadcasting


I need something like library Websocket Sharp to Windows Universal. Im trying to build server on Windows 10 IoT to broadcast some data (temperature, and other events) and i want to build something like a streamer to broadcast live data from Arduino. In samples i can find only instructions to make a websocket client. Any ideas?


Solution

  • The Universal Windows Platform (UWP) provides support for both client and server use of WebSockets. You may find a library named IoTWeb which allows you to embed a simple HTTP and WebSocket server into your UWP app. This library provides a simple HTTP server with WebSocket support.

    class WebSocketHandler : IWebSocketRequestHandler
    {
        private Dictionary<string,WebSocket> _webSockets = new Dictionary<string, WebSocket>();
        public event MessageRecivedHandler MessageRecived;
        private IdHelper _portMappings;
    
        public WebSocketHandler(IdHelper portMappings)
        {
            _portMappings = portMappings;
        }
    
    
    
        public void Connected(WebSocket socket)
        {
            var guid = Guid.NewGuid().ToString();
            _webSockets.Add(guid, socket);
    
    
            socket.DataReceived += (webSocket, frame) => MessageRecived?.Invoke(_webSockets.First(x => x.Value == webSocket).Key,webSocket, frame);
            socket.ConnectionClosed += (webSocket) =>
            {
                var connection = _webSockets.First(s => s.Value == webSocket);
                _webSockets.Remove(connection.Key);
            };
    
            if (_portMappings.IsBindingPosible())
            {
                _portMappings.Bind(guid);
    
                var message = new ServerMessage()
                {
                    ClientID = guid,
                    Command = "Init",
                    Value = _portMappings.CheckBinding(guid).ToString()
                };
                SendMessage(guid, message);
            }
            else
            {
                var message = new ServerMessage()
                {
                    ClientID = guid,
                    Command = "Init",
                    Value = "Max Number Of Clients Reached. Please close connection"
                };
                SendMessage(guid, message);
            }
    
    
        }
    
        public bool WillAcceptRequest(string uri, string protocol)
        {
            return true;
        }
    
        public async Task BroadcastMessage(string message)
        {
            await ThreadPool.RunAsync((workItem) => _webSockets?.AsParallel().ForAll(webSocket => webSocket.Value.Send(message)));
        }
    
        public async Task SendMessage(string guid, ServerMessage message)
        {
            await ThreadPool.RunAsync((workItem) => _webSockets?.First(x => x.Key == guid).Value.Send(JsonConvert.SerializeObject(message)));
        }
        public delegate void MessageRecivedHandler(string guid, WebSocket socket, string message);
    }