Пример #1
0
        public override IMessage Decode(IFrame frame)
        {
            /*
             * Format 0 Default=SORPZAB27GHKLMN*U!
             *
             * S	IMEI
             * O	Operation mode: 1=Sleeping, 2=Periodic, 3=On-line, 4=Motion
             * R	Report type
             * P	Alarm status
             * Z	Geo-fence statu
             * A	1=not fix, 2=2D fix, 3=3D fix
             * B	UTC Date, Time  ddmmyy,hhmmss
             * 2	Longitude  (E or W)dddmm.mmm
             * 7	Latitude  (N or S)ddmm.mmmm
             * G	Altitude  xxxxx.x Unit: meter
             * H	Speed  xxx.xx unit: knots (1.852km/hr)
             * K	Heading  xxx unit: degree
             * L	Number of satellite in use xx
             * M	HDOP  xx.x
             * N	Battery capacity  xx unit: percent capacity
             * U!	Checksum
             *
             * GSr,IMEI,[T,S,]Device_Mode,Report_Type,Alarm_Status,Geofence_status,GPS_Fix,UTC_Date,UTC_Time,Longitude,Latitude,Altitude,Speed,Heading,Number_of_Satellites,HDOP,Battery_capacity*checksum!
             * GSr,011412000845531,2,2,00,,1,020109,022556,+0,+0,135,0.00,0,0,0.0,94#68!
             */

            var buffer = AsString(frame);

            ParserUtils.CheckChecksumOk(buffer, "*", null, ParserUtils.GetCheckSumNmea);
            IMessage result;

            var data = buffer.Split(',');

            switch (data[0])
            {
            case Reporte.DevInfPositionAndStatusReportFormat0:
                result = PositionParse(data).ToPosition(Id, 0).AddStringToSend(Reporte.SrvCmdAck);
                break;

            default:
                result = null;
                if (data[1] != Reporte.DevInfAck)
                {
                    result = new UserMessage(Id, Convert.ToUInt64(data[3]))
                             .AddStringToSend(Reporte.SrvCmdAck);
                }
                break;
            }
            return(result);
        }