예제 #1
0
        public Task <bool> Start()
        {
            _logger.LogDebug($"Starting http listener on port {_port}");
            _cts = new CancellationTokenSource();
#pragma warning disable 4014
            Task.Run(async() =>
            {
                try
                {
                    _listener = TcpListener.Create(_port);
                    _listener.Server.DualMode = true;
                    _listener.Start();

                    while (true)
                    {
                        _logger.LogDebug("Waiting for new tcp connection");
                        var tcpClient = await _listener.AcceptTcpClientAsync();

                        _logger.LogDebug($"New tcp connection from {((IPEndPoint)tcpClient.Client.RemoteEndPoint).Address}");

                        ThreadPool.QueueUserWorkItem(async state =>
                        {
                            var connection = new HttpServerConnection(_middleware, _logger, (TcpClient)state, this);
                            _connections.Add(connection);
                            await connection.HandleClient().ConfigureAwait(false);
                        }, tcpClient);
                    }
                }
                catch (TaskCanceledException)
                {
                    _listener.Stop();
                }
                catch (Exception e)
                {
                    _listener.Stop();
                    _logger.LogError(e, "Could not accept client");
                }
            }, _cts.Token).ConfigureAwait(false);
#pragma warning restore 4014

            return(Task.FromResult(true));
        }
예제 #2
0
        public bool SendNotification(Characteristic characteristic, HapSession session)
        {
            var baseChar = new CharacteristicBase(characteristic.DefaultType)
            {
                Id          = characteristic.Id,
                Value       = characteristic.Value,
                AccessoryId = characteristic.Service.Accessory.Id
            };

            var charReturn = new CharacteristicsList <CharacteristicBase>
            {
                Characteristics = new List <CharacteristicBase> {
                    baseChar
                }
            };

            var data     = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(charReturn, HapMiddleware.JsonSettings));
            var response =
                HttpServerConnection.GetHttpResponse("EVENT/1.0", "application/hap+json", data, DateTime.Now);

            _logger.LogTrace($"Writing {Encoding.UTF8.GetString(response)}");

            lock (session)
            {
                try
                {
                    var encrypted = HttpServerConnection.EncryptData(response, session);
                    session.Client.Client.Send(encrypted);
                    return(true);
                }
                catch (Exception e)
                {
                    _logger.LogError(e, "Could not set value");
                }
            }

            return(false);
        }
예제 #3
0
 internal void ConnectionClosed(HttpServerConnection connection)
 {
     _logger.LogDebug($"Closed connection from {connection.GetRemoteEndpoint()}");
     _connections.Remove(connection);
 }