【物联网智能网关-06】GPS定位+星图显示(WinForm库应用实例)

简介: GPS不仅可以双向通信,还可以以二进制格式收发数据,并且可以配置需要发送数据的种类和发送间隔,当然必要的时候,还可以用专门的工具,更新GPS模块的固件。

 在2008年上半年就曾经深入研究过GPS,当时还以为已经相对全面的了解GPS呢,现在重新拾起去研究GPS技术,发现还是差了一大截。最初以为GPS是单向通信,GPS模块按照固定的时间间隔发送文本格式的GPS数据。现在才知道GPS不仅可以双向通信,还可以以二进制格式收发数据,并且可以配置需要发送数据的种类和发送间隔,当然必要的时候,还可以用专门的工具,更新GPS模块的固件。

最初了解GPS,是基于WINCE平台,为写一本书而做,详情请参见《实战WindowsEmbedded CE 6.0—GPS篇》和《我的第一个WINCE驱动》。后来为了便于调试,又把程序移植到Windows Mobile手机上(采用.NET精简框架集的Winform完成,本篇.NET MF界面代码就是基于原先的这套代码,稍作改进而来,而底层接收代码,添加了校验和更全的GPS命令解析),相关博文请参见《GPS NMEA0183协议解析》。
image.png

现在重新研究GPS,是为物联网网关系统封装一个GPS库,最初的时候,购买了几个低价二手的GPS模块,但是却无法定位,在阳台附近无法定位也就算了,但是我直接到空旷的大操场也无法定位,并且没有一个星的信号。所以后来只好又购买一个价钱较高,带有源天线的GPS模块。

这个带外接天线的模块果然不错,信号强度蛮强,但是我在购买的时候犯了一个错误,选型的时候,选择了“4800bps GPRMC数据包输出,不带PPS”,所以就只能输出$GPRMC基本信息了,但是这样星图就无法显示了。

由于技术支持不在线,所以只好先自己想办法解决这个问题了。我想应该有两种思路可以解决这个问题,一是更新固件。但是这种方法显然需要技术支持来提供相应固件,如果自己找相关工具和固件进行烧写,难免会出问题(后来问了技术支持才知道,还得飞一个线,进入烧写模式才行);二是配置信息输出。这种方法最方便,问题是,掉电配置就丢失了,但是这个GPS板子带纽扣电池,所以问题不大。

有了第二种思路,然后网上就进行搜索,果然功夫不负有心人,搜到了如下信息:

NMEA信息输出控制

$PSRF103,00,01,00,01*25

格式说明(Set Serial Port Data Format):

1.png

但是由于NMEA有校验,所以还需要一个专门的工具来设置才行,所以又找到了SiRFLive软件,这个软件很不错,可以方便的调试GPS模块。也许是供电的问题,我这次在阳台测试我原先的GPS模块,居然可以定位成功了。下图便是该GPS模块使用SiRFLive软件进行测试的效果图。

image.png

如果需要配置GPS,直接进入命令发送窗口即可,记得选择NMEA协议。
image.png

修改了相关配置,新购买的GPS果然可以输出星图信息了,在物联网智能网关上的运行效果图如下:
image.png

GPS库相关内容我这里就不细说了,文档里面有详细的说明。我这里说一下,在.NET Micro Framework平台,如何进行Winform界面开发(WinForm for .NET MF 功能一览)。

