static void Main(string[] args) { var port = 1055; if (args.Length > 0) port = int.Parse(args[0]); var server = new ReactiveListener(port); server.Connections.Subscribe(socket => { Console.WriteLine("New socket connected {0}", socket.GetHashCode()); var protocol = new StringChannel(socket); // Here we hook the "echo" prototocol protocol.Receiver.Subscribe( s => { Console.Write(s); protocol.SendAsync(s).Wait(); }, e => Console.WriteLine(e), () => Console.WriteLine("Socket receiver completed")); socket.Disconnected += (sender, e) => Console.WriteLine("Socket disconnected {0}", sender.GetHashCode()); socket.Disposed += (sender, e) => Console.WriteLine("Socket disposed {0}", sender.GetHashCode()); }); server.Start(); Console.WriteLine("Press Enter to exit"); Console.ReadLine(); }
private static void SetupSubscriptions(ReactiveListener server) { server.Connections.Subscribe(socket => { var messages = Observable.Create<SMDRRecord>(observer => { var bom = Encoding.ASCII.GetChars(Encoding.ASCII.GetPreamble()).FirstOrDefault(); var sb = new StringBuilder(); var prev = default(char); return socket.Receiver.Subscribe(b => { var c = Convert.ToChar(b); if (c == bom) { } // skip bom else if (prev == '\r' && c == '\n') { } // when \r\n do nothing else if (c == '\r' || c == '\n') // reach at EndOfLine { var str = sb.ToString(); sb.Clear(); observer.OnNext(new SMDRRecord(str)); } else sb.Append(c); // normally char prev = c; }, observer.OnError, () => { var str = sb.ToString(); if (!String.IsNullOrEmpty(str)) observer.OnNext(new SMDRRecord(str)); observer.OnCompleted(); }); }); messages.Subscribe(message => { Console.WriteLine("Message:"); Console.WriteLine("{0}", new SMDRRecordFormatter(message)); }); }); }
/// <summary> /// Opens and initializes devices and services listening and running on the local machine. /// </summary> /// <returns>True on success, false otherwise.</returns> public override bool Open() { var opened = false; Log.Debug("Initializing root hub"); _limitInstance = new LimitInstance(@"Global\ScpDsxRootHub"); try { if (!_limitInstance.IsOnlyInstance) // existing root hub running as desktop app throw new RootHubAlreadyStartedException( "The root hub is already running, please close the ScpServer first!"); } catch (UnauthorizedAccessException) // existing root hub running as service { throw new RootHubAlreadyStartedException( "The root hub is already running, please stop the ScpService first!"); } Log.DebugFormat("++ {0} {1}", Assembly.GetExecutingAssembly().Location, Assembly.GetExecutingAssembly().GetName().Version); Log.DebugFormat("++ {0}", OsInfoHelper.OsInfo); #region Native feed server _rxFeedServer = new ReactiveListener(Settings.Default.RootHubNativeFeedPort); _rxFeedServer.Connections.Subscribe(socket => { Log.DebugFormat("Client connected on native feed channel: {0}", socket.GetHashCode()); var protocol = new ScpNativeFeedChannel(socket); _nativeFeedSubscribers.Add(socket.GetHashCode(), protocol); protocol.Receiver.Subscribe(packet => { Log.Warn("Uuuhh how did we end up here?!"); }); socket.Disconnected += (sender, e) => { Log.DebugFormat( "Client disconnected from native feed channel {0}", sender.GetHashCode()); _nativeFeedSubscribers.Remove(socket.GetHashCode()); }; socket.Disposed += (sender, e) => { Log.DebugFormat("Client disposed from native feed channel {0}", sender.GetHashCode()); _nativeFeedSubscribers.Remove(socket.GetHashCode()); }; }); #endregion opened |= _scpBus.Open(GlobalConfiguration.Instance.Bus); opened |= _usbHub.Open(); opened |= _bthHub.Open(); GlobalConfiguration.Load(); return opened; }
static void Main(string[] args) { log4net.Config.BasicConfigurator.Configure(); Tracer.Initialize(new TracerManager()); AppDomain.CurrentDomain.UnhandledException += (s, e) => tracer.Error(e.ExceptionObject); TaskScheduler.UnobservedTaskException += (s, e) => tracer.Error(e.Exception); try { short port = 1055; if (args.Length > 0) port = short.Parse(args[0]); ServiceRegistration.Start(port); var devices = new DeviceRegistry(); var topics = new Dictionary<string, TopicType>(); var stream = new EventStream(); var state = new SystemState(); var impulseStore = new FileImpulseStore("Store\\Impulses"); var commandStore = new FileCommandStore("Store\\Commands"); SetupTracing(stream); // Hook up event stream consumers that perform orthogonal operations. new ClockImpulses(Clock.Default).Connect(stream); new CommandToBytes().Connect(stream); new SensedToImpulse(Sensorium.Clock.Default, topics).Connect(stream); new SetSystemState(state).Connect(stream); // Hook up stores new StoreCommands(commandStore).Connect(stream); new StoreImpulses(impulseStore).Connect(stream); var brain = new Brain(stream, devices, topics, state, Clock.Default); if (File.Exists("Server.cfg")) { var setup = Setup.Read("Server.cfg", File.ReadAllText("Server.cfg")); Console.WriteLine("Applying configuration file:"); Console.WriteLine(setup.ToString(true)); foreach (var topic in setup.Topics) { topics[topic.Key] = topic.Value; } foreach (var device in setup.DeviceTypes) { devices.Register(device.Type, device.Commands.ToArray()); } foreach (var behavior in setup.Behaviors) { brain.Behave(behavior); } } var server = new ReactiveListener(port); server.Connections.Subscribe(socket => { Console.WriteLine("New socket connected {0}", socket.GetHashCode()); var binary = new BinaryChannel(socket); var message = new MessageChannel(binary); var device = new TcpDevice(brain, message, Clock.Default); connectedDevices.Add(device); device.Disconnected += (sender, e) => socket.Dispose(); socket.Disconnected += (sender, e) => { Console.WriteLine("Socket disconnected {0}", sender.GetHashCode()); connectedDevices.Remove(device); device.Dispose(); }; socket.Disposed += (sender, e) => { Console.WriteLine("Socket disposed {0}", sender.GetHashCode()); connectedDevices.Remove(device); device.Dispose(); }; }); server.Start(); Console.WriteLine("Define topic:"); Console.WriteLine(" topic [void|bool|number|string] [name]"); Console.WriteLine("Define device:"); Console.WriteLine(" device [type] [comma-separated list of topic commands the device can receive]"); Console.WriteLine("Define behavior:"); Console.WriteLine(" behave [when then expression]"); Console.WriteLine("Press Enter to exit"); string line = null; while ((line = Console.ReadLine()) != "") { if (line == Environment.NewLine) return; if (line.StartsWith("topic")) { var topic = TopicParser.Parse(line); topics[topic.Item1] = topic.Item2; Console.WriteLine("Registered topic '{0}' of type {1}", topic.Item1, topic.Item2); } else if (line.StartsWith("device")) { var device = DeviceParser.Parse(line); devices.Register(device.Item1, device.Item2.ToArray()); Console.WriteLine("Registered device type '{0}' to receive commands {1}", device.Item1, string.Join(", ", device.Item2.Select(s => "'" + s + "'"))); } else if (line.StartsWith("behave ")) { try { brain.Behave(line.Substring(7)); } catch (Exception e) { Console.WriteLine(e.Message); } } } } catch (Exception e) { Console.WriteLine("Failed: {0}", e); } }
public SMDRReaderService(IServiceConfiguration config) { _config = config; _server = new ReactiveListener(_config.Port); SetupSubscriptions(_server); }