Exemple #1
0
        public static byte[] CreateResponse(ControlResponse param)
        {
            List <byte> message = new List <byte>();

            message.Add((byte)param);
            return(message.ToArray());
        }
Exemple #2
0
        public void Process(ControlResponse data)
        {
            var device = data.ToPiDeviceStatus();

            if (_rabbitTracker.DevicesByName.TryGetValue(device.Hostname, out var tmp))
            {
                //Debug.WriteLine("Master processor device found");
                //_backgroundHandler.SendMessage(new UpdateViewMessage());
                UpdateDeviceStatus((IBoontonPi)tmp, device);
            }
            else
            {
                //Debug.WriteLine("Master processor device not found");
                //_backgroundHandler.SendMessage(new UpdateViewMessage());
                AddDevice(device);
            }
            //switch (data.Header.Command)
            //{
            //    case "status_check_response":
            //        UpdateDevices(data);
            //        break;
            //    case "boonton_startup_response":
            //    case "start_poll_response":
            //    case "stop_poll_response":
            //        UpdateDeviceStatus(data);
            //        break;
            //    default:
            //        break;
            //}
        }
Exemple #3
0
        public static string CreateResponseStr(ControlResponse param)
        {
            List <byte> message = new List <byte>();

            message.Add((byte)param);
            return(Encoding.ASCII.GetString(message.ToArray()));
        }
Exemple #4
0
        public static ControlResponse getResponseParamAndDelete(ref string payload)
        {
            ControlResponse output = (ControlResponse)Encoding.ASCII.GetBytes(payload)[0];

            payload = DeleteParam(payload);
            return(output);
        }
        private async Task <ControlResponse> ProcessControlRequestInternalAsync(ControlRequest request)
        {
            ControlRequestInfo requestInfo = null;

            using (var streamReader = new StreamReader(request.InputXml))
            {
                var readerSettings = new XmlReaderSettings()
                {
                    ValidationType  = ValidationType.None,
                    CheckCharacters = false,
                    IgnoreProcessingInstructions = true,
                    IgnoreComments = true,
                    Async          = true
                };

                using var reader = XmlReader.Create(streamReader, readerSettings);
                requestInfo      = await ParseRequestAsync(reader).ConfigureAwait(false);
            }

            Logger.LogDebug("Received control request {0}", requestInfo.LocalName);

            var settings = new XmlWriterSettings
            {
                Encoding    = Encoding.UTF8,
                CloseOutput = false
            };

            StringWriter builder = new StringWriterWithEncoding(Encoding.UTF8);

            using (var writer = XmlWriter.Create(builder, settings))
            {
                writer.WriteStartDocument(true);

                writer.WriteStartElement("SOAP-ENV", "Envelope", NsSoapEnv);
                writer.WriteAttributeString(string.Empty, "encodingStyle", NsSoapEnv, "http://schemas.xmlsoap.org/soap/encoding/");

                writer.WriteStartElement("SOAP-ENV", "Body", NsSoapEnv);
                writer.WriteStartElement("u", requestInfo.LocalName + "Response", requestInfo.NamespaceURI);

                WriteResult(requestInfo.LocalName, requestInfo.Headers, writer);

                writer.WriteFullEndElement();
                writer.WriteFullEndElement();

                writer.WriteFullEndElement();
                writer.WriteEndDocument();
            }

            var xml = builder.ToString().Replace("xmlns:m=", "xmlns:u=", StringComparison.Ordinal);

            var controlResponse = new ControlResponse
            {
                Xml          = xml,
                IsSuccessful = true
            };

            controlResponse.Headers.Add("EXT", string.Empty);

            return(controlResponse);
        }
Exemple #6
0
 private void EnsureSuccess(ControlResponse response)
 {
     if (response is ErrorResponse err)
     {
         throw err.Exception;
     }
 }
        private void OpenPassiveDataSocket()
        {
            Debug.Assert(socketControl != null);
            Debug.Assert(socketData == null);

            Thread.Sleep(10);
            SendCommand("PASV", null);
            ControlResponse response = RecieveControlResponse();

            if (!response.PositiveCompletion)
            {
                throw new Exception("Server returned error when requesting passive connection.");
            }

            IPEndPoint dataEndPoint = ParsePassiveIPAddress(response.Response);

            Trace.WriteLine("Opening passive data connection to: " + dataEndPoint.ToString());

            try
            {
                socketData = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socketData.Connect(dataEndPoint);
            }
            catch (Exception)
            {
                if (socketData != null)
                {
                    socketData.Close();
                }
                socketData = null;
                throw;
            }
        }
