// ConvertFieldsDown converts the fields into a payload func (h *handler) ConvertFieldsDown(ctx log.Interface, appDown *types.DownlinkMessage, ttnDown *pb_broker.DownlinkMessage) error { if appDown.PayloadFields == nil || len(appDown.PayloadFields) == 0 { return nil } if appDown.PayloadRaw != nil { return errors.NewErrInvalidArgument("Downlink", "Both Fields and Payload provided") } app, err := h.applications.Get(appDown.AppID) if err != nil { return nil } functions := &DownlinkFunctions{ Encoder: app.Encoder, Logger: functions.Ignore, } message, _, err := functions.Process(appDown.PayloadFields, appDown.FPort) if err != nil { return err } appDown.PayloadRaw = message return nil }
// ConvertFieldsUp converts the payload to fields using payload functions func (h *handler) ConvertFieldsUp(ctx log.Interface, ttnUp *pb_broker.DeduplicatedUplinkMessage, appUp *types.UplinkMessage) error { // Find Application app, err := h.applications.Get(ttnUp.AppId) if err != nil { return nil // Do not process if application not found } functions := &UplinkFunctions{ Decoder: app.Decoder, Converter: app.Converter, Validator: app.Validator, Logger: functions.Ignore, } fields, valid, err := functions.Process(appUp.PayloadRaw, appUp.FPort) if err != nil { return nil // Do not set fields if processing failed } if !valid { return errors.NewErrInvalidArgument("Payload", "payload validator function returned false") } appUp.PayloadFields = fields return nil }