在dragonboard 410c上使用python进行GPS报文解析获取位置信息
2017-01-17 14:48
696 查看
dragonboard 410c是一款非常强大的开发板,其自带了GPS,wifi和高性能的图形处理单元,可以方便的实现物联网中的各项功能需求,GPS作为物联网设备中常用的功能,可以方便的实现对设备的定位,是许多物联网应用的基础,这篇blog将向大家简单的介绍如何使用python脚本在dragonboard 410c上解析GPS报文数据。
首先我们需要了解GPS报文格式,这里我们介绍和使用的是目前行业推荐的常用的GPS报文格式,如下:
d.推荐定位信息(RMC)
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh
<1> UTC时间,hhmmss(时分秒)格式
<2> 定位状态,A=有效定位,V=无效定位
<3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
<4> 纬度半球N(北半球)或S(南半球)
<5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
<6> 经度半球E(东经)或W(西经)
<7> 地面速率(000.0~999.9节,前面的0也将被传输)
<8> 地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输)
<9> UTC日期,ddmmyy(日月年)格式
<10> 磁偏角(000.0~180.0度,前面的0也将被传输)
<11> 磁偏角方向,E(东)或W(西)
<12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)
e.地面速度信息(VTG)
$GPVTG,<1>,T,<2>,M,<3>,N,<4>,K,<5>*hh
<1> 以真北为参考基准的地面航向(000~359度,前面的0也将被传输)
<2> 以磁北为参考基准的地面航向(000~359度,前面的0也将被传输)
<3> 地面速率(000.0~999.9节,前面的0也将被传输)
<4> 地面速率(0000.0~1851.8公里/小时,前面的0也将被传输)
<5> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)
看到上面的格式后,结合前面几篇blog中有关的XML文件的解析和python脚本消息的操作,这就非常简单了,我们如果需要读取GPS报文中的位置信息和时间信息,就可以设计下面的函数来完成:
class gpsDataProcessing:
def __init__(self,gpsFrame):
self.gpsData=gpsFrame
#get latitude and longitude date from gpsFrame
# East Longitude and North latitude is abs positive number +
# West longtude and south latitude is negative -
# return (longitude and latitude)
def getPosition(self):
# when gpsFrame is GPRMC
longitude=0.0
latitude=0.0
dataList=self.gpsData.split(',')
utcTime=dataList[1]
if dataList[0]=='$GPRMC'or dataList[0]=='$gprmc' :
if dataList[6]=='E' or dataList[6]=='e':
longitude=float(dataList[5])
elif dataList[6]=='W' or dataList[6]=='w':
longitude=0-float(dataList[5])
else:
return -1
if dataList[4]=='N'or dataList[4]=='n':
latitude=float(dataList[3])
elif dataList[4]=='S'or dataList[4]=='s':
latitude=0-float(dataList[3])
else:
return -1
elif dataList[0]=='$GPGGA'or dataList[0]=='$gpgga' :
if dataList[5]=='E' or dataList[5]=='e':
longitude=float(dataList[4])
elif dataList[5]=='W' or dataList[5]=='w':
longitude=0-float(dataList[4])
else:
return -1
if dataList[3]=='N'or dataList[3]=='n':
latitude=float(dataList[2])
elif dataList[3]=='S'or dataList[3]=='s':
latitude=0-float(dataList[2])
else:
return -1
return(utcTime,longitude,latitude)
在上面的python代码里面,我们构建了一个GPS解析类,但是只是给出了推荐报文格式下的相关的报文的解析函数接口,如果大家需要进一步解析其他报文格式的GPS数据,可以继承或者重写该类,将该类在需要获取GPS数据和解析GPS数据中进行实例化,就可以方便的对GPS数据进行解析,获取定位时间和经纬度位置信息。
首先我们需要了解GPS报文格式,这里我们介绍和使用的是目前行业推荐的常用的GPS报文格式,如下:
d.推荐定位信息(RMC)
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh
<1> UTC时间,hhmmss(时分秒)格式
<2> 定位状态,A=有效定位,V=无效定位
<3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
<4> 纬度半球N(北半球)或S(南半球)
<5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
<6> 经度半球E(东经)或W(西经)
<7> 地面速率(000.0~999.9节,前面的0也将被传输)
<8> 地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输)
<9> UTC日期,ddmmyy(日月年)格式
<10> 磁偏角(000.0~180.0度,前面的0也将被传输)
<11> 磁偏角方向,E(东)或W(西)
<12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)
e.地面速度信息(VTG)
$GPVTG,<1>,T,<2>,M,<3>,N,<4>,K,<5>*hh
<1> 以真北为参考基准的地面航向(000~359度,前面的0也将被传输)
<2> 以磁北为参考基准的地面航向(000~359度,前面的0也将被传输)
<3> 地面速率(000.0~999.9节,前面的0也将被传输)
<4> 地面速率(0000.0~1851.8公里/小时,前面的0也将被传输)
<5> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)
看到上面的格式后,结合前面几篇blog中有关的XML文件的解析和python脚本消息的操作,这就非常简单了,我们如果需要读取GPS报文中的位置信息和时间信息,就可以设计下面的函数来完成:
class gpsDataProcessing:
def __init__(self,gpsFrame):
self.gpsData=gpsFrame
#get latitude and longitude date from gpsFrame
# East Longitude and North latitude is abs positive number +
# West longtude and south latitude is negative -
# return (longitude and latitude)
def getPosition(self):
# when gpsFrame is GPRMC
longitude=0.0
latitude=0.0
dataList=self.gpsData.split(',')
utcTime=dataList[1]
if dataList[0]=='$GPRMC'or dataList[0]=='$gprmc' :
if dataList[6]=='E' or dataList[6]=='e':
longitude=float(dataList[5])
elif dataList[6]=='W' or dataList[6]=='w':
longitude=0-float(dataList[5])
else:
return -1
if dataList[4]=='N'or dataList[4]=='n':
latitude=float(dataList[3])
elif dataList[4]=='S'or dataList[4]=='s':
latitude=0-float(dataList[3])
else:
return -1
elif dataList[0]=='$GPGGA'or dataList[0]=='$gpgga' :
if dataList[5]=='E' or dataList[5]=='e':
longitude=float(dataList[4])
elif dataList[5]=='W' or dataList[5]=='w':
longitude=0-float(dataList[4])
else:
return -1
if dataList[3]=='N'or dataList[3]=='n':
latitude=float(dataList[2])
elif dataList[3]=='S'or dataList[3]=='s':
latitude=0-float(dataList[2])
else:
return -1
return(utcTime,longitude,latitude)
在上面的python代码里面,我们构建了一个GPS解析类,但是只是给出了推荐报文格式下的相关的报文的解析函数接口,如果大家需要进一步解析其他报文格式的GPS数据,可以继承或者重写该类,将该类在需要获取GPS数据和解析GPS数据中进行实例化,就可以方便的对GPS数据进行解析,获取定位时间和经纬度位置信息。
相关文章推荐
- 在python使用selenium获取动态网页信息并用BeautifulSoup进行解析--动态网页爬虫
- 使用Android原生的Api进行GPS定位获取位置信息
- [置顶] 使用Python获取每天最新CVE漏洞信息,通过邮件进行预警发送(二)
- 使用Google Geocoding API来进行关键字搜索,获取相关的地理位置信息
- 基于DragonBoard 410c的家庭智能环保卫士——(6)kobuki位置信息传输及显示
- 2.4 使用ARDUINO控制MC20进行GPS数据的获取和解析
- 在draongboard 410c上使用JSON进行通信交互——JSON报文解析
- [IOS开发记录]ios10下使用Xcode8.2获取gps位置信息(swift3.0)
- JAVASCRIPT 提示信息 主要是使用了获取控件的位置进行定位
- 基于DragonBoard 410c的家庭智能环保卫士——(11)室内栅格地图位置更新Python实现
- 使用天地图进行定位,获取坐标位置及省市等信息
- android中利用GPS获取位置信息的源码分析
- 使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)
- 使用navigator.geolocation来获取用户的地理位置信息
- 使用“PHP”彩蛋进行敏感信息获取
- 树莓派使用python获取GY-85九轴模块信息
- WindowsPhone获取是否进行拨电话信息[使用PhoneCallTask]
- 使用python urllib2获取网页信息
- 根据GPS获得的经纬度来获取地理位置信息
- 【Based Android】Location获取地理位置信息(中)Criteria类的简单使用