Exemple #8
0
        public static byte[] CreateResponse(ControlResponse param, string payload)
        {
            List <byte> message = new List <byte>();

            message.Add((byte)param);
            message.AddRange(Encoding.ASCII.GetBytes(payload));
            return(message.ToArray());
        }
        private ControlResponse ProcessControlRequestInternal(ControlRequest request)
        {
            var soap = new XmlDocument();

            soap.LoadXml(request.InputXml);
            var sparams = new Headers();
            var body    = soap.GetElementsByTagName("Body", NS_SOAPENV).Item(0);

            var method = body.FirstChild;

            foreach (var p in method.ChildNodes)
            {
                var e = p as XmlElement;
                if (e == null)
                {
                    continue;
                }
                sparams.Add(e.LocalName, e.InnerText.Trim());
            }

            Logger.Debug("Received control request {0}", method.LocalName);

            IEnumerable <KeyValuePair <string, string> > result = GetResult(method.LocalName, sparams);

            var env = new XmlDocument();

            env.AppendChild(env.CreateXmlDeclaration("1.0", "utf-8", string.Empty));
            var envelope = env.CreateElement("SOAP-ENV", "Envelope", NS_SOAPENV);

            env.AppendChild(envelope);
            envelope.SetAttribute("encodingStyle", NS_SOAPENV, "http://schemas.xmlsoap.org/soap/encoding/");

            var rbody = env.CreateElement("SOAP-ENV:Body", NS_SOAPENV);

            env.DocumentElement.AppendChild(rbody);

            var response = env.CreateElement(String.Format("u:{0}Response", method.LocalName), method.NamespaceURI);

            rbody.AppendChild(response);

            foreach (var i in result)
            {
                var ri = env.CreateElement(i.Key);
                ri.InnerText = i.Value;
                response.AppendChild(ri);
            }

            var controlResponse = new ControlResponse
            {
                Xml          = env.OuterXml,
                IsSuccessful = true
            };

            controlResponse.Headers.Add("EXT", string.Empty);

            return(controlResponse);
        }
        private void LogResponse(ControlResponse response)
        {
            if (!Config.GetDlnaConfiguration().EnableDebugLog)
            {
                return;
            }

            Logger.LogDebug("Control response. Headers: {@Headers}\n{Xml}", response.Headers, response.Xml);
        }
        public void Decode()
        {
            ControlResponse response = new ControlResponse();

            response.wireDecode(TestControlResponse1);

            Assert.AssertEquals(response.getStatusCode(), 404);
            Assert.AssertEquals(response.getStatusText(), "Nothing not found");
            Assert.AssertEquals(response.getBodyAsControlParameters().getFaceId(), 10);
        }
        private void LogResponse(ControlResponse response)
        {
            var builder = new StringBuilder();

            var headers = string.Join(", ", response.Headers.Select(i => string.Format("{0}={1}", i.Key, i.Value)).ToArray());

            builder.AppendFormat("Headers: {0}", headers);
            builder.AppendLine();
            builder.Append(response.Xml);

            Logger.LogMultiline("Control response", LogSeverity.Debug, builder);
        }
        public void Encode()
        {
            ControlResponse response = new ControlResponse();

            response.setStatusCode(404);
            response.setStatusText("Nothing not found");
            response.setBodyAsControlParameters(new ControlParameters());
            response.getBodyAsControlParameters().setFaceId(10);
            Blob wire = response.wireEncode();

            Assert.AssertEquals(wire.buf(), TestControlResponse1);
        }
        public void Put(string fileName, string remoteFile, UploadCallback callback)
        {
            Socket localDataSocket = null;

            OpenDataSocket();

            try
            {
                SendCommand("TYPE", "I");
                ControlResponse response = RecieveControlResponse();

                SendCommand("STOR", remoteFile);
                response = RecieveControlResponse();
                if (!response.PositivePreliminary)
                {
                    throw new Exception("Error returned by error for LIST command");
                }

                localDataSocket = ActivateDataSocket();

                Byte[] sendBuffer    = new Byte[8096];
                int    totalSizeRead = 0;
                using (FileStream strm = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    int sizeRead;
                    while (0 != (sizeRead = strm.Read(sendBuffer, 0, 8096)))
                    {
                        totalSizeRead += sizeRead;
                        localDataSocket.Send(sendBuffer, 0, sizeRead, SocketFlags.None);
                        if (callback != null)
                        {
                            callback((float)totalSizeRead / (float)strm.Length);
                        }

                        Trace.WriteLine(String.Format("Writing file, {0:f2}% complete.", ((float)totalSizeRead / (float)strm.Length) * 100.0f), "FTPDataResponse");
                    }
                }

                CloseDataSocket(localDataSocket);
                localDataSocket = null;

                response = RecieveControlResponse();

                Trace.WriteLine("File written successfully", "FTPDataResponse");
            }
            finally
            {
                CloseDataSocket(localDataSocket);
            }
        }
