kiast-drone-collector/pkg/drone/protocol.go
2019-08-09 14:11:51 +09:00

116 lines
2.9 KiB
Go

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
}