Пример #1
0
        public Client()
        {
            InitLogging();
            WaitUntilServerStarts();
            var factory = new Func <ClientWebSocket>(() =>
            {
                var client = new ClientWebSocket
                {
                    Options =
                    {
                        KeepAliveInterval = TimeSpan.FromSeconds(5000),
                        // Proxy = ...
                        // ClientCertificates = ...
                    }
                };
                //client.Options.SetRequestHeader("Origin", "xxx");
                return(client);
            });

            webSocketClient = new WebsocketClient(serverUrl, factory)
            {
                Name = "First Client"
            };
            webSocketClient.DisconnectionHappened.Subscribe(info =>
                                                            Log.Warning($"Disconnection happened, type: {info.Type}"));

            Log.Information("Starting...");
            webSocketClient.Start().Wait();
            Log.Information("Started.");
            //var res = SendAsync("ping").Result;

            //Log.Information($"Message received: {res}");

            //ExitEvent.WaitOne();
        }
        public async Task ConnectAsync()
        {
            _client = new WebsocketClient(GetEndpoint(), wsFactory)
            {
                ReconnectTimeout      = TimeSpan.FromSeconds(35),
                ErrorReconnectTimeout = TimeSpan.FromSeconds(30)
            };

            _client.DisconnectionHappened.Subscribe(info =>
            {
                _logger.LogWarning(75421, $"Stream disconnected: {info.Type}: {info.Exception}");

                if (_onDisconnected != null)
                {
                    Task.Run(() => _onDisconnected(info));
                }
            });

            _client.ReconnectionHappened.Subscribe(info =>
            {
                if (info.Type == ReconnectionType.Initial)
                {
                    _logger.LogInformation("Starting initial census stream connect");
                }
                else
                {
                    _logger.LogInformation($"Stream reconnection occured: {info.Type}");
                }

                if (_onConnect != null)
                {
                    Task.Run(() => _onConnect(info.Type));
                }
            });

            _client.MessageReceived.Subscribe(msg =>
            {
                if (_onMessage != null)
                {
                    Task.Run(() => _onMessage(msg.Text));
                }
            });

            await _client.Start();
        }
        public async Task ConnectAsync(CensusStreamSubscription subscription)
        {
            _client = new WebsocketClient(GetEndpoint(), wsFactory)
            {
                ReconnectTimeout      = TimeSpan.FromSeconds(35),
                ErrorReconnectTimeout = TimeSpan.FromSeconds(30)
            };

            _client.DisconnectionHappened.Subscribe(info =>
            {
                _logger.LogWarning(75421, $"Stream disconnected: {info.Type}: {info.Exception}");

                if (_onDisconnected != null)
                {
                    Task.Run(() => _onDisconnected(info));
                }
            });

            _client.ReconnectionHappened.Subscribe(info =>
            {
                _logger.LogInformation($"Stream reconnection occured: {info.Type}");

                if (subscription.EventNames.Any())
                {
                    var sMessage = JsonConvert.SerializeObject(subscription, sendMessageSettings);

                    _client.Send(sMessage);

                    _logger.LogInformation($"Subscribed to census with: {sMessage}");
                }
            });

            _client.MessageReceived.Subscribe(msg =>
            {
                if (_onMessage != null)
                {
                    Task.Run(() => _onMessage(msg.Text));
                }
            });

            await _client.Start();
        }
Пример #4
0
        public async Task <bool> Connect()
        {
            try
            {
                Client = new WebsocketClient(new Uri(Settings.Instance.PubSettings.Uri), WebSocketFactory)
                {
                    Name                  = "PubSub",
                    ReconnectTimeout      = TimeSpan.FromSeconds(5),
                    ErrorReconnectTimeout = TimeSpan.FromSeconds(5)
                };

                PubSubPingTimer = new Timer(new TimerCallback(SendingPing), Client, 0, 5000);
                await Client.Start();

                Subscribe();
                return(true);
            }
            catch
            {
                return(false);
            }
        }