Exemple #15
0
        private void LogResponse(ControlResponse response)
        {
            if (!Config.GetDlnaConfiguration().EnableDebugLog)
            {
                return;
            }

            var originalHeaders = response.Headers;
            var headers         = string.Join(", ", originalHeaders.Select(i => string.Format("{0}={1}", i.Key, i.Value)).ToArray());

            //builder.Append(response.Xml);

            _logger.LogDebug("Control response. Headers: {0}", headers);
        }
        public async Task <ControlResponse> FindAsync(int code)
        {
            try
            {
                var exist = await _controlRepository.FindByIdAsync(code);

                ControlResponse response = exist == null ? new ControlResponse($"Control {code} not found") : new ControlResponse(exist);

                return(response);
            }
            catch (Exception e)
            {
                return(new ControlResponse($"An error occurred when finding the control: { e.Message }"));
            }
        }
        public string List()
        {
            Socket localDataSocket = null;

            OpenDataSocket();

            try
            {
                SendCommand("TYPE", "A");
                ControlResponse response = RecieveControlResponse();

                SendCommand("LIST", "-aL");
                response = RecieveControlResponse();
                if (!response.PositivePreliminary)
                {
                    throw new Exception("Error returned by error for LIST command");
                }

                localDataSocket = ActivateDataSocket();

                Byte[] recvBuffer = new Byte[256];

                StringBuilder sbData = new StringBuilder();

                while (true)
                {
                    int bytesRead = localDataSocket.Receive(recvBuffer);
                    if (bytesRead <= 0)
                    {
                        break;
                    }
                    sbData.Append(Encoding.ASCII.GetString(recvBuffer, 0, bytesRead));
                }

                Trace.Write(sbData.ToString(), "FTPDataResponse");

                return(sbData.ToString());
            }
            finally
            {
                CloseDataSocket(localDataSocket);
            }
        }
        private void OpenControlSocket()
        {
            Debug.Assert(socketControl == null);

            socketControl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            try
            {
                IPAddress  hostAddr     = Dns.Resolve(server).AddressList[0];
                IPEndPoint endpointHost = new IPEndPoint(hostAddr, port);

                socketControl.Connect(endpointHost);
                if (!socketControl.Connected)
                {
                    throw new Exception("Could not connect to FTP host");
                }
            }
            catch (Exception)
            {
                socketControl.Close();
                socketControl = null;
                throw;
            }

            RecieveControlResponse();

            SendCommand("USER", userName);
            ControlResponse response = RecieveControlResponse();

            if (response.SCode != 331)
            {
                throw new Exception("USER command rejected");
            }

            SendCommand("PASS", password);
            response = RecieveControlResponse();
            if (response.SCode != 230)
            {
                throw new Exception("PASS command rejected");
            }
        }
        private ControlResponse CreateControlResponse(ControlRequestInfo requestInfo)
        {
            var settings = new XmlWriterSettings
            {
                Encoding    = Encoding.UTF8,
                CloseOutput = false
            };

            StringWriter builder = new StringWriterWithEncoding(Encoding.UTF8);

            using (var writer = XmlWriter.Create(builder, settings))
            {
                writer.WriteStartDocument(true);

                writer.WriteStartElement("SOAP-ENV", "Envelope", NsSoapEnv);
                writer.WriteAttributeString(string.Empty, "encodingStyle", NsSoapEnv, "http://schemas.xmlsoap.org/soap/encoding/");

                writer.WriteStartElement("SOAP-ENV", "Body", NsSoapEnv);
                writer.WriteStartElement("u", requestInfo.LocalName + "Response", requestInfo.NamespaceURI);

                WriteResult(requestInfo.LocalName, requestInfo.Headers, writer);

                writer.WriteFullEndElement();
                writer.WriteFullEndElement();

                writer.WriteFullEndElement();
                writer.WriteEndDocument();
            }

            var xml = builder.ToString().Replace("xmlns:m=", "xmlns:u=", StringComparison.Ordinal);

            var controlResponse = new ControlResponse(xml, true);

            controlResponse.Headers.Add("EXT", string.Empty);

            return(controlResponse);
        }
        private void OpenRegularDataSocket()
        {
            Debug.Assert(socketControl != null);
            Debug.Assert(socketData == null);

            try
            {
                IPEndPoint epLocalData;

                socketData = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                epLocalData = new IPEndPoint(((IPEndPoint)socketControl.LocalEndPoint).Address.Address, 0);

                socketData.Bind(epLocalData);
                socketData.Listen(1);

                epLocalData = (IPEndPoint)socketData.LocalEndPoint;
                String stringAddress = FormatAddress(epLocalData.Address.Address, epLocalData.Port);

                SendCommand("PORT", stringAddress);
                ControlResponse response = RecieveControlResponse();
                if (!response.PositiveCompletion)
                {
                    throw new Exception("Server returned error when setting up regular data connection.");
                }
            }
            catch (Exception)
            {
                if (socketData != null)
                {
                    socketData.Close();
                }
                socketData = null;
                throw;
            }
        }
        public async Task <ControlResponse> UpdateAsync(int code, Control control)
        {
            try
            {
                var exist = await _controlRepository.FindByIdAsync(code);

                ControlResponse response = exist == null ? new ControlResponse($"Control {code} not found") : new ControlResponse(exist);

                exist.Description = control.Description != "" ? control.Description : exist.Description;

                exist.Entry = control.Entry != "" ? control.Entry : exist.Entry;

                exist.Exit = control.Exit != "" ? control.Exit : exist.Exit;

                _controlRepository.Update(exist);
                await _unitOfWork.CompleteAsync();

                return(response);
            }
            catch (Exception e)
            {
                return(new ControlResponse($"An error occurred when updating the control: { e.Message }"));
            }
        }
