GPS模拟器算法(C#)

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace VirtualGPS
{
    public class GPS
    {
        private System.Windows.Forms.Timer timer;  //定时器, 模拟GPS时发送,周期间隔1S
        private System.IO.Ports.SerialPort serialPort;  //串口

        private ArrayList buf = new ArrayList();


        public GPS(string portName, int baudRate)
        {
            timer = new System.Windows.Forms.Timer();
            this.timer.Tick += new System.EventHandler(this.timer_Tick);
            serialPort=new System.IO.Ports.SerialPort(portName,baudRate,System.IO.Ports.Parity.None);
            timer.Interval = 1000; //GPS 发送周期

            DefData = new gpsEN("0", "0");
            Sdata = DefData;//待发送数据指向 缺省的数据
    
        }

        public bool StartGPS()
        {
            //启用VirtualGPS
            try
            {
                serialPort.Open();
                timer.Enabled = true; //启用定时器
                return true;

            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("连接状态 :Error" + ex.Message);
                return false;
            }
        }

        public bool StopGPS()
        {
            //关闭VirtualGPS
            try
            {
                serialPort.Close();
                timer.Enabled = false; //关闭定时器
                return true;

            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("连接状态 :Error" + ex.Message);
                return false;
            }
        }

        private gpsEN DefData; //缺省的GPS数据
        private gpsEN Sdata; //发送的GPS数据

        //GPS结构体
        private struct gpsEN
        {
            public gpsEN(string E, string N)
            {
                this.E = E;
                this.N = N;
                this.GpsData = GetGpsData(E, N);
            }
            public void copy(gpsEN g)
            {
                this.E = g.E;
                this.N = g.N;
                this.GpsData = g.GpsData;
            }
          public  string E;
          public  string N;
          public  string GpsData;
        };

     

      
        private void timer_Tick(object sender, EventArgs e)
        {
            //GPS数据定时发送
            //serialPort.Write(Encoding.ASCII.GetBytes(string.Format("AT+CMGR={0}/r", n)), 0, Encoding.ASCII.GetBytes(string.Format("AT+CMGR={0}/r", n)).Length);
            if (buf.Count > 0)
            {
               // gpsEN g = (gpsEN)buf[0];
           
               // Sdata.E = g.E;
               // Sdata.N = g.N;
               // Sdata.GpsData = g.GpsData;
                Sdata.copy((gpsEN)buf[0]);

                buf.RemoveAt(0);
            }
            //else
            //{
                serialPort.WriteLine(Sdata.GpsData); //发送上一次的数据,GPS首次启动就发送默认的数据
            //}
            Console.WriteLine("E="+Sdata.E + " N=" + Sdata.N + " GPS=" + Sdata.GpsData);


        }

 

        /// <summary>
        /// 向VirtualGPS 写入数据(E经度 N纬度)
        /// </summary>
        /// <param name="E">经度</param>
        /// <param name="N">纬度</param>
        public void WriteGpsEN(string E, string N)
        {
            gpsEN g = new gpsEN(E, N);

            buf.Add(g); //写入GPS数据进入缓冲区
        }

        /// <summary>
        /// 根据经纬度信息,转换经纬度信息为地图所需经纬度信息
        /// </summary>
        /// <param name="placeInfo">palaceInfo可为经度,或者是纬度值</param>
        /// <returns>返回一个地图gps数据</returns>
        private static decimal convertJWD(decimal placeInfo)
        {
          
            decimal tt;
            int bb = (int)placeInfo;

            decimal m = placeInfo - bb;//--取出整数
            tt = bb * 100 + m * 60;

            return tt;
        }
        /// <summary>
        /// 获取gps数据
        /// </summary>
        /// <param name="E">经度</param>
        /// <param name="N">纬度</param>
        /// <returns>返回一个gps数据包</returns>
        public static string GetGpsData(string E, string N)
        {
            string strGpsInfo = null;

            decimal e;
            decimal n;

            e = convertJWD(decimal.Parse(E));
            n = convertJWD(decimal.Parse(N));

            strGpsInfo = "$GPGGA,095013.000," + e + ",N," + n + ",E,1,07,04.7,00064.4,M,07.2,M,,*6E/n";
            strGpsInfo += "$GPGSA,A,2,14,30,22,,05,06,18,16,,,,,04.8,04.7,*19/n";
            strGpsInfo += "$GPGSV,2,1,08,14,67,025,75,30,53,051,75,22,43,182,79,25,45,295,*7A/n";
            strGpsInfo += "$GPGSV,2,2,08,05,17,042,75,06,22,118,65,18,12,162,64,16,10,210,75*71/n";
            strGpsInfo += "$GPRMC,095013.000,A," + e + ",N," + n + ",E,0.00,0.00,150807,004.3,W*73";

            return strGpsInfo;
        }

 

    }
}
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
全套源代码,请咨询 ny_mrzhang@hotmail.com QQ:97302751 以前的协议是这样的。。。车载设备发往网络中心位置数据-80[功能] 车载设备向网络中心发送当前位置信息[去向] 网络中心[数据入库] 网络中心收到数据后将数据保存到动态位置数据表中 (DynData)[格式] 29 29 80 len1 len2 d3d2d1d0 yymmddhhmmss jjjj wwww ssff st lichen1 lichen2 lichen3 st1st2st3 st4 v1v2v3v4v5v6v7v8 len1 len2: 包长d3d2d1d0: 伪IP,终端ID号yymmddhhmmss:年月日时分秒日期表示范围:年份,后两位 ;月份,1-12;日期,1-31时间表示范围:小时,00——23;分钟,00——59;秒,00——59时、分、秒均采用压缩BCD编码。[例如]: 10点23分15秒表示为: 10H,23H,15Hjjjj:经度经度表示范围:000度00.000分——179度59.999分;采用压缩BCD编码,但最高位是符号位。“正”表示“东经”,“负”表示“西经”;“分”的单位是:千分之一分。[例如]: 西经130度45.608分表示为:(注意:1度=60分) 13H,04H,56H,08Hwwww:纬度纬度表示范围:00度00.000分——89度59.999分;采用压缩BCD编码,但最高位是符号位。“正”表示“北纬”,“负”表示“南纬”;“分”的单位是:千分之一分。[例如]: 南纬30度37.901分表示为: 3H,03H,79H,01Hssff:速度方向速度表示方法:表示范围:0——9999公里/小时采用压缩BCD编码。[例如]: 120公里/小时表示为: 01H,20H方位表示方法:表示范围:000——359度采用压缩BCD编码,正北为0度,顺时针方向计数。单位为:度。[例如]: 154度表示为: 01H,54Hst:定位,天线,电源状态定位状态由单字节组成,各位含义如下: D7 D6 D5 D4 D3 D2 D1 D0D7 定位标志0 GPS未定位1 GPS已定位D6 D5 1 1 GPS正常1 0 GPS天线短路0 1 GPS天线开路0 0 GPS天线故障D4 D3 电源状态1 1 正常1 0 主电源掉电0 1 主电源过高或过低 D2 D1 D0 保留 lichen1 lichen2 lichen3:里程数 HEX 格式:0——0XFFFFFF (0——16777215)米st1st2st3 st4:车辆状态现在协议格式:*HQ,000,S12,130305,60# 上传短信*HQ,000,S4,121212,0F,FF# 速度显示*HQ,000,S4,121212,9F,FF# 断油断电
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值