Пример #5
0
        public async Task <IWebsocketClient> InitAsync()
        {
            if (_logger.IsInfo)
            {
                _logger.Info($"Starting ETH stats...");
            }
            var url = new Uri(_webSocketsUrl);

            _client = new WebsocketClient(url)
            {
                ErrorReconnectTimeoutMs = _reconnectionInterval,
                ReconnectTimeoutMs      = int.MaxValue
            };
            _client.MessageReceived.Subscribe(async message =>
            {
                if (_logger.IsDebug)
                {
                    _logger.Debug($"Received ETH stats message '{message}'");
                }
                if (string.IsNullOrWhiteSpace(message.Text))
                {
                    return;
                }

                if (message.Text.Contains(ServerPingMessage))
                {
                    await HandlePingAsync(message.Text);
                }
            });
            await _client.Start();

            if (_logger.IsDebug)
            {
                _logger.Debug($"Started ETH stats.");
            }

            return(_client);
        }
Пример #6
0
        /// <inheritdoc/>
        public async Task StartAsync(CancellationToken cancellationToken)
        {
            _client = await _clientFactory.CreateClientAsync();

            _client.Name                  = "deCONZ";
            _client.ReconnectTimeout      = TimeSpan.FromMinutes(5);
            _client.ErrorReconnectTimeout = TimeSpan.FromSeconds(30);

            _client.ReconnectionHappened.Subscribe(info =>
            {
                if (info.Type == ReconnectionType.Initial)
                {
                    _logger.LogInformation($"Connecting to websocket: {_client.Url}");
                }
                else
                {
                    _logger.LogInformation($"Reconnecting to websocket: {_client.Url} - cause: {info.Type}");
                }
            });

            _client.DisconnectionHappened.Subscribe(info =>
            {
                _logger.LogWarning($"Websocket got disconnected - cause: {info.Type}");
            });

            _client.MessageReceived.Subscribe(async msg =>
            {
                _logger.LogInformation($"Message received: {msg}");
                var message = JsonConvert.DeserializeObject <Message>(msg.Text);

                // emit event so mqtt service will pick it up.
                await _mediator.Publish(new DeConzMessageEvent(message), cancellationToken);
            });

            _logger.LogInformation("Starting websocket client...");
            await _client.Start();
        }
Пример #7
0
        public async Task <IWebsocketClient> InitAsync()
        {
            if (_logger.IsInfo)
            {
                _logger.Info($"Starting ETH stats [{_webSocketsUrl}]...");
            }
            if (!_webSocketsUrl.StartsWith("wss"))
            {
                try
                {
                    using HttpClient httpClient = new HttpClient();
                    string host = _webSocketsUrl.Split("://").Last();
                    HttpResponseMessage response = await httpClient.GetAsync($"http://{host}");

                    Uri requestedUrl = response.RequestMessage.RequestUri;
                    if (requestedUrl.Scheme.Equals("https"))
                    {
                        _webSocketsUrl = $"wss://{host}";
                        if (_logger.IsInfo)
                        {
                            _logger.Info($"Moved ETH stats to: {_webSocketsUrl}");
                        }
                    }
                }
                catch
                {
                    // ignored
                }
            }

            Uri url = new Uri(_webSocketsUrl);

            _client = new WebsocketClient(url)
            {
                ErrorReconnectTimeout = TimeSpan.FromMilliseconds(_reconnectionInterval),
                ReconnectTimeout      = null
            };
            _client.MessageReceived.Subscribe(async message =>
            {
                if (_logger.IsDebug)
                {
                    _logger.Debug($"Received ETH stats message '{message}'");
                }
                if (string.IsNullOrWhiteSpace(message.Text))
                {
                    return;
                }

                if (message.Text.Contains(ServerPingMessage))
                {
                    await HandlePingAsync(message.Text);
                }
            });
            await _client.Start();

            if (_logger.IsDebug)
            {
                _logger.Debug($"Started ETH stats.");
            }

            return(_client);
        }
