GPS資料包解析--android端
首先講一下應用場景:
手機+OTG線+USB轉OTG+帶USB線的GPS定位外設
獲取資料很簡單,通過手機APP自動從OTG口自動讀取GPS的定位資訊,獲取到的經緯度不能對應到百度谷歌地圖上,一開始認為是不是自己程式碼寫的有問題,拿到的資料流被丟包亂碼什麼的過濾了,其實不然。拿到的資料是GPS外設自動返回的沒問題。問題就在與GPS定位資訊在各大地圖上使用時加密處理了 ,要按指定的演算法才能使用,具體為什麼被加密,可以去百度,也能想來,安全唄。好了直接上內容,如下:
GPS上電後,每隔一定的時間就會返回一定格式的資料,資料格式為:
$資訊型別,x,x,x,x,x,x,x,x,x,x,x,x,x
每行開頭的字元都是‘$’,接著是資訊型別,後面是資料,以逗號分隔開。一行完整的資料如下:
$GPRMC,080655.00,A,4546.40891,N,12639.65641,E,1.045,328.42,170809,,,A*60
資訊型別為:
GPGSV:可見衛星資訊
GPGLL:地理定位資訊
GPRMC:推薦最小定位資訊
GPVTG:地面速度資訊
GPGGA:GPS定位資訊
GPGSA:當前衛星資訊
這裡我們只解析GPRMC和GPGGA的資訊
GPRMC資料詳解:
$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=資料無效)
解析內容:
1. 時間,這個是格林威治時間,是世界時間(UTC),我們需要把它轉換成北京時間(BTC),BTC和UTC差了8個小時,要在這個時間基礎上加8個小時。
2. 定位狀態,在接收到有效資料前,這個位是‘V’,後面的資料都為空,接到有效資料後,這個位是‘A’,後面才開始有資料。
3. 緯度,我們需要把它轉換成度分秒的格式,計算方法:
如接收到的緯度是:4546.40891
4546.40891 / 100 = 45.4640891 可以直接讀出45度
4546.40891–45 * 100 = 46.40891 可以直接讀出46分
46.40891–46 = 0.40891 * 60 = 24.5346 讀出24秒
所以緯度是:45度46分24秒。
1. 南北緯,這個位有兩種值‘N’(北緯)和‘S’(南緯)
2. 經度的計算方法和緯度的計算方法一樣
3. 東西經,這個位有兩種值‘E’(東經)和‘W’(西經)
4. 速率,這個速率值是 海里/時,單位是節,要把它轉換成千米/時,根據:1海里 = 1.85公里,把得到的速率乘以1.85。
5. 航向,指的是偏離正北的角度
6. 日期,這個日期是準確的,不需要轉換
GPGGA資料詳解:
$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*xx<CR><LF>
$GPGGA:起始引導符及語句格式說明(本句為GPS定位資料);
<1> UTC時間,格式為hhmmss.sss;
<2> 緯度,格式為ddmm.mmmm(第一位是零也將傳送);
<3> 緯度半球,N或S(北緯或南緯)
<4> 經度,格式為dddmm.mmmm(第一位零也將傳送);
<5> 經度半球,E或W(東經或西經)
<6> 定位質量指示,0=定位無效,1=定位有效;
<7> 使用衛星數量,從00到12(第一個零也將傳送)
<8> 水平精確度,0.5到99.9
<9> 天線離海平面的高度,-9999.9到9999.9米 M 指單位米
<10> 大地水準面高度,-9999.9到9999.9米 M 指單位米
<11> 差分GPS資料期限(RTCM SC-104),最後設立RTCM傳送的秒數量
<12> 差分參考基站標號,從0000到1023(首位0也將傳送)。
解析內容:
第9,10個欄位,海平面高度和大地水準面高度,單位是米
備註:GPS->2604.22321 = 26度04分13.3926秒 (0.22321*60秒) = 26.070386833度 (26+04/60 + 13.3926/3600)
http://www.csgsm.com/?view-110.html