/// <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())); } }
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)); }
public Task <SensorPayloadDecoded> DecodePayload(SensorPayload payload) { //TODO: implement decoding var res = new SensorPayloadDecoded() { DevEUI = payload.DevEUI, Time = payload.Time }; return(Task.FromResult(res)); }
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); }
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); }
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); }