Compare commits

..

2 Commits

Author SHA1 Message Date
Fred Boniface c8f973019c Update .gitignore from template 2023-08-11 18:56:53 +01:00
Fred Boniface a8f1e46785 Add pre-init code 2023-08-11 18:56:41 +01:00
4 changed files with 150 additions and 1 deletions

22
.gitignore vendored
View File

@ -1,2 +1,24 @@
.env
map-dots
# If you prefer the allow list template instead of the deny list, see community template:
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
#
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
# Test binary, built with `go test -c`
*.test
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
# Dependency directories (remove the comment below to include it)
# vendor/
# Go workspace file
go.work

8
data/data.go Normal file
View File

@ -0,0 +1,8 @@
package data
type LocationData struct {
Latitude float64
Longitude float64
Speed uint32
Altitude float64
}

23
traccar/generic.go Normal file
View File

@ -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
}

96
traccar/positions.go Normal file
View File

@ -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
}