Пример #8
0
        public async Task RunWebSocketAsync()
        {
            client.ReconnectTimeout      = null;
            client.ErrorReconnectTimeout = TimeSpan.FromSeconds(60);

            client.MessageReceived.Subscribe(json =>
            {
                //Convert JSon to object
                var obj = JsonConvert.DeserializeObject <RXRootObject>(json.ToString());

                //Parse  data into object
                var payloadBytes = StringToByteArray(obj.data);
                var sensorData   = new SensorData();

                if (obj.cmd == "rx")
                {
                    var RoomEUI       = _context.RoomEUI.FirstOrDefault(o => o.EUI == obj.EUI);
                    sensorData.RoomID = -1;
                    if (RoomEUI != null)
                    {
                        sensorData.RoomID = RoomEUI.RoomID;
                    }

                    /*
                     * hum 2 bytes
                     * temp 2 bytes
                     * co2 2 bytes
                     * IsOccupied 1 bytes
                     */

                    sensorData.Humidity    = BitConverter.ToUInt16(new[] { payloadBytes[0], payloadBytes[1] }, 0);
                    sensorData.Temperature = BitConverter.ToUInt16(new[] { payloadBytes[2], payloadBytes[3] }, 0);
                    sensorData.CO2         = BitConverter.ToUInt16(new[] { payloadBytes[4], payloadBytes[5] }, 0);
                    sensorData.IsOccupied  = BitConverter.ToUInt16(new[] { (byte)0, payloadBytes[6] }, 0) == 1 ? true : false;
                    sensorData.AudioLevel  = 0;
                    sensorData.Timestamp   = DateTime.Now

                                             _context.SensorData.Add(sensorData);
                    _context.SaveChangesAsync();

                    //Get triggers for the room
                    var triggers = _context.Trigger.Where(t => t.RoomID == sensorData.RoomID);
                    foreach (var trigger in triggers)
                    {
                        switch (trigger.Sensor)
                        {
                        case SensorType.Humidity:
                            if ((trigger.GreaterThan && sensorData.Humidity < trigger.Value) || (!trigger.GreaterThan && sensorData.Humidity > trigger.Value))
                            {
                                SendResponce(trigger.RoomID, obj.EUI, trigger.Command, obj.port);
                            }
                            break;

                        case SensorType.CO2:
                            if ((trigger.GreaterThan && sensorData.CO2 < trigger.Value) || (!trigger.GreaterThan && sensorData.CO2 > trigger.Value))
                            {
                                SendResponce(trigger.RoomID, obj.EUI, trigger.Command, obj.port);
                            }
                            break;

                        case SensorType.Temperature:
                            if ((trigger.GreaterThan && sensorData.Temperature < trigger.Value) || (!trigger.GreaterThan && sensorData.Temperature > trigger.Value))
                            {
                                SendResponce(trigger.RoomID, obj.EUI, trigger.Command, obj.port);
                            }
                            break;

                        case SensorType.Audio:
                            if ((trigger.GreaterThan && sensorData.AudioLevel < trigger.Value) || (!trigger.GreaterThan && sensorData.AudioLevel > trigger.Value))
                            {
                                SendResponce(trigger.RoomID, obj.EUI, trigger.Command, obj.port);
                            }
                            break;

                        case SensorType.IsOccupied:
                            if ((trigger.GreaterThan && sensorData.IsOccupied) || (!trigger.GreaterThan && !sensorData.IsOccupied))
                            {
                                SendResponce(trigger.RoomID, obj.EUI, trigger.Command, obj.port);
                            }
                            break;

                        default:
                            break;
                        }
                    }
                }
            });

            client.Start().Wait();

            Task.Run(() => StartSendingPing(client));
        }