本实例程序,GPS相关函数一旦执行,会自动把GPS模块的相关参数赋值到GPS类的相关属性中去。界面绘图我们采用重载Form类的OnPaint方法,为了避免闪烁,我们还采用了在Windows编程中常见的技巧,就是重载OnPaintBackground方法,不去绘制背景。

         protected override void OnPaint(PaintEventArgse)

    {

        try

        {

            e.Graphics.Clear(Color.Gray);   //绘制背景

            //--------------------------

            //绘制信噪比图

            DrawSNR(e.Graphics, new Rectangle(2,240 - 80, 320 - 4, 80));

            //绘制星图

            DrawSatellite(e.Graphics, new Rectangle(10,60, 100, 100));

 

            //状态

            e.Graphics.DrawString("状态:" + (GPS.Online ? "已连接 " : "未连接 ") + (GPS.Manage.AnchorState == "A" ? "已定位" : "未定位"), font, sb, 5, 8);

 

            //坐标

            e.Graphics.DrawString("坐标:" + GPS.Manage.ToString("D"),font, sb, 5, 25);

            //pb_Graphics.DrawString("坐标:" + GPS.Manage.Latitude.ToString()+ " " + NMEA.GPS.Longitude.ToString(), font, newSolidBrush(Color.White), 5, 25);

 

            //时间

            e.Graphics.DrawString("时间:" + GPS.Manage.UTCDateTime.ToString(), font, sb,150, 25);

            //-------------------------------

            //卫星数

            e.Graphics.DrawString("卫星:" + GPS.Manage.SatelliteNum.ToString() + " 颗", font, sb, 130, 60);

            //定位状态 0=未定位,1=GPS单点定位固定解,2=差分定位,3=无效PPS,4=RTK固定解,5=RTK浮点解,6=估计值,7=手工输入模式,8=模拟模式

            e.Graphics.DrawString("状态:" + strState[GPS.Manage.AnchorSStateEx], font, sb,130, 75);

            //获取定位模式(A=自动,M=手动)。

            e.Graphics.DrawString("模式:" + (GPS.Manage.AnchorMode == "A" ? "自动" : "手动"), font, sb, 130, 90);

            //定位类型(1=未定位,2=2D定位,3=3D定位)

            e.Graphics.DrawString("类型:" + strType[GPS.Manage.AnchorType], font, sb, 130,105);

            //海拔

            e.Graphics.DrawString("海拔:" + GPS.Manage.Altitude.ToString("F2") + "("+ GPS.Manage.Height.ToString("F2")+ ")", font, sb, 130, 120);

            //速度

            e.Graphics.DrawString("速度:" + GPS.Manage.KSpeed.ToString("F2"), font, sb, 130, 135);

            //方向

            e.Graphics.DrawString("方向:" + GPS.Manage.Track.ToString("F2"), font, sb, 130, 150);

            //信息

            Microsoft.SPOT.Debug.Print(GPS.ErrorMessage);

        }

        catch {}

    }

具体绘制绘制信噪比图的代码如下:

    private void DrawSNR(Graphicse, Rectangle rect)

    {

        Fontfont = new Font("Arial", 9, FontStyle.Regular);

        intFontHeight = 20;

        int SNRHeight= rect.Height - FontHeight;

        intSNRWidth = (rect.Width - FontHeight / 2) / 12;

 

        //绘制信噪比图

        e.DrawLine(newPen(Color.Gray),rect.Left, rect.Top, rect.Right, rect.Top);

        e.DrawLine(newPen(Color.Gray),rect.Left, rect.Top + SNRHeight / 2, rect.Right, rect.Top + SNRHeight / 2);

        e.DrawLine(newPen(Color.Gray),rect.Left, rect.Top + SNRHeight, rect.Right, rect.Top + SNRHeight);

 

        for (int i = 0; i < 12; i++)

        {

            stringstrPRN = GPS.Manage.Satellite[i].PRN.ToString();

            if(strPRN.Length == 1) strPRN = "0"+ strPRN;

            intHeight = (int)(GPS.Manage.Satellite[i].SNR *SNRHeight / 100);

            intfont_h, font_w;

            font.Value.ComputeExtent(strPRN, out font_w, outfont_h);

 

            //星号

            e.DrawString(strPRN, font, new SolidBrush(Color.White), (int)(rect.Left+ FontHeight / 4 + SNRWidth * i), (int)(rect.Top+ SNRHeight + 4));

 

            //信噪比

            e.FillRectangle(new SolidBrush(Color.Blue), new Rectangle(rect.Left + FontHeight / 4 + SNRWidth *i, rect.Top + SNRHeight - Height, font_w, Height));

        }

    }

绘制星图的代码如下:

private voidDrawSatellite(Graphics e, Rectangle rect)

    {

        Fontfont = new Font("Arial", 9, FontStyle.Regular);

 

        int X = rect.Left + rect.Width / 2;

        int Y =rect.Top + rect.Height / 2;

        intSize = (rect.Width > rect.Height ? rect.Height : rect.Width);

        int R =(Size - 12 * 2) / 6;

        int r =8;

 

        e.DrawLine(newPen(Color.Red),X - R * 3 - 12, Y, X + R * 3 + 12, Y);

        e.DrawLine(newPen(Color.Red),X, Y - R * 3 - 12, X, Y + R * 3 + 12);

 

        e.DrawEllipse(newPen(Color.Blue),new Rectangle(X- R, Y - R, R * 2, R * 2));

        e.DrawEllipse(newPen(Color.Blue),new Rectangle(X- R * 2, Y - R * 2, R * 4, R * 4));

        e.DrawEllipse(newPen(Color.Blue),new Rectangle(X- R * 3, Y - R * 3, R * 6, R * 6));

        e.DrawString("N",font, new SolidBrush(Color.White), X + 2, Y - R * 3 - 10);

        e.DrawString("S",font, new SolidBrush(Color.White), X + 2, Y + R * 3 + 2);

        e.DrawString("W",font, new SolidBrush(Color.White), X - R * 3 - 10, Y + 2);

        e.DrawString("E",font, new SolidBrush(Color.White), X + R * 3 + 2, Y + 2);

 

        //绘制卫星位置

        int X0= 0, Y0 = 0, L = 0;

        doubleA1 = 0, A2 = 0;

        StringFormatsFormat = new StringFormat();

        sFormat.Alignment = StringAlignment.Center;

        sFormat.LineAlignment = StringAlignment.Center;

 

        for (int i = 0; i < 12; i++)

        {

            if(GPS.Manage.Satellite[i].PRN > 0)

            {

                A1 =GPS.Manage.Satellite[i].Elevation * Math.PI/ 180;

                A2 =GPS.Manage.Satellite[i].Azimuth * Math.PI /180;

                L = (int)(Math.Cos(A1) * 3 * R);

               X0 = X + (int)(Math.Cos(Math.PI * 5 / 2 - A2) * L);

                Y0 = Y - (int)(Math.Sin(Math.PI * 5 / 2 - A2) * L);

                e.FillEllipse(new SolidBrush(Color.Blue), new Rectangle(X0 - r, Y0 - r, 2 * r, 2 * r));

                e.DrawString(GPS.Manage.Satellite[i].PRN.ToString(),font, new SolidBrush(Color.White), new Rectangle(X0 - r * 2, Y0 - r * 2, 4 * r, 4 * r),sFormat);

            }

        }

 

    }

从以上代码可以看出,在.NET Micro Framework系统中开发WinForm程序,和上位机没有什么区别,上面的代码也基本上也可以在windows桌面.Net程序中直接可以使用。

   

下载地址:http://www.sky-walker.com.cn/MFRelease/library/V42/YFSoft.Hardware.GPS.rar

MF简介:http://blog.csdn.net/yefanqiu/article/details/5711770

