package message import ( "encoding/json" "github.com/google/uuid" "time" ) //消息类型 const ( EventConnectType = "connect" EventDisConnectType = "disconnect" EventUpEventType = "event" EventAlarmType = "alarm" EventTelemetryType = "telemetry" EventAttributesType = "attributes" ) // 数据类型Originator const ( DEVICE = "DEVICE" GATEWAY = "GATEWAY" ) // Message ... type Message interface { GetId() string GetTs() time.Time GetOriginator() string GetUserId() string GetType() string GetMsg() map[string]interface{} GetMetadata() Metadata GetAllMap() map[string]interface{} //msg 和 Metadata的合并 SetType(string) SetMsg(map[string]interface{}) SetOriginator(string) SetUserId(string) SetMetadata(Metadata) MarshalBinary() ([]byte, error) } // Metadata ... type Metadata interface { Keys() []string GetKeyValue(key string) interface{} SetKeyValue(key string, val interface{}) GetValues() map[string]interface{} } // NewMessage ... func NewMessage() Message { return &defaultMessage{ Id: uuid.New().String(), Ts: time.Now(), Msg: map[string]interface{}{}, } } type defaultMessage struct { Id string //uuid 消息Id Ts time.Time //时间戳 MsgType string //消息类型, attributes(参数),telemetry(遥测),Connect连接事件 Originator string //数据发布者 设备 规则链 UserId string //客户Id UUID 设备发布人 Msg map[string]interface{} //数据 数据结构JSON 设备原始数据 msg Metadata Metadata //消息的元数据 包括,设备名称,设备类型,命名空间,时间戳等 } // NewMessageWithDetail ... func NewMessageWithDetail(userId, originator string, messageType string, msg map[string]interface{}, metadata Metadata) Message { return &defaultMessage{ Id: uuid.New().String(), Ts: time.Now(), UserId: userId, Originator: originator, MsgType: messageType, Msg: msg, Metadata: metadata, } } func (t *defaultMessage) GetId() string { return t.Id } func (t *defaultMessage) GetTs() time.Time { return t.Ts } func (t *defaultMessage) GetOriginator() string { return t.Originator } func (t *defaultMessage) GetUserId() string { return t.UserId } func (t *defaultMessage) GetType() string { return t.MsgType } func (t *defaultMessage) GetMsg() map[string]interface{} { return t.Msg } func (t *defaultMessage) GetMetadata() Metadata { return t.Metadata } func (t *defaultMessage) GetAllMap() map[string]interface{} { data := make(map[string]interface{}) for msgKey, msgValue := range t.GetMsg() { for metaKey, metaValue := range t.GetMetadata().GetValues() { if msgKey == metaKey { data[msgKey] = metaValue } else { if _, ok := data[msgKey]; !ok { data[msgKey] = msgValue } if _, ok := data[metaKey]; !ok { data[metaKey] = metaValue } } } } return data } func (t *defaultMessage) SetType(msgType string) { t.MsgType = msgType } func (t *defaultMessage) SetMsg(msg map[string]interface{}) { t.Msg = msg } func (t *defaultMessage) SetOriginator(originator string) { t.Originator = originator } func (t *defaultMessage) SetUserId(userId string) { t.UserId = userId } func (t *defaultMessage) SetMetadata(metadata Metadata) { t.Metadata = metadata } func (t *defaultMessage) MarshalBinary() ([]byte, error) { return json.Marshal(t) } // NewMetadata ... func NewMetadata() Metadata { return &defaultMetadata{ values: make(map[string]interface{}), } } type defaultMetadata struct { values map[string]interface{} } func NewDefaultMetadata(vals map[string]interface{}) Metadata { return &defaultMetadata{ values: vals, } } func (t *defaultMetadata) Keys() []string { keys := make([]string, 0) for key := range t.values { keys = append(keys, key) } return keys } func (t *defaultMetadata) GetKeyValue(key string) interface{} { if _, found := t.values[key]; !found { return nil } return t.values[key] } func (t *defaultMetadata) SetKeyValue(key string, val interface{}) { t.values[key] = val } func (t *defaultMetadata) GetValues() map[string]interface{} { return t.values } func (t *defaultMetadata) SetValues(values map[string]interface{}) { t.values = values }