public async void StartLightSwitchServer() { _cts = new CancellationTokenSource(); var listener = new TcpListener(IPAddress.Any, PortSetting); listener.Server.NoDelay = true; listener.Server.LingerState = new LingerOption(true, 2); listener.Start(); await Log.ReportInfoFormatAsync(CancellationToken, "LightSwitch server started on port {0}", PortSetting); NotifyEntityChangeContext.ChangeNotifications<DeviceValue>.OnEntityUpdated += SpeechPlugin_OnEntityUpdated; while (true) { var task = listener.AcceptTcpClientAsync(); try { task.Wait(_cts.Token); } catch (OperationCanceledException e) { if (e.CancellationToken == _cts.Token) break; } var client = task.Result; var lightSwitchClient = new LightSwitchClient(client); _lightSwitchClients.Add(lightSwitchClient); lightSwitchClient.OnConnectionEstabilished += lightSwitchClient_ConnectionEstabilished; lightSwitchClient.OnConnectionClosed += lightSwitchClient_ConnectionClosed; lightSwitchClient.OnDataReceived += lightSwitchClient_DataReceived; lightSwitchClient.OnDataSent += lightSwitchClient_DataSent; lightSwitchClient.OnCmdAList += lightSwitchClient_onCmdAList; lightSwitchClient.OnCmdDevice += lightSwitchClient_onCmdDevice; lightSwitchClient.OnCmdIphone += lightSwitchClient_onCmdIphone; lightSwitchClient.OnCmdList += lightSwitchClient_onCmdList; lightSwitchClient.OnCmdPassword += lightSwitchClient_onCmdPassword; lightSwitchClient.OnCmdScene += lightSwitchClient_onCmdScene; lightSwitchClient.OnCmdServer += lightSwitchClient_onCmdServer; lightSwitchClient.OnCmdSList += lightSwitchClient_onCmdSList; lightSwitchClient.OnCmdTerminate += lightSwitchClient_onCmdTerminate; lightSwitchClient.OnCmdThermMode += lightSwitchClient_onCmdThermMode; lightSwitchClient.OnCmdThermTemp += lightSwitchClient_onCmdThermTemp; lightSwitchClient.OnCmdVersion += lightSwitchClient_onCmdVersion; lightSwitchClient.OnCmdZList += lightSwitchClient_onCmdZList; lightSwitchClient.OnCmdZone += lightSwitchClient_onCmdZone; lightSwitchClient.StartMonitoring(); } listener.Stop(); NotifyEntityChangeContext.ChangeNotifications<DeviceValue>.OnEntityUpdated -= SpeechPlugin_OnEntityUpdated; await Log.ReportInfoAsync("LightSwitch server stopped", CancellationToken); }