学习日志-0004:python 模拟 GPS, $GPRMC & $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> 模式指示(仅NMEA01833.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)

"$GPRMC," + "060949.000" +",A,3150.7815,N,11711.9239,E,2.87,314.13," + "050314" + ",,,D*69<CR><LF>"

 

"""
$GNRMC,092846.400,A,3029.7317,N,10404.1784,E,000.0,183.8,070417,,,A*73

$GNRMC,
092846.400, // UTC时间,hhmmss.sss(时分秒.毫秒)格式
A, // 定位状态,A=有效定位,V=无效定位
3029.7317,N, // 纬度
10404.1784,E, // 经度
000.0, // 地面速率
183.8, // 地面航向
070417, // UTC日期
, // 磁俯角
, // 磁方向角
A*73 // 模式指示
"""

 

#coding:utf-8
#!/usr/bin/python3
import sys,os
import re
import logging
import datetime

#add path for import module
filePath = os.getcwd()
sys.path.append(filePath)

from Com_Utilities.FlexConfig import ResourcesConfig as flexConfig
from Com_Utilities.Uart import CSerial as Uart
from Com_Utilities.ResourceHandler import resourceHandler as Resource

__all__ = ["GPS_Fake"]

"""
 GPS data packet format:

数据详解:$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> 模式指示(仅NMEA01833.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)

 "$GPRMC," + "060949.000" +",A,3150.7815,N,11711.9239,E,2.87,314.13," + "050314" + ",,,D*69<CR><LF>"

  time format: 080650.000  &     08:06:50.000   
  date format: 311219      &     2019/12/31  
"""

"""
$GNRMC,092846.400,A,3029.7317,N,10404.1784,E,000.0,183.8,070417,,,A*73

$GNRMC,
092846.400,    // UTC时间,hhmmss.sss(时分秒.毫秒)格式
A,             // 定位状态,A=有效定位,V=无效定位
3029.7317,N,   // 纬度
10404.1784,E,  // 经度
000.0,         // 地面速率
183.8,         // 地面航向
070417,        // UTC日期
,              // 磁俯角
,              // 磁方向角
A*73           // 模式指示
"""

class GPS_Fake(Uart):
    def __init__(self, userName, userID):
        self.resource = Resource();

        # serial port message: [0]-port, [1]-baud
        serialportMsg = self.resource.get_Serial_Or_IP(userName,userID)

        Uart.__init__(self, serialportMsg[0], int(serialportMsg[1]), 10)
        self.Serial_Create()
        
    def  __GPS_CheckSum__(self, string ):
        checksum = 0
        val = bytes(string)
        for index in range(len(val)):
            checksum ^= val[index]

        return checksum
    
    #time format: 080650.000  &     08:06:50.000   
    def GPS_CurrentFormatTime(self):
        now_time = datetime.datetime.now()
        strTime = now_time.strftime("%H%M%S.%f")   
        str = strTime.split('.')
        micSecond = str[1][0:3]
        nowTime = str[0] + "." + micSecond

        return nowTime

    #time format: 260419  &   2019/04/26
    def GPS_CurrentFormatDate(self):
        now_time = datetime.datetime.now()
        covYear = now_time.year-2000   
        nowDate = "%02d%02d%02d" %(now_time.day,now_time.month,covYear)
    
        return nowDate

    def GPRMC_SendMessage(self, time, date):
        gpsMessage = "GPRMC," + time + ",A,3150.7815,N,12123.5344,E,2.87,314.13," + date + ",,,D"
        checkSum = self.__GPS_CheckSum__(gpsMessage)
        Message = "$" + gpsMessage + "*" + str(checkSum, encoding = "utf8")+ "\r\n"
        self.Serial_WriteString(Message)

    def GPRMC_SendMessage(self, time, date, latitude, longitude):
        gpsMessage = "GPRMC," + time + ",A," + latitude +",N,"+ longitude + ",E,2.87,314.13," + date + ",,,D"
        checkSum = self.__GPS_CheckSum__(gpsMessage)
        Message = "$" + gpsMessage + "*" + str(checkSum, encoding = "utf8")+ "\r\n"
        self.Serial_WriteString(Message)

    def GNRMC_SendMessage(self, time, date):
        gpsMessage = "GNRMC," + time + ",A,3150.7815,N,12123.5344,E,2.87,314.13," + date + ",,,A"
        checkSum = self.__GPS_CheckSum__(gpsMessage)
        Message = "$" + gpsMessage + "*" + str(checkSum, encoding = "utf8")+ "\r\n"
        self.Serial_WriteString(Message)

    def GNRMC_SendMessage(self, time, date, latitude, longitude):
        gpsMessage = "GNRMC," + time + ",A," + latitude +",N,"+ longitude + ",E,2.87,314.13," + date + ",,,A"
        checkSum = self.__GPS_CheckSum__(gpsMessage)
        Message = "$" + gpsMessage + "*" + str(checkSum, encoding = "utf8")+ "\r\n"
        self.Serial_WriteString(Message)

    def GPS_Stop(self):
        self.Serial_Close()

#test example
if __name__ == '__main__':
    gps_test = GPS_Fake()
    gps_test.Serial_Create()

 

posted @ 2019-05-18 11:53  mftang2018  阅读(1612)  评论(1编辑  收藏  举报