/// <summary>
        /// Parses the provided packet. If the packet cannot be parsed, this method will
        /// throw an argument exception.
        /// </summary>
        /// <param name="packet">The packet to parse.</param>
        /// <returns></returns>
        public override GaugePacket ParsePacket(byte[] packet)
        {
            if (packet.Length < 18 || packet.Length > 20)
            {
                throw new Exception("Packet too short");
            }
            using (BinaryReader r = new BinaryReader(new MemoryStream(packet))) {
                var version = (EProtocolVersion)r.ReadByte();
                var battery = (int)r.ReadByte();

                var readings = new List <GaugeReading>();

                // According to the rigado protocol specification, the packet length should be no more than 19 bytes.
                var           count = 17;                                      // 19 - version and battery
                SensorPayload sp;
                while (count >= (sp = new SensorPayload(r.ReadByte())).length) // While the count still has another potential packet, pull the next packet.
                {
                    count -= sp.length;
                    if (sp.unitCode == 0)
                    {
                        continue;
                    }
                    sp.Parse(r);
                    readings.Add(new GaugeReading()
                    {
                        removed    = !sp.connected,
                        sensorType = UnitLookup.GetSensorTypeFromCode(sp.unitCode),
                        reading    = sp.unit.OfScalar(sp.measurement),
                    });
                }

                return(new GaugePacket(version, battery, readings.ToArray()));
            }
        }
示例#2
0
        public Task <SensorPayloadDecoded> DecodePayload(SensorPayload payload)
        {
            //TODO: implement decoding
            var res = new SensorPayloadDecoded()
            {
                DevEUI = payload.DevEUI,
                Time   = payload.Time
            };

            string data       = payload.Data;
            int    port       = payload.FPort;
            var    startIndex = 0;

            while (startIndex < data.Length)
            {
                switch (port)
                {
                case 40:
                    var tempInternal = getData(data.Substring(startIndex, 4)) / 100.0;
                    startIndex += 4;

                    res.TempInternal = tempInternal;
                    break;

                case 41:
                    var red = getData(data.Substring(startIndex, 4)) / 100.0;
                    startIndex += 4;

                    res.TempRed = red;
                    break;

                case 42:
                    var blue = getData(data.Substring(startIndex, 4)) / 100.0;
                    startIndex += 4;

                    res.TempBlue = blue;
                    break;

                case 43:
                    var temp     = getData(data.Substring(startIndex, 4)) / 100.0;
                    var humidity = getData(data.Substring(startIndex + 4, 2)) / 2.0;
                    startIndex += 6;

                    res.TempHumidity = temp;
                    res.Humidity     = humidity;
                    break;

                default:
                    break;
                }

                if (startIndex < data.Length)
                {
                    port        = getData(data.Substring(startIndex, 2));
                    startIndex += 2;
                }
            }

            return(Task.FromResult(res));
        }
示例#3
0
        public Task <SensorPayloadDecoded> DecodePayload(SensorPayload payload)
        {
            //TODO: implement decoding
            var res = new SensorPayloadDecoded()
            {
                DevEUI = payload.DevEUI,
                Time   = payload.Time
            };

            return(Task.FromResult(res));
        }
示例#4
0
        public async Task DecodePayload2(int port, string data)
        {
            var obj = new SensorPayload()
            {
                DevEUI = "Test",
                Time   = DateTime.UtcNow,
                FPort  = port,
                Data   = data,
            };

            var res = await new SensorService().DecodePayload(obj);

            Assert.Equal(obj.DevEUI, res.DevEUI);
            Assert.Equal(obj.Time, res.Time);
            Assert.Equal(22.9, res.TempHumidity);
            Assert.Equal(25, res.Humidity);
        }
示例#5
0
        public async Task DecodePayload1(int port, string data)
        {
            var obj = new SensorPayload()
            {
                DevEUI = "Test",
                Time   = DateTime.UtcNow,
                FPort  = port,
                Data   = data,
            };

            var res = await new SensorService().DecodePayload(obj);

            Assert.Equal(obj.DevEUI, res.DevEUI);
            Assert.Equal(obj.Time, res.Time);
            Assert.Equal(13.75, res.TempRed);
            Assert.Equal(15.31, res.TempBlue);
            Assert.Equal(15.04, res.TempInternal);
        }
示例#6
0
        static async void SendDeviceToCloudMessagesAsync(DeviceClient deviceClient)
        {
            var package = $"{{LightLevel: {lightLevel}, Temp: {temp:N3}, Analog: {analog:N2}, X: {x}, Y: {y}, Z: {z} }}";
            var sensorPayload = new SensorPayload
            {
                LightLevel = lightLevel,
                Temp = temp,
                Analog = analog,
                X = x,
                Y = y,
                Z = z
            };

            var jsonPackage = JsonConvert.SerializeObject(sensorPayload);

            var message = new Message(Encoding.ASCII.GetBytes(jsonPackage));

            if(deviceClient != null)
                await deviceClient.SendEventAsync(message);
        }