Exemple #22
0
 public void Process(ControlResponse data)
 {
     Debug.WriteLine("None Master Control Processor, process");
 }
Exemple #23
0
 /// <summary>
 /// Decode input as a control parameters and set the fields of the
 /// controlResponse object.  Your derived class should override.
 /// </summary>
 ///
 /// <param name="controlResponse"></param>
 /// <param name="input"></param>
 /// <exception cref="System.NotSupportedException">for unimplemented if the derivedclass does not override.</exception>
 /// <exception cref="EncodingException">For invalid encoding.</exception>
 public virtual void decodeControlResponse(ControlResponse controlResponse,
                                           ByteBuffer input)
 {
     throw new NotSupportedException(
               "decodeControlResponse is not implemented");
 }
Exemple #24
0
 /// <summary>
 /// Encode controlResponse and return the encoding.
 /// Your derived class should override.
 /// </summary>
 ///
 /// <param name="controlResponse">The ControlResponse object to encode.</param>
 /// <returns>A Blob containing the encoding.</returns>
 /// <exception cref="System.NotSupportedException">for unimplemented if the derivedclass does not override.</exception>
 public virtual Blob encodeControlResponse(ControlResponse controlResponse)
 {
     throw new NotSupportedException(
               "encodeControlResponse is not implemented");
 }
