Exemplo n.º 1
0
        /// <summary>
        /// 解析生成 位置信息 消息
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public JT808_PackageData.LocationInfo ToLocationInfoMsg(byte[] data)
        {
            JT808_PackageData.LocationInfo locationInfo = new JT808_PackageData.LocationInfo();

            //基本信息
            locationInfo.alc = data[6].ToString("X2") + data[7].ToString("X2") + data[8].ToString("X2") + data[9].ToString("X2");     //报警标志 4位
            locationInfo.bst = data[10].ToString("X2") + data[11].ToString("X2") + data[12].ToString("X2") + data[13].ToString("X2"); //状态 4位
            locationInfo.lon = (double)ExplainUtils.ParseIntFromBytes(data, 14, 4) / 1000000;                                         //经度 4位 除以10的6次方 转为度
            locationInfo.lat = (double)ExplainUtils.ParseIntFromBytes(data, 18, 4) / 1000000;                                         //纬度 4位 除以10的6次方 转为度
            locationInfo.hgt = ExplainUtils.ParseIntFromBytes(data, 22, 2);                                                           //高程 2位
            locationInfo.spd = (float)ExplainUtils.ParseIntFromBytes(data, 24, 2) / 10;                                               //速度 2位 转为十进制 除以10即62.2KM/H
            locationInfo.agl = ExplainUtils.ParseIntFromBytes(data, 26, 2);                                                           //方向 2位

            string gtm = string.Format("{0}-{1}-{2} {3}:{4}:{5}", ExplainUtils.ParseBcdStringFromBytes(data, 28, 1),
                                       ExplainUtils.ParseBcdStringFromBytes(data, 29, 1),
                                       ExplainUtils.ParseBcdStringFromBytes(data, 30, 1),
                                       ExplainUtils.ParseBcdStringFromBytes(data, 31, 1),
                                       ExplainUtils.ParseBcdStringFromBytes(data, 32, 1),
                                       ExplainUtils.ParseBcdStringFromBytes(data, 33, 1));

            try
            {
                locationInfo.gtm = DateTime.Parse(gtm);
                //locationInfo.gtm = DateTime.Parse("09-01-2017 12:15:12");
            }
            catch (Exception e)
            {
                logger.log("error happens when parsing gtm! " + e.Message);
            }


            //扩展信息
            locationInfo.mlg  = 0;  // 里程  0x01 4
            locationInfo.oil  = 0;  // 油量  0x02 2
            locationInfo.spd2 = 0;  // 记录仪速度 0x03 2
            locationInfo.est  = ""; //扩展车辆信号状态位 0x25  4
            locationInfo.io   = ""; // IO状态位 0x2A 2
            locationInfo.ad1  = ""; // 模拟量 0x2B 4
            locationInfo.yte  = 0;  // 无线通信网络信号强度 0x30 1
            locationInfo.gnss = 0;  // 定位卫星数 0x31 1
            locationInfo.ecu  = ""; // ECU透传数据 0xE0 n

            for (int i = 34; i < data.Length; i++)
            {
                if (data[i] == 0x01)// 里程  0x01 4
                {
                    locationInfo.mlg = (float)ExplainUtils.ParseIntFromBytes(data, i + 2, data[i + 1]) / 10;
                }
                else if (data[i] == 0x02)// 油量  0x02 2
                {
                    locationInfo.oil = (float)ExplainUtils.ParseIntFromBytes(data, i + 2, data[i + 1]) / 10;
                }
                else if (data[i] == 0x03)// 记录仪速度 0x03 2
                {
                    locationInfo.spd2 = ExplainUtils.ParseIntFromBytes(data, i + 2, data[i + 1]);
                }
                else if (data[i] == 0x25)//扩展车辆信号状态位 0x25  4
                {
                    for (int ii = i + 2; ii < i + 2 + data[i + 1]; ii++)
                    {
                        locationInfo.est = locationInfo.est + data[ii].ToString("X2");
                    }
                }
                else if (data[i] == 0x2a)// IO状态位 0x2A 2
                {
                    for (int ii = i + 2; ii < i + 2 + data[i + 1]; ii++)
                    {
                        locationInfo.io = locationInfo.io + data[ii].ToString("X2");
                    }
                }
                else if (data[i] == 0x2b)// 模拟量 0x2B 4
                {
                    for (int ii = i + 2; ii < i + 2 + data[i + 1]; ii++)
                    {
                        locationInfo.ad1 = locationInfo.ad1 + data[ii].ToString("X2");
                    }
                }
                else if (data[i] == 0x30)// 无线通信网络信号强度 0x30 1
                {
                    locationInfo.yte = ExplainUtils.ParseIntFromBytes(data, i + 2, data[i + 1]);
                }
                else if (data[i] == 0x31)// 定位卫星数 0x31 1
                {
                    locationInfo.gnss = ExplainUtils.ParseIntFromBytes(data, i + 2, data[i + 1]);
                }
                else if (data[i] == 0xE0)// ECU透传数据 0xE0 n
                {
                    for (int ii = i + 2; ii < i + 2 + data[i + 1]; ii++)
                    {
                        locationInfo.ecu = locationInfo.ecu + data[ii].ToString("X2");
                    }
                }
                else //其它字段,先过滤
                {
                }

                i = i + 1 + data[i + 1];
            }
            return(locationInfo);
        }
