寫在前面
- 首先吐槽一下本人的軟件課程設(shè)計--<基于GPS的位置追蹤及地理圍欄>承二,大概是大學以來最難的課設(shè)了查牌,但是還是把它征服了师痕,HAPPY! 本著開源的精神躲舌,課程結(jié)束后會放上代碼鏈接,現(xiàn)在不想進行復習口予,就寫點東西打發(fā)下時間吧娄周。
- 試一下Atom + Markdown Preview Enhanced插件的強勁效果,說不定會放棄Notepad++轉(zhuǎn)向atom陣營沪停。
- 廢話不多說了煤辨,現(xiàn)在開始正文吧
Nmea
- 定義:
由美國國家海洋電子協(xié)會開發(fā)的,目前GPS接收機上使用最廣泛的標準協(xié)議木张,它定義了多種語句众辨,包含了關(guān)于定位結(jié)果、信號狀態(tài)舷礼、工作模式等豐富的信息 - 長相:
$GPGSV,4,1,14,04,00,000,37,10,31,178,34,12,05,035,15,14,64,358,31*7C
$GPGSV,4,2,14,22,20,309,25,26,36,205,36,29,16,099,22,31,56,309,32*70
$GPGSV,4,3,14,32,67,063,30,01,00,000,,03,05,322,,16,05,206,*7F
$GPGSV,4,4,14,18,05,161,,25,41,046,*76
$GLGSV,2,1,08,66,66,326,30,77,30,247,23,76,61,336,29,75,25,030,19*6C
$GLGSV,2,2,08,65,47,153,29,67,13,329,26,85,00,000,,72,02,150,*60
$GPGSA,A,3,04,10,12,14,22,26,29,31,32,,,,1.2,0.9,0.8*3F
$GPVTG,250.2,T,250.2,M,1.3,N,2.4,K,D*22
$GPRMC,093053,A,3031.066590,N,11425.706293,E,1.3,250.2,171217,3.5,W,D*05
$GPGGA,093053,3031.066590,N,11425.706293,E,2,09,0.9,68.0,M,-12.0,M,,*5A
- 格式:
為了提高實用性鹃彻,得到我們需要的信息,故只選擇解析$GPRMC/GNRMC
語句且轨,以下解釋來自nmea_gprmc,$GPRMC
格式如下:
/*
// $GPRMC(Recommended Minimum Specific GPS/TRANSIT Data)
//
// 幀頭 UTC時間 狀態(tài) 緯度 北緯/南緯 經(jīng)度 東經(jīng)/西經(jīng) 速度
// $GPRMC hhmmss.sss A/V ddmm.mmmm N/S dddmm.mmmm E/W 節(jié)
//
// 方位角 UTC日期 磁偏角 磁偏角方向 模式 校驗 回車換行
// 度 ddmmyy 000 - 180 E/W A/D/E/N *hh CR+LF
//
// 格 式: $GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh<CR><LF>
// $GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50
//
// $GPRMC,175622,A,2921.219000,N,11946.287000,E,13.00,348.27,20161006,,,D*4E
//
// 說 明:
// 字段 0:$GPRMC浮声,語句ID,表明該語句為Recommended Minimum Specific GPS/TRANSIT Data(RMC)推薦最小定位信息
// 字段 1:UTC時間旋奢,hhmmss.sss格式
// 字段 2:狀態(tài)泳挥,A=定位,V=未定位
// 字段 3:緯度ddmm.mmmm至朗,度分格式(前導位數(shù)不足則補0)
// 字段 4:緯度N(北緯)或S(南緯)
// 字段 5:經(jīng)度dddmm.mmmm屉符,度分格式(前導位數(shù)不足則補0)
// 字段 6:經(jīng)度E(東經(jīng))或W(西經(jīng))
// 字段 7:速度,節(jié)锹引,Knots(一節(jié)也是1.852千米/小時)
// 字段 8:方位角矗钟,度(二維方向指向,相當于二維羅盤)
// 字段 9:UTC日期嫌变,DDMMYY格式
// 字段10:磁偏角吨艇,(000 - 180)度(前導位數(shù)不足則補0)
// 字段11:磁偏角方向,E=東腾啥,W=西
// 字段12:模式东涡,A=自動,D=差分倘待,E=估測疮跑,N=數(shù)據(jù)無效(3.0協(xié)議內(nèi)容)
// 字段13:校驗值
// NMEA Decoding here
// Wait for gps data, want RMC sentence:
//$GPRMC,230046,A,3759.8006,N,12205.4429,W,0.0,190.3,260702,15.1,E,A*3C
// | | / | / | |
//$GPRMC,233834,A,3759.842,N,12205.440,W,000.0,173.7,200602,015.8,E*63
// | | | | | | | | |--checksum
// | | | | | | | |- Magnetic Deviation?
// | | | | | | |- course over ground
// | | | | | |- speed over ground
// | | | | |--Lon E/W
// | | | |-- Lon 122' 5.44"
// | | |-- Lat N/S
// | |-- Lat 37' 59.842"
// |-- A=Good, V=Bad
*/
NMEA解析
以下代碼來自nmea_gprmc,無比感謝這位老哥在我最需要的時候送了一波溫暖凸舵,感謝祖娘!大概這就是開源的魅力所在吧,不要忘了給人家點個贊啊奄。
- 數(shù)據(jù)格式,自定義結(jié)構(gòu)體存著,常用信息如下
typedef struct {
double rcv_time; //時間
char status; //狀態(tài)
double lat; //緯度
char lat_direct; //北緯 or 南緯
double lon; //經(jīng)度
char lon_direct; //東經(jīng) or 西經(jīng)
double speed; //速度
double cog; //方位角
int date; //日期
double mag_variation; //磁偏角
char mag_var_direct; //磁偏角方向
char mode; //校驗類型
int chksum; //校驗和
} gprmc_format;
- 解析代碼
結(jié)構(gòu)還是很清晰的渐苏,閱讀量并不大掀潮,自己去github上讀源碼吧,然后根據(jù)自己的需求修改 -
效果
這是我自己搭的UI,當然你自己也可以設(shè)計一些更騷氣的對吧整以。