public GPRMCData ProcessGPRMC(string data) { string[] fields = data.Split(','); GPRMCData GPRMC = new GPRMCData(); GPRMC.TimeStamp = new DateTime( Convert.ToInt32(fields[9].Substring(4, 2)) + 2000, // year Convert.ToInt32(fields[9].Substring(2, 2)), // month Convert.ToInt32(fields[9].Substring(0, 2)), // day Convert.ToInt32(fields[1].Substring(0, 2)), // hour Convert.ToInt32(fields[1].Substring(2, 2)), // minute Convert.ToInt32(fields[1].Substring(4, 2)), // second DateTimeKind.Utc); GPRMC.DataValid = Convert.ToChar(fields[2]); //Latitude GPRMC.Latitude = DDMMSSToDecimalDegrees(fields[3]); if (fields[4] == "S") { GPRMC.Latitude = GPRMC.Latitude * -1; } //Longitude GPRMC.Longitude = DDMMSSToDecimalDegrees(fields[5]); if (fields[6] == "W") { GPRMC.Longitude = GPRMC.Longitude * -1; } GPRMC.GroundSpeed = Convert.ToSingle(fields[7]); if (!String.IsNullOrEmpty(fields[8])) { GPRMC.Bearing = Convert.ToSingle(fields[8]); } return(GPRMC); }
public string Report(string data) { string[] parts = data.Split('|'); if (parts.Length != 14) { return("Incomplete"); } Tracking trackingData = new Tracking(); trackingData.ServerTimeStamp = DateTime.UtcNow; trackingData.IMEI = parts[0].Substring(4); trackingData.EventType = Convert.ToInt32(parts[1].Substring(0, 2), 16); string gprmc = parts[1].Substring(2); if (gprmc.StartsWith("$GPRMC")) { GPRMCData gprmcData = ProcessGPRMC(gprmc); trackingData.SatelliteTimeStamp = gprmcData.TimeStamp; trackingData.SatelliteFixStatus = new string(gprmcData.DataValid, 1); trackingData.Latitude = gprmcData.Latitude; trackingData.Longitude = gprmcData.Longitude; trackingData.Speed = gprmcData.GroundSpeed * 1.852f; // knots -> kmph trackingData.Bearing = gprmcData.Bearing; } else { trackingData.SatelliteFixStatus = "V"; } trackingData.PDOP = Convert.ToSingle(parts[2]); trackingData.HDOP = Convert.ToSingle(parts[3]); trackingData.VDOP = Convert.ToSingle(parts[4]); trackingData.IOStatus = parts[5]; trackingData.DeviceTimeStamp = new DateTime( Convert.ToInt32(parts[6].Substring(0, 4)), // year Convert.ToInt32(parts[6].Substring(4, 2)), // month Convert.ToInt32(parts[6].Substring(6, 2)), // day Convert.ToInt32(parts[6].Substring(8, 2)), // hour Convert.ToInt32(parts[6].Substring(10, 2)), // minute Convert.ToInt32(parts[6].Substring(12, 2)), // second DateTimeKind.Utc); trackingData.ChargeStatus = parts[7][0] == '1'; trackingData.BatteryVoltage = Convert.ToSingle(parts[7].Substring(1, 3)) / 100.0f; trackingData.InputVoltage = Convert.ToSingle(parts[7].Substring(4)) / 100.0f; trackingData.ADC0 = Convert.ToSingle(parts[8].Substring(0, 4)) / 100.0f; trackingData.ADC1 = Convert.ToSingle(parts[8].Substring(4, 4)) / 100.0f; trackingData.LocationCode = Convert.ToInt32(parts[9].Substring(0, 4), 16); trackingData.CellID = Convert.ToInt32(parts[9].Substring(4, 4), 16); trackingData.Mileage = Convert.ToDouble(parts[11]); trackingData.Serial = Convert.ToInt32(parts[12]); if (trackingData.SatelliteFixStatus == "A") { trackingData.Address = ReverseGeocode(trackingData.Latitude, trackingData.Longitude); } Device device = db.Devices.Include("GeoArea").SingleOrDefault(d => d.IMEI == trackingData.IMEI); if (trackingData.SatelliteFixStatus == "A" && device != null && device.GeoArea != null) { string[] lls = device.GeoArea.LatLongs.Split('|'); int count = lls.Length; double[] polyX = new double[count]; double[] polyY = new double[count]; for (int k = 0; k < count; k++) { string[] ll = lls[k].Split(','); polyX[k] = Convert.ToDouble(ll[0]); polyY[k] = Convert.ToDouble(ll[1]); } bool oddNodes = false; int i, j = count - 1; double x = trackingData.Latitude; double y = trackingData.Longitude; for (i = 0; i < count; i++) { if (polyY[i] < y && polyY[j] >= y || polyY[j] < y && polyY[i] >= y) { if (polyX[i] + (y - polyY[i]) / (polyY[j] - polyY[i]) * (polyX[j] - polyX[i]) < x) { oddNodes = !oddNodes; } } j = i; } trackingData.GeofenceStatus = oddNodes ? "in" : "out"; } db.TrackingData.Add(trackingData); db.SaveChanges(); SendNotifications(trackingData); return("OK"); }