-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpushmessage.go
More file actions
151 lines (138 loc) · 5.06 KB
/
pushmessage.go
File metadata and controls
151 lines (138 loc) · 5.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package mbz
import (
"encoding/json"
"fmt"
"time"
"github.com/way-platform/mbz-go/api/servicesv1"
mbzv1 "github.com/way-platform/mbz-go/proto/gen/go/wayplatform/connect/mbz/v1"
"google.golang.org/protobuf/types/known/timestamppb"
)
// PushMessage represents a push message.
//
// See: https://developer.mercedes-benz.com/products/connect_your_fleet/specifications/push_api
type PushMessage struct {
// Unique message identifier.
MessageID string `json:"messageId"`
// Vehicle identification number.
VIN string `json:"vin"`
// Time when the message was created (in milliseconds since 1970).
Timestamp int64 `json:"timestamp"`
// Always vehiclesignal.
MessageType string `json:"messageType"`
// Version tag for the message.
Version string `json:"version"`
// Service associated with the message.
ServiceID string `json:"serviceId"`
// Sending mode.
SendingBehaviour servicesv1.SignalSendingBehaviour `json:"sendingBehaviour"`
// Message data.
Data json.RawMessage `json:"data"`
}
// AsProto converts the push message to an [mbzv1.PushMessage] protobuf message.
func (m *PushMessage) AsProto() (*mbzv1.PushMessage, error) {
messageType, err := messageTypeToProto(m.MessageType)
if err != nil {
return nil, err
}
var result mbzv1.PushMessage
result.SetMessageId(m.MessageID)
result.SetTime(timestamppb.New(time.UnixMilli(m.Timestamp).UTC()))
result.SetVersion(m.Version)
if messageType != mbzv1.MessageType_SIGNALS {
// TODO: Handle more message types correctly.
return &result, nil
}
result.SetVin(m.VIN)
result.SetServiceId(m.ServiceID)
sendingBehavior, err := sendingBehaviorToProto(m.SendingBehaviour)
if err != nil {
return nil, err
}
result.SetSendingBehavior(sendingBehavior)
switch messageType {
case mbzv1.MessageType_SIGNALS:
var data VehicleSignalData
if err := json.Unmarshal(m.Data, &data); err != nil {
return nil, err
}
result.SetSignals(make([]*mbzv1.Signal, 0, len(data.Signals)))
for _, signal := range data.Signals {
signalProto, err := signal.AsProto()
if err != nil {
return nil, err
}
result.SetSignals(append(result.GetSignals(), signalProto))
}
}
return &result, nil
}
func sendingBehaviorToProto(
sendingBehavior servicesv1.SignalSendingBehaviour,
) (mbzv1.SendingBehavior, error) {
switch sendingBehavior {
case servicesv1.SignalSendingBehaviourONCHANGE:
return mbzv1.SendingBehavior_ON_CHANGE, nil
case servicesv1.SignalSendingBehaviourONCHARGINGCYCLE:
return mbzv1.SendingBehavior_ON_CHARGING_CYCLE, nil
case servicesv1.SignalSendingBehaviourONCHARGINGCYCLEEND:
return mbzv1.SendingBehavior_ON_CHARGING_CYCLE_END, nil
case servicesv1.SignalSendingBehaviourONCHARGINGDETECTION:
return mbzv1.SendingBehavior_ON_CHARGING_DETECTION, nil
case servicesv1.SignalSendingBehaviourONCHARGINGSESSION:
return mbzv1.SendingBehavior_ON_CHARGING_SESSION, nil
case servicesv1.SignalSendingBehaviourONCHARGINGSESSIONEND:
return mbzv1.SendingBehavior_ON_CHARGING_SESSION_END, nil
case servicesv1.SignalSendingBehaviourONIGNITIONLOCK:
return mbzv1.SendingBehavior_ON_IGNITION_LOCK, nil
case servicesv1.SignalSendingBehaviourONINTERVAL120SEC:
return mbzv1.SendingBehavior_ON_INTERVAL_120_SEC, nil
case servicesv1.SignalSendingBehaviourONINTERVAL15SEC:
return mbzv1.SendingBehavior_ON_INTERVAL_15_SEC, nil
case servicesv1.SignalSendingBehaviourONINTERVAL30SEC:
return mbzv1.SendingBehavior_ON_INTERVAL_30_SEC, nil
case servicesv1.SignalSendingBehaviourONRECHARGESESSION:
return mbzv1.SendingBehavior_ON_RECHARGE_SESSION, nil
case servicesv1.SignalSendingBehaviourONREFUELINGEND:
return mbzv1.SendingBehavior_ON_REFUELING_END, nil
case servicesv1.SignalSendingBehaviourONREFUELSESSION:
return mbzv1.SendingBehavior_ON_REFUEL_SESSION, nil
case servicesv1.SignalSendingBehaviourONTRIP:
return mbzv1.SendingBehavior_ON_TRIP, nil
case servicesv1.SignalSendingBehaviourONTRIPEND:
return mbzv1.SendingBehavior_ON_TRIP_END, nil
case servicesv1.SignalSendingBehaviourONREFRESH:
return mbzv1.SendingBehavior_ON_REFRESH, nil
default:
return mbzv1.SendingBehavior_SENDING_BEHAVIOR_UNSPECIFIED, fmt.Errorf(
"unknown sending behavior: %s",
sendingBehavior,
)
}
}
func messageTypeToProto(messageType string) (mbzv1.MessageType, error) {
switch messageType {
case "vehiclesignal":
return mbzv1.MessageType_SIGNALS, nil
case "vehicletrip":
return mbzv1.MessageType_TRIP_SUMMARY, nil
case "vehicle_registration_response":
return mbzv1.MessageType_REGISTRATION_RESPONSE, nil
case "vehicle_service_status_update":
return mbzv1.MessageType_SERVICE_STATUS_UPDATE, nil
case "vehicle_service_activation_pending":
return mbzv1.MessageType_SERVICE_ACTIVATION_PENDING, nil
case "refueling_detection":
return mbzv1.MessageType_REFUELING_DETECTION, nil
case "charging_detection":
return mbzv1.MessageType_CHARGING_DETECTION, nil
case "charging_cycle_summary":
return mbzv1.MessageType_CHARGING_CYCLE_SUMMARY, nil
case "vehicle_command_response":
return mbzv1.MessageType_COMMAND_RESPONSE, nil
default:
return mbzv1.MessageType_MESSAGE_TYPE_UNSPECIFIED, fmt.Errorf(
"unknown message type: %s",
messageType,
)
}
}