MF资料:http://www.sky-walker.com.cn/News.asp?Id=25

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
17天前
|
传感器 物联网 数据挖掘
新技术趋势与应用:物联网与虚拟现实的未来发展###
随着科技的迅猛发展,物联网(IoT)和虚拟现实(VR)已成为引领未来的重要技术趋势。本文旨在探讨这两项新兴技术的发展趋势和应用场景,通过分析当前技术现状、挑战及未来前景,揭示物联网和虚拟现实在各领域的潜在影响和应用价值。研究表明,物联网在智能家居、智慧城市、工业自动化等方面具有广泛的应用前景;而虚拟现实则在游戏娱乐、教育培训、医疗健康等领域展现出巨大的潜力。本文认为,随着技术的不断进步,物联网和虚拟现实将深度融合,为社会经济发展带来新的机遇和挑战。 ###
115 59
|
23天前
|
传感器 物联网 区块链
新技术趋势与应用:探讨新兴技术如区块链、物联网、虚拟现实等的发展趋势和应用场景
在当今科技飞速发展的时代,新兴技术的涌现正在改变我们的生活和工作方式。本文将深入探讨区块链技术、物联网以及虚拟现实等新兴技术的发展趋势和应用场景。我们将从这些技术的本质出发,分析它们的发展现状,并展望未来可能带来的变革。同时,我们也将通过一些简单的代码示例,展示这些技术如何在实际中发挥作用。让我们一起探索这个充满无限可能的科技世界吧!
|
11天前
|
存储 安全 物联网
未来已来:区块链技术在物联网与虚拟现实中的应用
随着科技的不断进步,新兴技术如区块链、物联网(IoT)和虚拟现实(VR)正在逐渐改变我们的生活和工作方式。本文将探讨这些技术的发展趋势和应用场景,以及它们如何相互融合,为我们带来更便捷、安全和沉浸式的体验。
|
7天前
|
供应链 监控 数据可视化
物联网技术在物流与供应链管理中的应用与挑战
本文探讨了物联网技术在物流与供应链管理中的应用,通过实时追踪、信息共享、智能化决策等手段,大幅提升了管理效率和智能化水平。特别介绍了板栗看板作为专业可视化工具,在数据监控、分析及协同作业中的重要作用。未来,随着技术的进一步发展,物流与供应链管理将更加智能高效,但也面临数据安全、标准化等挑战。
|
14天前
|
供应链 物联网 区块链
新技术趋势与应用:探讨新兴技术如区块链、物联网、虚拟现实等的发展趋势和应用场景
本文将探讨新兴技术的发展趋势和应用场景,包括区块链技术、物联网和虚拟现实等。我们将深入了解这些技术的发展现状,以及它们在未来可能带来的变革。同时,我们还将提供一些代码示例,以帮助读者更好地理解这些技术的应用。
|
21天前
|
传感器 监控 物联网
新技术趋势与应用:探讨新兴技术如物联网、虚拟现实等的发展趋势和应用场景###
本文探讨了物联网(IoT)与虚拟现实(VR)这两项新兴技术的快速发展及其在多个领域的应用场景。物联网通过设备互联、数据驱动和应用场景拓展,正在智能家居、智慧城市、工业自动化等方面带来革命性变化。虚拟现实则以其沉浸式体验和不断增强的交互性,在游戏娱乐、教育培训、医疗健康等领域展现出巨大潜力。结合具体案例分析,本文揭示了这些技术如何独立演进又相互融合,共同推动社会进步,并展望未来可能带来的变革。 ###
|
20天前
|
传感器 存储 物联网
物联网:关键技术剖析与应用拓展
物联网(IoT)通过互联网连接各种设备,实现数据交换和远程控制。本书深入解析了物联网的关键技术,如传感器、通信协议、数据处理等,并探讨了其在智慧城市、工业自动化等领域的广泛应用前景。
|
21天前
|
安全 物联网 区块链
未来触手可及:探索区块链技术、物联网与虚拟现实的融合应用
随着技术的飞速发展,区块链、物联网和虚拟现实等新兴技术已不再局限于科技领域的讨论话题,它们正在成为推动社会进步的重要力量。本文将深入探讨这些技术的发展趋势和实际应用,揭示它们如何相互交织,共同塑造一个更加智能和互动的未来世界。通过分析这些技术的独特优势和面临的挑战,我们将展望它们在金融、医疗、教育等领域的潜在影响,并探讨如何利用这些技术解决现实世界的问题。
|
18天前
|
传感器 物联网 区块链
新技术趋势与应用:探讨新兴技术如区块链、物联网、虚拟现实等的发展趋势和应用场景###
随着科技的不断进步,新兴技术如区块链、物联网和虚拟现实正逐步改变我们的生活和工作方式。本文将探讨这些技术的发展趋势和应用场景,旨在提供一个全面的概述,帮助读者理解它们对未来可能产生的影响。 ###
20 0
|
20天前
|
安全 物联网 物联网安全
揭秘区块链技术在物联网(IoT)安全中的革新应用
揭秘区块链技术在物联网(IoT)安全中的革新应用

热门文章

最新文章

相关产品

  • 物联网平台