Exemplo n.º 2
0
        /// <summary>
        /// 解析生成 位置信息 消息
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public JT808_PackageData.LocationInfo ToLocationInfoMsg(byte[] data)
        {
            JT808_PackageData.LocationInfo locationInfo = new JT808_PackageData.LocationInfo();

            //基本信息
            locationInfo.alc = data[0].ToString("X2") + data[1].ToString("X2") + data[2].ToString("X2") + data[3].ToString("X2"); //报警标志 4位
            locationInfo.bst = data[4].ToString("X2") + data[5].ToString("X2") + data[6].ToString("X2") + data[7].ToString("X2"); //状态 4位
            locationInfo.lat = (double)ExplainUtils.ParseIntFromBytes(data, 8, 4) / 1000000;                                      //纬度 4位 除以10的6次方 转为度
            locationInfo.lon = (double)ExplainUtils.ParseIntFromBytes(data, 12, 4) / 1000000;                                     //经度 4位 除以10的6次方 转为度
            locationInfo.hgt = ExplainUtils.ParseIntFromBytes(data, 16, 2);                                                       //高程 2位
            locationInfo.spd = (float)ExplainUtils.ParseIntFromBytes(data, 18, 2) / 10;                                           //速度 2位 转为十进制 除以10即62.2KM/H
            locationInfo.agl = ExplainUtils.ParseIntFromBytes(data, 20, 2);                                                       //方向 2位

            string gtm = string.Format("{0}-{1}-{2} {3}:{4}:{5}", ExplainUtils.ParseBcdStringFromBytes(data, 22, 1),
                                       ExplainUtils.ParseBcdStringFromBytes(data, 23, 1),
                                       ExplainUtils.ParseBcdStringFromBytes(data, 24, 1),
                                       ExplainUtils.ParseBcdStringFromBytes(data, 25, 1),
                                       ExplainUtils.ParseBcdStringFromBytes(data, 26, 1),
                                       ExplainUtils.ParseBcdStringFromBytes(data, 27, 1));

            locationInfo.gtm = DateTime.Parse(gtm);//时间

            //扩展信息
            locationInfo.mlg  = 0;  // 里程  0x01 4
            locationInfo.oil  = 0;  // 油量  0x02 2
            locationInfo.spd2 = 0;  // 记录仪速度 0x03 2
            locationInfo.est  = ""; //扩展车辆信号状态位 0x25  4
            locationInfo.io   = ""; // IO状态位 0x2A 2
            locationInfo.ad1  = ""; // 模拟量 0x2B 4
            locationInfo.yte  = 0;  // 无线通信网络信号强度 0x30 1
            locationInfo.gnss = 0;  // 定位卫星数 0x31 1
            locationInfo.ecu  = ""; // ECU透传数据 0xE0 n

            for (int i = 28; i < data.Length; i++)
            {
                if (data[i] == 0x01)// 里程  0x01 4
                {
                    locationInfo.mlg = (float)ExplainUtils.ParseIntFromBytes(data, i + 2, data[i + 1]) / 10;
                }
                else if (data[i] == 0x02)// 油量  0x02 2
                {
                    locationInfo.oil = (float)ExplainUtils.ParseIntFromBytes(data, i + 2, data[i + 1]) / 10;
                }
                else if (data[i] == 0x03)// 记录仪速度 0x03 2
                {
                    locationInfo.spd2 = ExplainUtils.ParseIntFromBytes(data, i + 2, data[i + 1]);
                }
                else if (data[i] == 0x25)//扩展车辆信号状态位 0x25  4
                {
                    for (int ii = i + 2; ii < i + 2 + data[i + 1]; ii++)
                    {
                        locationInfo.est = locationInfo.est + data[ii].ToString("X2");
                    }
                }
                else if (data[i] == 0x2a)// IO状态位 0x2A 2
                {
                    for (int ii = i + 2; ii < i + 2 + data[i + 1]; ii++)
                    {
                        locationInfo.io = locationInfo.io + data[ii].ToString("X2");
                    }
                }
                else if (data[i] == 0x2b)// 模拟量 0x2B 4
                {
                    for (int ii = i + 2; ii < i + 2 + data[i + 1]; ii++)
                    {
                        locationInfo.ad1 = locationInfo.ad1 + data[ii].ToString("X2");
                    }
                }
                else if (data[i] == 0x30)// 无线通信网络信号强度 0x30 1
                {
                    locationInfo.yte = ExplainUtils.ParseIntFromBytes(data, i + 2, data[i + 1]);
                }
                else if (data[i] == 0x31)// 定位卫星数 0x31 1
                {
                    locationInfo.gnss = ExplainUtils.ParseIntFromBytes(data, i + 2, data[i + 1]);
                }
                else if (data[i] == 0xE0)// ECU透传数据 0xE0 n
                {
                    for (int ii = i + 2; ii < i + 2 + data[i + 1]; ii++)
                    {
                        locationInfo.ecu = locationInfo.ecu + data[ii].ToString("X2");
                    }
                }
                else //其它字段,先过滤
                {
                }

                i = i + 1 + data[i + 1];
            }
            return(locationInfo);
        }