Exemple #25
0
        public ControlResponse Control(ControlRequest alexaRequest)
        {
            //IPremiseObject PremiseServer.HomeObject, rootObject;
            var response = new ControlResponse();

            #region CheckRequest

            if ((alexaRequest == null) || (alexaRequest.header == null) || (alexaRequest.header.payloadVersion != "2"))
            {
                response.header.@namespace = Faults.Namespace;
                response.header.name       = Faults.UnexpectedInformationReceivedError;
                response.payload.exception = new ExceptionResponsePayload
                {
                    faultingParameter = "alexaRequest"
                };
                return(response);
            }

            #endregion CheckRequest

            #region BuildResponse

            try
            {
                response.header.messageId  = alexaRequest.header.messageId;
                response.header.@namespace = alexaRequest.header.@namespace;
                response.header.name       = alexaRequest.header.name.Replace("Request", "Confirmation");
            }
            catch (Exception)
            {
                response.header.@namespace = Faults.Namespace;
                response.header.name       = Faults.UnexpectedInformationReceivedError;
                response.payload.exception = new ExceptionResponsePayload
                {
                    faultingParameter = "alexaRequest.header.name"
                };
                return(response);
            }

            #endregion BuildResponse

            //SYSClient client = new SYSClient();

            #region ConnectToPremise

            if (PremiseServer.HomeObject == null)
            {
                response.header.@namespace = Faults.Namespace;
                response.header.name       = Faults.DependentServiceUnavailableError;
                response.payload.exception = new ExceptionResponsePayload
                {
                    dependentServiceName = "Premise Server"
                };
                return(response);
            }

            #endregion ConnectToPremise

            try
            {
                if (!CheckAccessToken(alexaRequest.payload.accessToken).GetAwaiter().GetResult())
                {
                    response.header.@namespace = Faults.Namespace;
                    response.header.name       = Faults.InvalidAccessTokenError;
                    response.payload.exception = new ExceptionResponsePayload();
                    return(response);
                }

                InformLastContact("ControlRequest:" + alexaRequest.payload.appliance.additionalApplianceDetails.path).GetAwaiter().GetResult();

                // check request types
                ControlRequestType requestType = ControlRequestType.Unknown;
                DeviceType         deviceType  = DeviceType.Unknown;

                string command = alexaRequest.header.name.Trim().ToUpper();
                switch (command)
                {
                case "TURNOFFREQUEST":
                    requestType = ControlRequestType.TurnOffRequest;
                    deviceType  = DeviceType.OnOff;
                    break;

                case "TURNONREQUEST":
                    requestType = ControlRequestType.TurnOnRequest;
                    deviceType  = DeviceType.OnOff;
                    break;

                case "SETTARGETTEMPERATUREREQUEST":
                    requestType = ControlRequestType.SetTargetTemperature;
                    deviceType  = DeviceType.Thermostat;
                    break;

                case "INCREMENTTARGETTEMPERATUREREQUEST":
                    requestType = ControlRequestType.IncrementTargetTemperature;
                    deviceType  = DeviceType.Thermostat;
                    break;

                case "DECREMENTTARGETTEMPERATUREREQUEST":
                    requestType = ControlRequestType.DecrementTargetTemperature;
                    deviceType  = DeviceType.Thermostat;
                    break;

                case "SETPERCENTAGEREQUEST":
                    requestType = ControlRequestType.SetPercentage;
                    deviceType  = DeviceType.Dimmer;
                    break;

                case "INCREMENTPERCENTAGEREQUEST":
                    requestType = ControlRequestType.IncrementPercentage;
                    deviceType  = DeviceType.Dimmer;
                    break;

                case "DECREMENTPERCENTAGEREQUEST":
                    requestType = ControlRequestType.DecrementPercentage;
                    deviceType  = DeviceType.Dimmer;
                    break;

                case "SETCOLORREQUEST":
                    requestType = ControlRequestType.SetColorRequest;
                    deviceType  = DeviceType.ColorLight;
                    break;

                case "SETCOLORTEMPERATUREREQUEST":
                    requestType = ControlRequestType.SetColorTemperatureRequest;
                    deviceType  = DeviceType.ColorLight;
                    break;

                case "INCREMENTCOLORTEMPERATUREREQUEST":
                    requestType = ControlRequestType.IncrementColorTemperature;
                    deviceType  = DeviceType.ColorLight;
                    break;

                case "DECREMENTCOLORTEMPERATUREREQUEST":
                    requestType = ControlRequestType.DecrementColorTemperature;
                    deviceType  = DeviceType.ColorLight;
                    break;

                default:
                    response.header.@namespace = Faults.Namespace;
                    response.header.name       = Faults.UnsupportedOperationError;
                    response.payload.exception = new ExceptionResponsePayload();
                    return(response);
                }

                // get the object
                IPremiseObject applianceToControl = null;
                try
                {
                    Guid premiseId = new Guid(alexaRequest.payload.appliance.applianceId);
                    applianceToControl = PremiseServer.RootObject.GetObject(premiseId.ToString("B")).GetAwaiter().GetResult();
                    if (applianceToControl == null)
                    {
                        throw new Exception();
                    }
                }
                catch
                {
                    response.header.@namespace = Faults.Namespace;
                    response.header.name       = Faults.NoSuchTargetError;
                    response.payload.exception = new ExceptionResponsePayload();
                    return(response);
                }

                if (deviceType == DeviceType.OnOff)
                {
                    switch (requestType)
                    {
                    case ControlRequestType.TurnOnRequest:
                        applianceToControl.SetValue("PowerState", "True").GetAwaiter().GetResult();
                        break;

                    case ControlRequestType.TurnOffRequest:
                        applianceToControl.SetValue("PowerState", "False").GetAwaiter().GetResult();
                        break;

                    default:
                        break;
                    }
                }
                else if (deviceType == DeviceType.Dimmer)
                {
                    double currentValue = 0.0;
                    double adjustValue  = 0.0;
                    double valueToSend  = 0.0;

                    switch (requestType)
                    {
                    case ControlRequestType.SetPercentage:
                        // obtain the adjustValue
                        adjustValue = Math.Round(double.Parse(alexaRequest.payload.percentageState.value), 2).LimitToRange(0.00, 100.00);
                        // convert from percentage and maintain fractional accuracy
                        valueToSend = Math.Round(adjustValue / 100.00, 4);
                        applianceToControl.SetValue("Brightness", valueToSend.ToString()).GetAwaiter().GetResult();
                        break;

                    case ControlRequestType.IncrementPercentage:
                        // obtain the adjustValue
                        adjustValue  = Math.Round(double.Parse(alexaRequest.payload.deltaPercentage.value) / 100.00, 2).LimitToRange(0.00, 100.00);
                        currentValue = Math.Round(applianceToControl.GetValue <Double>("Brightness").GetAwaiter().GetResult(), 2);
                        // maintain fractional accuracy
                        valueToSend = Math.Round(currentValue + adjustValue, 2).LimitToRange(0.00, 1.00);
                        applianceToControl.SetValue("Brightness", valueToSend.ToString()).GetAwaiter().GetResult();
                        break;

                    case ControlRequestType.DecrementPercentage:
                        // obtain the adjustValue
                        adjustValue  = Math.Round(double.Parse(alexaRequest.payload.deltaPercentage.value) / 100.00, 2).LimitToRange(0.00, 100.00);
                        currentValue = Math.Round(applianceToControl.GetValue <Double>("Brightness").GetAwaiter().GetResult(), 2);
                        // maintain fractional accuracy
                        valueToSend = Math.Round(currentValue - adjustValue, 2).LimitToRange(0.00, 1.00);
                        applianceToControl.SetValue("Brightness", valueToSend.ToString()).GetAwaiter().GetResult();
                        break;

                    default:
                        break;
                    }
                }
                else if (deviceType == DeviceType.ColorLight)
                {
                    const double adjustValue  = 100.0;
                    double       currentValue = 0.0;
                    double       valueToSend  = 0.0;
                    response.payload.achievedState = new AchievedState();

                    switch (requestType)
                    {
                    case ControlRequestType.SetColorRequest:
                        // obtain the adjustValue
                        double hue        = Math.Round(alexaRequest.payload.color.hue.LimitToRange(0, 360), 1);
                        double saturation = Math.Round(alexaRequest.payload.color.saturation, 4);
                        double brightness = Math.Round(alexaRequest.payload.color.brightness, 4);
                        // set the values
                        applianceToControl.SetValue("Hue", hue.ToString()).GetAwaiter().GetResult();
                        applianceToControl.SetValue("Saturation", saturation.ToString()).GetAwaiter().GetResult();
                        applianceToControl.SetValue("Brightness", brightness.ToString()).GetAwaiter().GetResult();
                        // read them back for achieved state
                        response.payload.achievedState.color = new ApplianceColorValue
                        {
                            hue        = Math.Round(applianceToControl.GetValue <Double>("Hue").GetAwaiter().GetResult(), 1),
                            saturation = Math.Round(applianceToControl.GetValue <Double>("Saturation").GetAwaiter().GetResult(), 4),
                            brightness = Math.Round(applianceToControl.GetValue <Double>("Brightness").GetAwaiter().GetResult(), 4)
                        };
                        break;

                    case ControlRequestType.SetColorTemperatureRequest:
                        valueToSend = alexaRequest.payload.colorTemperature.value.LimitToRange(1000, 10000);
                        // set the value
                        applianceToControl.SetValue("Temperature", Math.Round(valueToSend, 0).ToString()).GetAwaiter().GetResult();
                        // read it back
                        response.payload.achievedState.colorTemperature = new ApplianceColorTemperatureValue
                        {
                            value = applianceToControl.GetValue <int>("Temperature").GetAwaiter().GetResult()
                        };
                        break;

                    case ControlRequestType.IncrementColorTemperature:
                        currentValue = applianceToControl.GetValue <int>("Temperature").GetAwaiter().GetResult();
                        valueToSend  = Math.Round(currentValue + adjustValue, 0).LimitToRange(1000, 10000);
                        // set the value
                        applianceToControl.SetValue("Temperature", valueToSend.ToString()).GetAwaiter().GetResult();
                        // read it back
                        response.payload.achievedState.colorTemperature = new ApplianceColorTemperatureValue
                        {
                            value = applianceToControl.GetValue <int>("Temperature").GetAwaiter().GetResult()
                        };
                        break;

                    case ControlRequestType.DecrementColorTemperature:
                        currentValue = Math.Round(applianceToControl.GetValue <Double>("Temperature").GetAwaiter().GetResult(), 2);
                        valueToSend  = Math.Round(currentValue - adjustValue, 0).LimitToRange(1000, 10000);
                        // set the value
                        applianceToControl.SetValue("Temperature", valueToSend.ToString()).GetAwaiter().GetResult();
                        // read it back
                        response.payload.achievedState.colorTemperature = new ApplianceColorTemperatureValue
                        {
                            value = applianceToControl.GetValue <int>("Temperature").GetAwaiter().GetResult()
                        };
                        break;

                    default:
                        break;
                    }
                }
                else if (deviceType == DeviceType.Thermostat)
                {
                    int         previousTemperatureMode;
                    int         temperatureMode;
                    Temperature previousTargetTemperature = null;
                    Temperature targetTemperature         = null;
                    double      deltaTemperatureC         = 0.0; // in C

                    // obtain previous state (sys stores temperatures as K)
                    previousTemperatureMode   = applianceToControl.GetValue <int>("TemperatureMode").GetAwaiter().GetResult();
                    previousTargetTemperature = new Temperature(applianceToControl.GetValue <double>("CurrentSetPoint").GetAwaiter().GetResult());

                    switch (requestType)
                    {
                    case ControlRequestType.SetTargetTemperature:
                        // get target temperature in C
                        targetTemperature = new Temperature
                        {
                            Celcius = double.Parse(alexaRequest.payload.targetTemperature.value)
                        };
                        break;

                    case ControlRequestType.IncrementTargetTemperature:
                        // get delta temp in C
                        deltaTemperatureC = double.Parse(alexaRequest.payload.deltaTemperature.value);
                        // increment the targetTemp
                        targetTemperature = new Temperature
                        {
                            Celcius = previousTargetTemperature.Celcius + deltaTemperatureC
                        };
                        break;

                    case ControlRequestType.DecrementTargetTemperature:
                        // get delta temp in C
                        deltaTemperatureC = double.Parse(alexaRequest.payload.deltaTemperature.value);
                        // decrement the targetTemp
                        targetTemperature = new Temperature
                        {
                            Celcius = previousTargetTemperature.Celcius - deltaTemperatureC
                        };
                        break;

                    default:
                        targetTemperature       = new Temperature(0.00);
                        previousTemperatureMode = 10;     // error
                        break;
                    }

                    // set new target temperature
                    applianceToControl.SetValue("CurrentSetPoint", targetTemperature.Kelvin.ToString()).GetAwaiter().GetResult();
                    response.payload.targetTemperature = new ApplianceValue
                    {
                        value = targetTemperature.Celcius.ToString()
                    };

                    // get new mode
                    temperatureMode = applianceToControl.GetValue <int>("TemperatureMode").GetAwaiter().GetResult();
                    // report new mode
                    response.payload.temperatureMode = new ApplianceValue
                    {
                        value = TemperatureMode.ModeToString(temperatureMode)
                    };

                    // alloc a previousState object
                    response.payload.previousState = new AppliancePreviousState
                    {
                        // report previous mode
                        mode = new ApplianceValue
                        {
                            value = TemperatureMode.ModeToString(previousTemperatureMode)
                        },

                        // report previous targetTemperature in C
                        targetTemperature = new ApplianceValue
                        {
                            value = previousTargetTemperature.Celcius.ToString()
                        }
                    };
                }
                else
                {
                    response.header.@namespace = Faults.Namespace;
                    response.header.name       = Faults.UnsupportedOperationError;
                    response.payload.exception = new ExceptionResponsePayload();
                }
            }
            catch
            {
                response.header.@namespace = Faults.Namespace;
                response.header.name       = Faults.DriverpublicError;
                response.payload.exception = new ExceptionResponsePayload();
            }

            return(response);
        }
