2019-08-06 00:54:55 +00:00
|
|
|
package drone
|
|
|
|
|
2019-08-09 05:06:04 +00:00
|
|
|
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 통신 상태
|
2019-08-06 00:54:55 +00:00
|
|
|
LTEStatus string
|
2019-08-09 05:06:04 +00:00
|
|
|
// 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 {
|
2019-08-09 05:11:51 +00:00
|
|
|
dateTime, err := jodaTime.Parse("YYYYMMddHHmmss", fmt.Sprintf("%s%s", items[1], items[2]))
|
2019-08-09 05:06:04 +00:00
|
|
|
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
|
2019-08-06 00:54:55 +00:00
|
|
|
}
|