package drone import ( "fmt" "strconv" "strings" "github.com/vjeantet/jodaTime" ) type droneGPS struct { Time int64 // 위도 Latitude float64 // 경도 Longitude float64 // 고도 Altitude float32 // 속도 Speed int32 // 방향 Direction int16 // A or V Fixed string // LTE 통신 상태 LTEStatus string // EMM 오류 정보 EMMError string // ESM 오류 정보 ESMError string // 신호세기 SignalStrength int32 // 위성 갯수 SatelliteCount int32 // 위성 신호세기 ex) 17-44,19-43,6-42,28-41 SatelliteSignalStrength string } // fixed // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, // $$GPS, 년월일, 시분초, 위도, 경도, 고도, 속도, 방향, A, LTE 통신 상태, EMM 오류 정보, ESM 오류 정보, 신호세기, 위성 갯수, 위성 ID-신호세기, 위성 ID-신호세기, 위성 ID-신호세기, 위성 ID-신호세기 // $$GPS,20190718,050519,37396586,126968913,798,0,0,A,2,255,255,-53,13,17-44,19-43,6-42,28-41 // unfixed // $$GPS,,,,,,,, V, LTE 통신 상태, EMM 오류 정보, ESM 오류 정보, 신호세기, 위성 갯수, 위성 ID-신호세기, 위성 ID-신호세기, 위성 ID-신호세기, 위성 ID-신호세기 // $$GPS,,,,,,,,V,2,255,255,-53,4,17-44,19-42,6-40,28-40 func parseProtocol(buf []byte) (*droneGPS, error) { data := string(buf) items := strings.Split(data, ",") gps := &droneGPS{ // A or V Fixed: items[8], // LTE 통신 상태 LTEStatus: items[9], // EMM 오류 정보 EMMError: items[10], // ESM 오류 정보 ESMError: items[11], } gps.SatelliteSignalStrength = strings.Join(items[12:], ",") signalStrength, err := strconv.ParseInt(items[12], 10, 32) if nil != err { return nil, err } gps.SignalStrength = int32(signalStrength) satelliteCount, err := strconv.ParseInt(items[13], 10, 32) if nil != err { return nil, err } gps.SatelliteCount = int32(satelliteCount) if "A" == gps.Fixed { dateTime, err := jodaTime.Parse("YYYYMMddHHmmss", fmt.Sprintf("%s%s", items[1], items[2])) if nil != err { return nil, err } gps.Time = dateTime.Unix() latitude, err := strconv.ParseFloat(fmt.Sprintf("%s.%s", items[3][0:len(items[3])-6], items[3][len(items[3])-6:]), 64) if nil != err { return nil, err } gps.Latitude = latitude longitude, err := strconv.ParseFloat(fmt.Sprintf("%s.%s", items[4][0:len(items[4])-6], items[4][len(items[4])-6:]), 64) if nil != err { return nil, err } gps.Longitude = longitude altitude, err := strconv.ParseFloat(fmt.Sprintf("%s.%s", items[5][0:len(items[5])-1], items[5][len(items[5])-1:]), 32) if nil != err { return nil, err } gps.Altitude = float32(altitude) speed, err := strconv.ParseInt(items[6], 10, 32) if nil != err { return nil, err } gps.Speed = int32(speed) direction, err := strconv.ParseInt(items[7], 10, 16) if nil != err { return nil, err } gps.Direction = int16(direction) } return gps, nil }