From a8f1e467857556c331f28f0b7a10f2a6fa6f2e26 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Fri, 11 Aug 2023 18:56:41 +0100 Subject: [PATCH] Add pre-init code --- data/data.go | 8 ++++ traccar/generic.go | 23 +++++++++++ traccar/positions.go | 96 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 127 insertions(+) create mode 100644 data/data.go create mode 100644 traccar/generic.go create mode 100644 traccar/positions.go diff --git a/data/data.go b/data/data.go new file mode 100644 index 0000000..cf33d61 --- /dev/null +++ b/data/data.go @@ -0,0 +1,8 @@ +package data + +type LocationData struct { + Latitude float64 + Longitude float64 + Speed uint32 + Altitude float64 +} diff --git a/traccar/generic.go b/traccar/generic.go new file mode 100644 index 0000000..6ffc61e --- /dev/null +++ b/traccar/generic.go @@ -0,0 +1,23 @@ +package traccar + +import "git.fjla.uk/fred.boniface/map-dots/data" + +func MapToPositionData(positions []Positions) []data.LocationData { + var locationDataList []data.LocationData + + for _, pos := range positions { + speedInMph := int(pos.Speed * 1.15078) + // Unsure of the accuracy of the speed data + + locationData := data.LocationData{ + Latitude: pos.Latitude, + Longitude: pos.Longitude, + Speed: uint32(speedInMph), + Altitude: pos.Altitude, + } + + locationDataList = append(locationDataList, locationData) + } + + return locationDataList +} diff --git a/traccar/positions.go b/traccar/positions.go new file mode 100644 index 0000000..01ccf86 --- /dev/null +++ b/traccar/positions.go @@ -0,0 +1,96 @@ +package traccar + +import ( + "encoding/json" + "io" + "net/http" + "net/url" + "os" + + "git.fjla.uk/fred.boniface/map-dots/data" +) + +var user string = os.Getenv("TRACCAR_USER") +var pass string = os.Getenv("TRACCAR_PASS") + +var params = map[string]string{ + "deviceId": "2", + "from": "2023-07-10T20:00:00Z", + "to": "2023-08-10T20:00:00Z", +} + +func GetPositions() ([]data.LocationData, error) { + req, err := createRequest() + if err != nil { + return nil, err + } + + client := http.Client{} + resp, err := client.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + var positions []Positions + err = json.Unmarshal(body, &positions) + if err != nil { + return nil, err + } + + return MapToPositionData(positions), err +} + +func createRequest() (*http.Request, error) { + baseURL := "https://traccar.fjla.uk/api/positions" + + u, err := url.Parse(baseURL) + if err != nil { + return nil, err + } + + queryParams := url.Values{} + + for key, value := range params { + queryParams.Add(key, value) + } + + u.RawQuery = queryParams.Encode() + + req, err := http.NewRequest("GET", u.String(), nil) + if err != nil { + return nil, err + } + + req.SetBasicAuth(user, pass) + + return req, nil +} + +type Attributes map[string]interface{} // Generic map to hold attributes + +type Positions struct { + ID int64 `json:"id"` + Attributes Attributes `json:"attributes"` + DeviceID int64 `json:"deviceId"` + Protocol string `json:"protocol"` + ServerTime string `json:"serverTime"` + DeviceTime string `json:"deviceTime"` + FixTime string `json:"fixTime"` + Outdated bool `json:"outdated"` + Valid bool `json:"valid"` + Latitude float64 `json:"latitude"` + Longitude float64 `json:"longitude"` + Altitude float64 `json:"altitude"` + Speed float64 `json:"speed"` + Course float64 `json:"course"` + Address string `json:"address"` + Accuracy float64 `json:"accuracy"` + Network interface{} `json:"network"` // Inferred as interface{} since it's not clear + GeofenceIDs interface{} `json:"geofenceIds"` // Inferred as interface{} since it's not clear +}