Exemple #26
0
        private ControlResponse ProcessControlRequestInternal(ControlRequest request)
        {
            ControlRequestInfo requestInfo = null;

            using (var streamReader = new StreamReader(request.InputXml))
            {
                var readerSettings = XmlReaderSettingsFactory.Create(false);

                readerSettings.CheckCharacters = false;
                readerSettings.IgnoreProcessingInstructions = true;
                readerSettings.IgnoreComments = true;

                using (var reader = XmlReader.Create(streamReader, readerSettings))
                {
                    requestInfo = ParseRequest(reader);
                }
            }

            _logger.LogDebug("Received control request {0}", requestInfo.LocalName);

            var result = GetResult(requestInfo.LocalName, requestInfo.Headers);

            var settings = new XmlWriterSettings
            {
                Encoding    = Encoding.UTF8,
                CloseOutput = false
            };

            StringWriter builder = new StringWriterWithEncoding(Encoding.UTF8);

            using (var writer = XmlWriter.Create(builder, settings))
            {
                writer.WriteStartDocument(true);

                writer.WriteStartElement("SOAP-ENV", "Envelope", NS_SOAPENV);
                writer.WriteAttributeString(string.Empty, "encodingStyle", NS_SOAPENV, "http://schemas.xmlsoap.org/soap/encoding/");

                writer.WriteStartElement("SOAP-ENV", "Body", NS_SOAPENV);
                writer.WriteStartElement("u", requestInfo.LocalName + "Response", requestInfo.NamespaceURI);
                foreach (var i in result)
                {
                    writer.WriteStartElement(i.Key);
                    writer.WriteString(i.Value);
                    writer.WriteFullEndElement();
                }
                writer.WriteFullEndElement();
                writer.WriteFullEndElement();

                writer.WriteFullEndElement();
                writer.WriteEndDocument();
            }

            var xml = builder.ToString().Replace("xmlns:m=", "xmlns:u=");

            var controlResponse = new ControlResponse
            {
                Xml          = xml,
                IsSuccessful = true
            };

            //logger.LogDebug(xml);

            controlResponse.Headers.Add("EXT", string.Empty);

            return(controlResponse);
        }
