Example #1
0
        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);
        }
Example #2
0
        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");
        }