Documentation
¶
Overview ¶
Package backend provides the LoRaWAN backend interfaces structs.
Index ¶
- Constants
- Variables
- type Answer
- type AppSKeyAnsPayload
- type AppSKeyReqPayload
- type BasePayload
- type BasePayloadResult
- type Client
- type ClientConfig
- type DLMetaData
- type DeviceProfile
- type Frequency
- type GWInfoElement
- type HEXBytes
- type HRStartAnsPayload
- type HRStartReqPayload
- type HRStopAnsPayload
- type HRStopReqPayload
- type HomeNSAnsPayload
- type HomeNSReqPayload
- type ISO8601Time
- type JoinAnsPayload
- type JoinReqPayload
- type KeyEnvelope
- type MessageType
- type NetworkActivationRecord
- type NetworkTrafficRecord
- type PRStartAnsPayload
- type PRStartReqPayload
- type PRStopAnsPayload
- type PRStopReqPayload
- type Percentage
- type ProfileAnsPayload
- type ProfileReqPayload
- type RatePolicy
- type RejoinAnsPayload
- type RejoinReqPayload
- type Request
- type Result
- type ResultCode
- type RoamingType
- type RoutingProfile
- type ServiceProfile
- type ULMetaData
- type VSExtension
- type XmitDataAnsPayload
- type XmitDataReqPayload
Constants ¶
const (
ProtocolVersion1_0 = "1.0"
)
Supported protocol versions.
Variables ¶
var (
ErrAsyncTimeout = errors.New("async timeout")
)
Errors.
Functions ¶
This section is empty.
Types ¶
type Answer ¶
type Answer interface {
// GetBasePayload returns the base payload of the answer.
GetBasePayload() BasePayloadResult
}
Answer defines the payload answer interface.
type AppSKeyAnsPayload ¶
type AppSKeyAnsPayload struct {
BasePayloadResult
DevEUI lorawan.EUI64 `json:"DevEUI"`
AppSKey *KeyEnvelope `json:"AppSKey,omitempty"` // Mandatory when Result=Success
SessionKeyID HEXBytes `json:"SessionKeyID"`
}
AppSKeyAnsPayload defines the AppSKeyAns message payload.
func (AppSKeyAnsPayload) GetBasePayload ¶
func (p AppSKeyAnsPayload) GetBasePayload() BasePayloadResult
GetBasePayload returns the base payload.
type AppSKeyReqPayload ¶
type AppSKeyReqPayload struct {
BasePayload
DevEUI lorawan.EUI64 `json:"DevEUI"`
SessionKeyID HEXBytes `json:"SessionKeyID"`
}
AppSKeyReqPayload defines the AppSKeyReq message payload.
func (AppSKeyReqPayload) GetBasePayload ¶
func (p AppSKeyReqPayload) GetBasePayload() BasePayload
GetBasePayload returns the base payload.
type BasePayload ¶
type BasePayload struct {
ProtocolVersion string `json:"ProtocolVersion"` // Version of backend specification. E.g., "1.0"
SenderID string `json:"SenderID"` // Hexadecimal representation in ASCII format in case of carrying NetID or JoinEUI, ASCII string in case of AS-ID
ReceiverID string `json:"ReceiverID"` // Hexadecimal representation in ASCII format in case of carrying NetID or JoinEUI, ASCII string in case of AS-ID
TransactionID uint32 `json:"TransactionID"`
MessageType MessageType `json:"MessageType"`
SenderToken HEXBytes `json:"SenderToken,omitempty"`
ReceiverToken HEXBytes `json:"ReceiverToken,omitempty"`
VSExtension VSExtension `json:"VSExtension,omitempty"`
}
BasePayload defines the base payload that is sent with every request.
type BasePayloadResult ¶
type BasePayloadResult struct {
BasePayload
Result Result `json:"Result"`
}
BasePayloadResult defines the base payload that is sent with every result.
func (BasePayloadResult) GetBasePayload ¶
func (p BasePayloadResult) GetBasePayload() BasePayloadResult
GetBasePayload returns the base payload.
type Client ¶
type Client interface {
// GetSenderID returns the SenderID.
GetSenderID() string
// GetReceiverID returns the ReceiverID.
GetReceiverID() string
// IsAsync returns a bool indicating if the client is async.
IsAsync() bool
// GetRandomTransactionID returns a random transaction id.
GetRandomTransactionID() uint32
// JoinReq method.
JoinReq(context.Context, JoinReqPayload) (JoinAnsPayload, error)
// RejoinReq method.
RejoinReq(context.Context, RejoinReqPayload) (RejoinAnsPayload, error)
// PRStartReq method.
PRStartReq(context.Context, PRStartReqPayload) (PRStartAnsPayload, error)
// PRStopReq method.
PRStopReq(context.Context, PRStopReqPayload) (PRStopAnsPayload, error)
// XmitDataReq method.
XmitDataReq(context.Context, XmitDataReqPayload) (XmitDataAnsPayload, error)
// ProfileReq method.
ProfileReq(context.Context, ProfileReqPayload) (ProfileAnsPayload, error)
// HomeNSReq method.
HomeNSReq(context.Context, HomeNSReqPayload) (HomeNSAnsPayload, error)
// SendAnswer sends the async answer.
SendAnswer(context.Context, Answer) error
// HandleAnswer handles an async answer.
HandleAnswer(context.Context, Answer) error
}
Client defines the backend client interface.
func NewClient ¶
func NewClient(config ClientConfig) (Client, error)
NewClient creates a new Client.
type ClientConfig ¶
type ClientConfig struct {
SenderID string
ReceiverID string
Server string
CACert string
TLSCert string
TLSKey string
// Authorization contains the value for the Authorization header. This may
// include a prefix, like Bearer, Key or Basic.
Authorization string
// RedisClient holds the optional Redis database client. When set the client
// will use the aysnc protocol scheme. In this case the client will wait
// AsyncTimeout before returning a timeout error.
RedisClient redis.UniversalClient
// AsyncTimeout defines the async timeout. This must be set when RedisClient
// is set.
AsyncTimeout time.Duration
// Logger holds a Logger instance.
Logger *log.Logger
}
ClientConfig holds the backend client configuration.
type DLMetaData ¶
type DLMetaData struct {
DevEUI *lorawan.EUI64 `json:"DevEUI,omitempty"`
FPort *uint8 `json:"FPort,omitempty"`
FCntDown *uint32 `json:"FCntDown,omitempty"`
Confirmed bool `json:"Confirmed,omitempty"`
DLFreq1 *float64 `json:"DLFreq1,omitempty"` // TODO: In MHz? At least DLFreq1 or DLFreq2 SHALL be present.
DLFreq2 *float64 `json:"DLFreq2,omitempty"` // TODO: In Mhz? At least DLFreq1 or DLFreq2 SHALL be present.
RXDelay1 *int `json:"RXDelay1,omitempty"`
ClassMode *string `json:"ClassMode,omitempty"` // Only "A" and "C" are supported
DataRate1 *int `json:"DataRate1,omitempty"` // Present only if DLFreq1 is present
DataRate2 *int `json:"DataRate2,omitempty"` // Present only if DLFreq2 is present
FNSULToken HEXBytes `json:"FNSULToken,omitempty"`
GWInfo []GWInfoElement `json:"GWInfo"`
HiPriorityFlag bool `json:"HiPriorityFlag,omitempty"`
}
DLMetaData defines the downlink metadata.
type DeviceProfile ¶
type DeviceProfile struct {
DeviceProfileID string `json:"DeviceProfileID" db:"device_profile_id"`
SupportsClassB bool `json:"SupportsClassB" db:"supports_class_b"`
ClassBTimeout int `json:"ClassBTimeout" db:"class_b_timeout"` // Unit: seconds
PingSlotPeriod int `json:"PingSlotPeriod" db:"ping_slot_period"`
PingSlotDR int `json:"PingSLotDR" db:"ping_slot_dr"`
PingSlotFreq Frequency `json:"PingSlotFreq" db:"ping_slot_freq"` // TODO: in MHz?
SupportsClassC bool `json:"SupportsClassC" db:"supports_class_c"`
ClassCTimeout int `json:"ClassCTimeout" db:"class_c_timeout"` // Unit: seconds
MACVersion string `json:"MACVersion" db:"mac_version"` // Example: "1.0.2" [LW102]
RegParamsRevision string `json:"RegParamsRevision" db:"reg_params_revision"` // Example: "B" [RP102B]
RXDelay1 int `json:"RXDelay1" db:"rx_delay_1"`
RXDROffset1 int `json:"RXDROffset1" db:"rx_dr_offset_1"`
RXDataRate2 int `json:"RXDataRate2" db:"rx_data_rate_2"` // Unit: bits-per-second
RXFreq2 Frequency `json:"RXFreq2" db:"rx_freq_2"` // Value of the frequency, e.g., 868.10
FactoryPresetFreqs []Frequency `json:"FactoryPresetFreqs" db:"factory_preset_freqs"` // TODO: In MHz?
MaxEIRP int `json:"MaxEIRP" db:"max_eirp"` // In dBm
MaxDutyCycle Percentage `json:"MaxDutyCycle" db:"max_duty_cycle"` // Example: 0.10 indicates 10%
SupportsJoin bool `json:"SupportsJoin" db:"supports_join"`
RFRegion string `json:"RFRegion" db:"rf_region"`
Supports32bitFCnt bool `json:"Supports32bitFCnt" db:"supports_32bit_fcnt"`
}
DeviceProfile includes End-Device capabilities and boot parameters that are needed by the NS for setting up the LoRaWAN radio access service. These information elements SHALL be provided by the End-Device manufacturer.
type Frequency ¶
type Frequency int
Frequency defines the frequency type (in Hz).
func (Frequency) MarshalJSON ¶
MarshalJSON implements the json.Marshaler interface. This returns the frequency value in MHz (e.g. 868.1) to be compatible with the LoRaWAN Backend Interfaces specification.
func (*Frequency) UnmarshalJSON ¶
UnmarshalJSON implements the json.Unmarshaler interface. This parses a frequency in MHz (float type) back to Hz (int).
type GWInfoElement ¶
type GWInfoElement struct {
ID HEXBytes `json:"ID,omitempty"` // TODO: shouldn't this be the gateway MAC (64 bit)?
FineRecvTime *int `json:"FineRecvTime,omitempty"` // Nanosec within RecvTime
RFRegion string `json:"RFRegion,omitempty"`
RSSI *int `json:"RSSI,omitempty"` // Signed integer, unit: dBm
SNR *float64 `json:"SNR,omitempty"` // Unit: dB
Lat *float64 `json:"Lat,omitempty"`
Lon *float64 `json:"Lon,omitempty"`
ULToken HEXBytes `json:"ULToken,omitempty"`
DLAllowed bool `json:"DLAllowed,omitempty"`
}
GWInfoElement defines the gateway info element.
type HEXBytes ¶
type HEXBytes []byte
HEXBytes defines a type which represents bytes as HEX when marshaled to text.
func (HEXBytes) MarshalText ¶
MarshalText implements encoding.TextMarshaler.
func (*HEXBytes) UnmarshalText ¶
UnmarshalText implements encoding.TextUnmarshaler.
type HRStartAnsPayload ¶
type HRStartAnsPayload struct {
BasePayloadResult
PHYPayload HEXBytes `json:"PHYPayload,omitempty"` // Mandatory when Result=Success
Lifetime *int `json:"Lifetime,omitempty"` // Mandatory when Result=Success, in seconds
SNwkSIntKey *KeyEnvelope `json:"SNwkSIntKey,omitempty"` // Mandatory when Result=Success
FNwkSIntKey *KeyEnvelope `json:"FNwkSIntKey,omitempty"` // Mandatory when Result=Success
NwkSEncKey *KeyEnvelope `json:"NwkSEncKey,omitempty"` // Mandatory when Result=Success
NwkSKey *KeyEnvelope `json:"NwkSKey,omitempty"` // Mandatory when Result=Success (LoRaWAN 1.0.x)
DeviceProfile *DeviceProfile `json:"DeviceProfile,omitempty"` // Optional, when Result=Failure
ServiceProfile *ServiceProfile `json:"ServiceProfile,omitempty"` // Mandatory when Result=Success
DLMetaData *DLMetaData `json:"DLMetaData,omitempty"` // Mandatory when Result=Success
DeviceProfileTimestamp *ISO8601Time `json:"DeviceProfileTimestamp,omitempty"` // Optional, when Result=Failure, timestamp of last DeviceProfile change
}
HRStartAnsPayload defines the HRStartAns message payload.
func (HRStartAnsPayload) GetBasePayload ¶
func (p HRStartAnsPayload) GetBasePayload() BasePayloadResult
GetBasePayload returns the base payload.
type HRStartReqPayload ¶
type HRStartReqPayload struct {
BasePayload
MACVersion string `json:"MACVersion"` // e.g. "1.0.2"
PHYPayload HEXBytes `json:"PHYPayload"`
DevAddr lorawan.DevAddr `json:"DevAddr"`
DeviceProfile DeviceProfile `json:"DeviceProfile"`
ULMetaData ULMetaData `json:"ULMetaData"`
DLSettings lorawan.DLSettings `json:"DLSettings"`
RxDelay int `json:"RxDelay"`
CFList HEXBytes `json:"CFList,omitempty"` // Optional
DeviceProfileTimestamp ISO8601Time `json:"DeviceProfileTimestamp"` // Timestamp of last DeviceProfile change
}
HRStartReqPayload defines the HRStartReq message payload.
func (HRStartReqPayload) GetBasePayload ¶
func (p HRStartReqPayload) GetBasePayload() BasePayload
GetBasePayload returns the base payload.
type HRStopAnsPayload ¶
type HRStopAnsPayload struct {
BasePayloadResult
}
HRStopAnsPayload defines the HRStopAns message payload.
func (HRStopAnsPayload) GetBasePayload ¶
func (p HRStopAnsPayload) GetBasePayload() BasePayloadResult
GetBasePayload returns the base payload.
type HRStopReqPayload ¶
type HRStopReqPayload struct {
BasePayload
DevEUI lorawan.EUI64 `json:"DevEUI"`
}
HRStopReqPayload defines the HRStopReq message payload.
func (HRStopReqPayload) GetBasePayload ¶
func (p HRStopReqPayload) GetBasePayload() BasePayload
GetBasePayload returns the base payload.
type HomeNSAnsPayload ¶
type HomeNSAnsPayload struct {
BasePayloadResult
HNetID lorawan.NetID `json:"HNetID"`
}
HomeNSAnsPayload defines the HomeNSAns message payload.
func (HomeNSAnsPayload) GetBasePayload ¶
func (p HomeNSAnsPayload) GetBasePayload() BasePayloadResult
GetBasePayload returns the base payload.
type HomeNSReqPayload ¶
type HomeNSReqPayload struct {
BasePayload
DevEUI lorawan.EUI64 `json:"DevEUI"`
}
HomeNSReqPayload defines the HomeNSReq message payload.
func (HomeNSReqPayload) GetBasePayload ¶
func (p HomeNSReqPayload) GetBasePayload() BasePayload
GetBasePayload returns the base payload.
type ISO8601Time ¶
ISO8601Time defines an ISO 8601 encoded timestamp.
func (ISO8601Time) MarshalText ¶
func (t ISO8601Time) MarshalText() ([]byte, error)
MarshalText implements encoding.TextMarshaler.
func (*ISO8601Time) UnmarshalText ¶
func (t *ISO8601Time) UnmarshalText(text []byte) error
UnmarshalText implements encoding.TextUnmarshaler.
type JoinAnsPayload ¶
type JoinAnsPayload struct {
BasePayloadResult
PHYPayload HEXBytes `json:"PHYPayload,omitempty"` // Mandatory when Result=Success
Lifetime *int `json:"Lifetime,omitempty"` // Mandatory when Result=Success, in seconds
SNwkSIntKey *KeyEnvelope `json:"SNwkSIntKey,omitempty"` // Mandatory when Result=Success
FNwkSIntKey *KeyEnvelope `json:"FNwkSIntKey,omitempty"` // Mandatory when Result=Success
NwkSEncKey *KeyEnvelope `json:"NwkSEncKey,omitempty"` // Mandatory when Result=Success
NwkSKey *KeyEnvelope `json:"NwkSKey,omitempty"` // Mandatory when Result=Success (LoRaWAN 1.0.x)
AppSKey *KeyEnvelope `json:"AppSKey,omitempty"` // Mandatory when Result=Success and not SessionKeyID
SessionKeyID HEXBytes `json:"SessionKeyID,omitempty"` // Mandatory when Result=Success and not AppSKey
}
JoinAnsPayload defines the JoinAns message payload.
func (JoinAnsPayload) GetBasePayload ¶
func (p JoinAnsPayload) GetBasePayload() BasePayloadResult
GetBasePayload returns the base payload.
type JoinReqPayload ¶
type JoinReqPayload struct {
BasePayload
MACVersion string `json:"MACVersion"` // e.g. "1.0.2"
PHYPayload HEXBytes `json:"PHYPayload"`
DevEUI lorawan.EUI64 `json:"DevEUI"`
DevAddr lorawan.DevAddr `json:"DevAddr"`
DLSettings lorawan.DLSettings `json:"DLSettings"`
RxDelay int `json:"RxDelay"`
CFList HEXBytes `json:"CFList,omitempty"` // Optional
}
JoinReqPayload defines the JoinReq message payload.
func (JoinReqPayload) GetBasePayload ¶
func (p JoinReqPayload) GetBasePayload() BasePayload
GetBasePayload returns the base payload.
type KeyEnvelope ¶
KeyEnvelope defines the key envelope object.
func NewKeyEnvelope ¶
NewKeyEnvelope creates a new KeyEnvelope.
type MessageType ¶
type MessageType string
MessageType defines the message-type type.
const ( JoinReq MessageType = "JoinReq" JoinAns MessageType = "JoinAns" RejoinReq MessageType = "RejoinReq" RejoinAns MessageType = "RejoinAns" AppSKeyReq MessageType = "AppSKeyReq" AppSKeyAns MessageType = "AppSKeyAns" PRStartReq MessageType = "PRStartReq" PRStartAns MessageType = "PRStartAns" PRStopReq MessageType = "PRStopReq" PRStopAns MessageType = "PRStopAns" HRStartReq MessageType = "HRStartReq" HRStartAns MessageType = "HRStartAns" HRStopReq MessageType = "HRStopReq" HRStopAns MessageType = "HRStopAns" HomeNSReq MessageType = "HomeNSReq" HomeNSAns MessageType = "HomeNSAns" ProfileReq MessageType = "ProfileReq" ProfileAns MessageType = "ProfileAns" XmitDataReq MessageType = "XmitDataReq" XmitDataAns MessageType = "XmitDataAns" )
Supported message types.
type NetworkActivationRecord ¶
type NetworkActivationRecord struct {
NetID lorawan.NetID `db:"net_id"` // NetID of the roaming partner NS
ServiceProfileID string `db:"service_profile_id"` // Service Profile ID
IndividualRecord bool `db:"individual_record"` // Indicates if this is an individual (de-)activation record (as opposed to cumulative record of End-Devices that are active throughout the month)
TotalActiveDevices int `db:"total_active_devices"` // Number of End-Devices that have been active throughout the month. Included if this is a cumulative record.
DevEUI lorawan.EUI64 `db:"dev_eui"` // DevEUI of the End-Device that has performed the (de-)activation. Included if this is an IndividualRecord for a (de-)activation event.
ActivationTime time.Time `db:"activation_time"` // Date/time of the activation. Included if this is an IndividualRecord for an activation event.
DeactivationTime time.Time `db:"deactivation_time"` // Date/time of the deactivation. Included if this is an IndividualRecord for a deactivation event.
}
NetworkActivationRecord is used for keeping track of the End-Devices performing Activation away from Home. When the Activation away from Home Procedure takes place, then the NS SHALL generate a monthly Network Activation Record for each ServiceProfileID of another NS that has at least one End-Device active throughout the month, and dedicated Network Activation Records for each activation and deactivation of an End-Device from another NS.
type NetworkTrafficRecord ¶
type NetworkTrafficRecord struct {
NetID lorawan.NetID `db:"net_id"` // NetID of the roaming partner NS
ServiceProfileID string `db:"service_profile_id"` // Service Profile ID
RoamingType RoamingType `db:"roaming_type"` // Passive Roaming or Handover Roaming
TotalULPackets int `db:"total_ul_packets"` // Number of uplink packets
TotalDLPackets int `db:"total_dl_packets"` // Number of downlink packets
TotalOutProfileULPackets int `db:"total_out_profile_ul_packets"` // Number of uplink packets that exceeded ULRate but forwarded anyways per ULRatePolicy
TotalOutProfileDLPackets int `db:"total_out_profile_dl_packets"` // Number of downlink packets that exceeded DLRate but forwarded anyways per DLRatePolicy
TotalULBytes int `db:"total_ul_bytes"` // Total amount of uplink bytes
TotalDLBytes int `db:"total_dl_bytes"` // Total amount of downlink bytes
TotalOutProfileULBytes int `db:"total_out_profile_ul_bytes"` // Total amount of uplink bytes that falls outside the Service Profile
TotalOutProfileDLBytes int `db:"total_out_profile_dl_bytes"` // Total amount of downlink bytes that falls outside the Service Profile
}
NetworkTrafficRecord is used for keeping track of the amount of traffic served for roaming End-Devices. The NS that allows roaming SHALL generate a monthly Network Traffic Record for each roaming type (Passive/Handover Roaming) under each ServiceProfileID of another NS that has at least one End-Device roaming into its network.
Packet and payload counters are only based on the user-generated traffic. Payload counters are based on the size of the FRMPayload field.
type PRStartAnsPayload ¶
type PRStartAnsPayload struct {
BasePayloadResult
PHYPayload HEXBytes `json:"PHYPayload,omitempty"` // Optional when Result=Success
DevEUI *lorawan.EUI64 `json:"DevEUI,omitempty"` // Optional when Result=Success
Lifetime *int `json:"Lifetime,omitempty"` // Mandatory when Result=Success, in seconds
FNwkSIntKey *KeyEnvelope `json:"FNwkSIntKey,omitempty"` // Optional when Result=Success and not NwkSKey
NwkSKey *KeyEnvelope `json:"NwkSKey,omitempty"` // Optional when Result=Success and not FNwkSIntKey
FCntUp *uint32 `json:"FCntUp,omitempty"` // Optional when Result=Success
ServiceProfile *ServiceProfile `json:"ServiceProfile,omitempty"` // Optional when Result=Success
DLMetaData *DLMetaData `json:"DLMetaData,omitempty"` // Optional when Result=Success
DevAddr *lorawan.DevAddr `json:"DevAddr,omitempty"` // Optional when Result=Success (not specified in Backend Specs but needed for OTAA)
}
PRStartAnsPayload defines the PRStartAns message payload.
func (PRStartAnsPayload) GetBasePayload ¶
func (p PRStartAnsPayload) GetBasePayload() BasePayloadResult
GetBasePayload returns the base payload.
type PRStartReqPayload ¶
type PRStartReqPayload struct {
BasePayload
PHYPayload HEXBytes `json:"PHYPayload,omitempty"`
ULMetaData ULMetaData `json:"ULMetaData"`
}
PRStartReqPayload defines the PRStartReq message payload.
func (PRStartReqPayload) GetBasePayload ¶
func (p PRStartReqPayload) GetBasePayload() BasePayload
GetBasePayload returns the base payload.
type PRStopAnsPayload ¶
type PRStopAnsPayload struct {
BasePayloadResult
}
PRStopAnsPayload defines the PRStopAns message payload.
func (PRStopAnsPayload) GetBasePayload ¶
func (p PRStopAnsPayload) GetBasePayload() BasePayloadResult
GetBasePayload returns the base payload.
type PRStopReqPayload ¶
type PRStopReqPayload struct {
BasePayload
DevEUI lorawan.EUI64 `json:"DevEUI"`
Lifetime *int `json:"Lifetime,omitempty"` // Optional, in seconds
}
PRStopReqPayload defines the PRStopReq message payload.
func (PRStopReqPayload) GetBasePayload ¶
func (p PRStopReqPayload) GetBasePayload() BasePayload
GetBasePayload returns the base payload.
type Percentage ¶
type Percentage int
Percentage defines the percentage type as an int (1 = 1%, 100 = 100%).
func (Percentage) MarshalJSON ¶
func (p Percentage) MarshalJSON() ([]byte, error)
MarshalJSON implements the json.Marshaler interface. This returns the percentage as a float (0.1 for 10%) to be compatible with the LoRaWAN Backend Interfaces specification.
func (*Percentage) UnmarshalJSON ¶
func (p *Percentage) UnmarshalJSON(str []byte) error
UnmarshalJSON implements the json.Unmarshaler interface. This parses a percentage presented as 0.1 (float) back to 10 (int).
type ProfileAnsPayload ¶
type ProfileAnsPayload struct {
BasePayloadResult
DeviceProfile *DeviceProfile `json:"DeviceProfile,omitempty"` // Mandatory when Result=Success
DeviceProfileTimestamp *ISO8601Time `json:"DeviceProfileTimestamp,omitempty"` // Mandatory when Result=Success. Timestamp of last DeviceProfile change.
RoamingActivationType *RoamingType `json:"RoamingActivationType"` // Mandatory when Result=Success.
}
ProfileAnsPayload defines the ProfileAns message payload.
func (ProfileAnsPayload) GetBasePayload ¶
func (p ProfileAnsPayload) GetBasePayload() BasePayloadResult
GetBasePayload returns the base payload.
type ProfileReqPayload ¶
type ProfileReqPayload struct {
BasePayload
DevEUI lorawan.EUI64 `json:"DevEUI"`
}
ProfileReqPayload defines the ProfileReq message payload.
func (ProfileReqPayload) GetBasePayload ¶
func (p ProfileReqPayload) GetBasePayload() BasePayload
GetBasePayload returns the base payload.
type RatePolicy ¶
type RatePolicy string
RatePolicy defines the RatePolicy type.
const ( Drop RatePolicy = "Drop" Mark RatePolicy = "Mark" )
Available rate policies.
type RejoinAnsPayload ¶
type RejoinAnsPayload struct {
BasePayloadResult
PHYPayload HEXBytes `json:"PHYPayload,omitempty"` // Mandatory when Result=Success
Lifetime *int `json:"Lifetime,omitempty"` // Mandatory when Result=Success, in seconds
SNwkSIntKey *KeyEnvelope `json:"SNwkSIntKey,omitempty"` // Mandatory when Result=Success
FNwkSIntKey *KeyEnvelope `json:"FNwkSIntKey,omitempty"` // Mandatory when Result=Success
NwkSEncKey *KeyEnvelope `json:"NwkSEncKey,omitempty"` // Mandatory when Result=Success
NwkSKey *KeyEnvelope `json:"NwkSKey,omitempty"` // Mandatory when Result=Success (LoRaWAN 1.0.x)
AppSKey *KeyEnvelope `json:"AppSKey,omitempty"` // Mandatory when Result=Success and not SessionKeyID
SessionKeyID HEXBytes `json:"SessionKeyID,omitempty"` // Mandatory when Result=Success and not AppSKey
}
RejoinAnsPayload defines the RejoinAns message payload.
func (RejoinAnsPayload) GetBasePayload ¶
func (p RejoinAnsPayload) GetBasePayload() BasePayloadResult
GetBasePayload returns the base payload.
type RejoinReqPayload ¶
type RejoinReqPayload struct {
BasePayload
MACVersion string `json:"MACVersion"` // e.g. "1.0.2"
PHYPayload HEXBytes `json:"PHYPayload"`
DevEUI lorawan.EUI64 `json:"DevEUI"`
DevAddr lorawan.DevAddr `json:"DevAddr"`
DLSettings lorawan.DLSettings `json:"DLSettings"`
RxDelay int `json:"RxDelay"`
CFList HEXBytes `json:"CFList,omitempty"` // Optional
}
RejoinReqPayload defines the RejoinReq message payload.
func (RejoinReqPayload) GetBasePayload ¶
func (p RejoinReqPayload) GetBasePayload() BasePayload
GetBasePayload returns the base payload.
type Request ¶
type Request interface {
// GetBasePayload returns the base payload of the request.
GetBasePayload() BasePayload
}
Request defines the payload request interface.
type Result ¶
type Result struct {
ResultCode ResultCode `json:"ResultCode"`
Description string `json:"Description"` // Detailed information related to the ResultCode (optional).
}
Result defines the result object.
type ResultCode ¶
type ResultCode string
ResultCode defines the result-code type.
const ( Success ResultCode = "Success" // Success, i.e., request was granted MICFailed ResultCode = "MICFailed" // MIC verification has failed JoinReqFailed ResultCode = "JoinReqFailed" // JS processing of the JoinReq has failed NoRoamingAgreement ResultCode = "NoRoamingAgreement" // There is no roaming agreement between the operators DevRoamingDisallowed ResultCode = "DevRoamingDisallowed" // End-Device is not allowed to roam RoamingActDisallowed ResultCode = "RoamingActDisallowedA" // End-Device is not allowed to perform activation while roaming ActivationDisallowed ResultCode = "ActivationDisallowed" // End-Device is not allowed to perform activation UnknownDevEUI ResultCode = "UnknownDevEUI" // End-Device with a matching DevEUI is not found UnknownDevAddr ResultCode = "UnknownDevAddr" // End-Device with a matching DevAddr is not found UnknownSender ResultCode = "UnknownSender" // SenderID is unknown UnknownReceiver ResultCode = "UnkownReceiver" // ReceiverID is unknown Deferred ResultCode = "Deferred" // Passive Roaming is not allowed for a period of time XmitFailed ResultCode = "XmitFailed" // fNS failed to transmit DL packet InvalidFPort ResultCode = "InvalidFPort" // Invalid FPort for DL (e.g., FPort=0) InvalidProtocolVersion ResultCode = "InvalidProtocolVersion" // ProtocolVersion is not supported StaleDeviceProfile ResultCode = "StaleDeviceProfile" // Device Profile is stale MalformedRequest ResultCode = "MalformedRequest" // JSON parsing failed (missing object or incorrect content) FrameSizeError ResultCode = "FrameSizeError" // Wrong size of PHYPayload or FRMPayload Other ResultCode = "Other" // Used for encoding error cases that are not standardized yet )
Supported Result values
type RoamingType ¶
type RoamingType string
RoamingType defines the RoamingType type.
const ( Passive RoamingType = "Passive" Handover RoamingType = "Handover" )
Available roaming activation types.
type RoutingProfile ¶
type RoutingProfile struct {
RoutingProfileID string `json:"RoutingProfileID" db:"routing_profile_id"`
ASID string `json:"AS-ID" db:"as_id"` // Value can be IP address, DNS name, etc.
}
RoutingProfile includes information that are needed by the NS for setting up data-plane with the AS.
type ServiceProfile ¶
type ServiceProfile struct {
ServiceProfileID string `json:"ServiceProfile" db:"service_profile_id"`
ULRate int `json:"ULRate" db:"ul_rate"`
ULBucketSize int `json:"ULBucketSize" db:"ul_bucket_size"`
ULRatePolicy RatePolicy `json:"ULRatePolicy" db:"ul_rate_policy"`
DLRate int `json:"DLRate" db:"dl_rate"`
DLBucketSize int `json:"DLBucketSize" db:"dl_bucket_size"`
DLRatePolicy RatePolicy `json:"DLRatePolicy" db:"dl_rate_policy"`
AddGWMetadata bool `json:"AddGWMetadata" db:"add_gw_metadata"`
DevStatusReqFreq int `json:"DevStatusReqFreq" db:"dev_status_req_freq"` // Unit: requests-per-day
ReportDevStatusBattery bool `json:"ReportDevStatusBatery" db:"report_dev_status_battery"` // TODO: there is a typo in the spec!
ReportDevStatusMargin bool `json:"ReportDevStatusMargin" db:"report_dev_status_margin"`
DRMin int `json:"DRMin" db:"dr_min"`
DRMax int `json:"DRMax" db:"dr_max"`
ChannelMask HEXBytes `json:"ChannelMask" db:"channel_mask"`
PRAllowed bool `json:"PRAllowed" db:"pr_allowed"`
HRAllowed bool `json:"HRAllowed" db:"hr_allowed"`
RAAllowed bool `json:"RAAAllowed" db:"ra_allowed"`
NwkGeoLoc bool `json:"NwkGeoLoc" db:"nwk_geo_loc"`
TargetPER Percentage `json:"TargetPER" db:"target_per"` // Example: 0.10 indicates 10%
MinGWDiversity int `json:"MinGWDiversity" db:"min_gw_diversity"`
}
ServiceProfile includes service parameters that are needed by the NS for setting up the LoRa radio access service and interfacing with the AS.
type ULMetaData ¶
type ULMetaData struct {
DevEUI *lorawan.EUI64 `json:"DevEUI,omitempty"`
DevAddr *lorawan.DevAddr `json:"DevAddr,omitempty"`
FPort *uint8 `json:"FPort,omitempty"`
FCntDown *uint32 `json:"FCntDown,omitempty"`
FCntUp *uint32 `json:"FCntUp,omitempty"`
Confirmed bool `json:"Confirmed,omitempty"`
DataRate *int `json:"DataRate,omitempty"` // See data rate tables in Regional Parameters document
ULFreq *float64 `json:"ULFreq,omitempty"` // Floating point (MHz)
Margin *int `json:"Margin,omitempty"` // Integer value reported by the end-device in DevStatusAns
Battery *int `json:"Battery,omitempty"` // Integer value reported by the end-device in DevStatusAns
FNSULToken HEXBytes `json:"FNSULToken,omitempty"`
RecvTime ISO8601Time `json:"RecvTime"`
RFRegion string `json:"RFRegion,omitempty"`
GWCnt *int `json:"GWCnt,omitempty"`
GWInfo []GWInfoElement `json:"GWInfo,omitempty"`
}
ULMetaData defines the uplink metadata.
type VSExtension ¶
type VSExtension struct {
VendorID HEXBytes `json:"VendorID,omitempty"` // OUI of the vendor
Object json.RawMessage `json:"Object,omitempty"` // The nature of the object is not defined
}
VSExtension defines vendor specific data.
type XmitDataAnsPayload ¶
type XmitDataAnsPayload struct {
BasePayloadResult
DLFreq1 *float64 `json:"DLFreq1,omitempty"` // Optional, when Result=Success, TODO: In MHz?
DLFreq2 *float64 `json:"DLFreq2,omitempty"` // Optional, when Result=Success, TODO: In Mhz?
}
XmitDataAnsPayload defines the XmitDataAns message payload.
func (XmitDataAnsPayload) GetBasePayload ¶
func (p XmitDataAnsPayload) GetBasePayload() BasePayloadResult
GetBasePayload returns the base payload.
type XmitDataReqPayload ¶
type XmitDataReqPayload struct {
BasePayload
PHYPayload HEXBytes `json:"PHYPayload,omitempty"` // Either PHYPayload or FRMPayload should be used
FRMPayload HEXBytes `json:"FRMPayload,omitempty"` // Either PHYPayload or FRMPayload should be used
ULMetaData *ULMetaData `json:"ULMetaData,omitempty"` // Either ULMetaData or DLMetaData must be used
DLMetaData *DLMetaData `json:"DLMetaData,omitempty"` // Either ULMetaData or DLMetaData must be used
}
XmitDataReqPayload defines the XmitDataReq message payload.
func (XmitDataReqPayload) GetBasePayload ¶
func (p XmitDataReqPayload) GetBasePayload() BasePayload
GetBasePayload returns the base payload.
Directories
¶
| Path | Synopsis |
|---|---|
|
Package joinserver provides a http.Handler interface which implements the join-server API as speficied by the LoRaWAN Backend Interfaces.
|
Package joinserver provides a http.Handler interface which implements the join-server API as speficied by the LoRaWAN Backend Interfaces. |