Exemple #27
0
        private ControlResponse ProcessControlRequestInternal(ControlRequest request)
        {
            var soap = new XmlDocument();

            soap.LoadXml(request.InputXml);
            var sparams = new Headers();
            var body    = soap.GetElementsByTagName("Body", NS_SOAPENV).Item(0);

            var method = body.FirstChild;

            foreach (var p in method.ChildNodes)
            {
                var e = p as XmlElement;
                if (e == null)
                {
                    continue;
                }
                sparams.Add(e.LocalName, e.InnerText.Trim());
            }

            var deviceId = "test";

            IEnumerable <KeyValuePair <string, string> > result;

            _logger.Debug("Received control request {0}", method.Name);

            var user = _user;

            if (string.Equals(method.LocalName, "GetSearchCapabilities", StringComparison.OrdinalIgnoreCase))
            {
                result = HandleGetSearchCapabilities();
            }
            else if (string.Equals(method.LocalName, "GetSortCapabilities", StringComparison.OrdinalIgnoreCase))
            {
                result = HandleGetSortCapabilities();
            }
            else if (string.Equals(method.LocalName, "GetSystemUpdateID", StringComparison.OrdinalIgnoreCase))
            {
                result = HandleGetSystemUpdateID();
            }
            else if (string.Equals(method.LocalName, "Browse", StringComparison.OrdinalIgnoreCase))
            {
                result = HandleBrowse(sparams, user, deviceId);
            }
            else if (string.Equals(method.LocalName, "X_GetFeatureList", StringComparison.OrdinalIgnoreCase))
            {
                result = HandleXGetFeatureList();
            }
            else if (string.Equals(method.LocalName, "X_SetBookmark", StringComparison.OrdinalIgnoreCase))
            {
                result = HandleXSetBookmark(sparams, user);
            }
            else if (string.Equals(method.LocalName, "Search", StringComparison.OrdinalIgnoreCase))
            {
                result = HandleSearch(sparams, user, deviceId);
            }
            else
            {
                throw new ResourceNotFoundException("Unexpected control request name: " + method.LocalName);
            }

            var env = new XmlDocument();

            env.AppendChild(env.CreateXmlDeclaration("1.0", "utf-8", "yes"));
            var envelope = env.CreateElement("SOAP-ENV", "Envelope", NS_SOAPENV);

            env.AppendChild(envelope);
            envelope.SetAttribute("encodingStyle", NS_SOAPENV, "http://schemas.xmlsoap.org/soap/encoding/");

            var rbody = env.CreateElement("SOAP-ENV:Body", NS_SOAPENV);

            env.DocumentElement.AppendChild(rbody);

            var response = env.CreateElement(String.Format("u:{0}Response", method.LocalName), method.NamespaceURI);

            rbody.AppendChild(response);

            foreach (var i in result)
            {
                var ri = env.CreateElement(i.Key);
                ri.InnerText = i.Value;
                response.AppendChild(ri);
            }

            var controlResponse = new ControlResponse
            {
                Xml          = env.OuterXml,
                IsSuccessful = true
            };

            controlResponse.Headers.Add("EXT", string.Empty);

            return(controlResponse);
        }
Exemple #28
0
 /// <summary>
 /// Decode input as a control parameters and set the fields of the
 /// controlResponse object. Copy from the input when making new Blob values.
 /// Your derived class should override.
 /// </summary>
 ///
 /// <param name="controlResponse"></param>
 /// <param name="input"></param>
 /// <exception cref="System.NotSupportedException">for unimplemented if the derivedclass does not override.</exception>
 /// <exception cref="EncodingException">For invalid encoding.</exception>
 public void decodeControlResponse(ControlResponse controlResponse,
                                   ByteBuffer input)
 {
     decodeControlResponse(controlResponse, input, true);
 }