RS26x LoRaWAN Payload Decoding Examples

Introduction

This application note supplements the RS26x LoRa Protocol Application Note
by providing practical examples of RS26x LoRaWAN application payloads.

The protocol specification defines the message structure, namespaces, tags, data types, and configuration parameters supported by the RS26x. This document focuses on how those definitions appear in actual uplink and downlink payloads and walks through the payloads byte by byte.

The examples include normal temperature measurements, aggregation and averaging modes, negative temperatures, backlog data, and configuration messages. Each example shows the captured payload, its structure, and how the individual fields are decoded into meaningful values.

Tested Software Versions

The examples in this document were captured using an RS262 running the following software versions:

ComponentVersion
Canvas Firmware 2.1.0+1755145051
Application Version1.0.3+1760637975

Key Protocol Terms

Tag

A Tag identifies the specific data item that follows in the payload. The Tag definition determines how the associated value should be interpreted, including its length, data type, and scaling.

For example:

Tag 0x00 = Temperature
Tag 0x01 = Temperature Backlog
Tag 0x02 = Aggregated Temperature

Message Identifier

The Message Identifier identifies the function of the protocol message. Its meaning depends on whether the message is an uplink or a downlink.

DirectionMessage IdentifierMessage Type
Uplink0x00Sensor Data
Uplink0x01Configuration Data
Downlink0x00Configuration Get
Downlink0x01Configuration Set

Status Byte

Status Byte contains the current battery status and device status indications, such as Sensor Fault, Bandwidth Limitation, or Backlog Messages Available.

Tag-Value Pair

The body of an RS26x message is composed of Tag-Value pairs:

Tag | Value

For example:

00 | 1A FB
│      │
│      └── Temperature value = 26.98 °C
└───────── Tag 0x00 = Temperature
image-20260901-180742.png

Captured payload

00 C0 00 1A FB

Payload Visualization

00 | C0 | 00 | 1A FB
│    │    │      │
│    │    │      └── Temperature = 26.98 °C
│    │    └───────── Tag 0x00 = Temperature
│    └────────────── Status = Good battery, no status flags
└─────────────────── API Version 0, Sensor Data Message

Payload Breakdown

Byte(s)HexFieldDescriptionDecoded Value
000Message HeaderUpper 4 bits = API Version; lower 4 bits = Message IdentifierAPI Version 0, Sensor Data Message ID 0
1C0Status ByteUpper 2 bits = Battery Status; lower 6 bits = Device StatusBattery = Good; no device status flags
200TagNamespace 0, Tag 0 = TemperatureInternal Temperature
3–41A FBValueSigned 16-bit temperature in Q8 fixed-point format0x1AFB / 256 = 26.9805 °C

Value Conversion

Status

0xC0 = 1100 0000
       ^^   ^^^^^^
       │       │
       │       └─ Device Status = 0x00
       └───────── Battery Status = 3 = Good

Temperature

Raw temperature = 0x1AFB
                = 6907 decimal

Temperature = 6907 / 256
            = 26.98046875 °C
            ≈ 26.98 °C
image-20260901-180757.png

Captured payload

00 C4 02 02 6A 97 14 4C 1A 99 1A A1

Payload Visualization

00 | C4 | 02 | 02 | 6A 97 14 4C | 1A 99 | 1A A1
│    │    │    │         │           │       │
│    │    │    │         │           │       └─ Reading #2 = 26.63 °C
│    │    │    │         │           └───────── Reading #1 = 26.60 °C
│    │    │    │         └───────────────────── Timestamp of first reading
│    │    │    └─────────────────────────────── Number of readings = 2
│    │    └──────────────────────────────────── Tag 0x02 = Aggregated Temperature
│    └───────────────────────────────────────── Status: Good + Backlog Available
└────────────────────────────────────────────── Header: API 0, Sensor Data

Payload Breakdown

Byte(s)HexFieldDescriptionDecoded Value
000Message HeaderAPI Version + Message IdentifierAPI Version 0, Sensor Data Message ID 0
1C4Status ByteBattery status + device status flagsBattery = Good; Backlog Messages Available flag set
202TagNamespace 0, Tag 2 = Aggregated TemperatureAggregated Internal Temperature
302Aggregation CountNumber of temperature samples contained in this Tag value2 readings
4–76A 97 14 4CTimestampUTC seconds / Unix epoch timestamp of the first temperature reading2026-09-01 18:07:08 UTC
8–91A 99Temperature #1Signed Q8 temperature26.60 °C
10–111A A1Temperature #2Signed Q8 temperature26.63 °C

Value Conversion

Temperature #1

0x1A99 = 6809

6809 / 256
= 26.59765625 °C
≈ 26.60 °C

Temperature #2

0x1AA1 = 6817

6817 / 256
= 26.62890625 °C
≈ 26.63 °C

Timestamp

0x6A97144C
= 1788286028
= 2026-09-01 18:07:08 UTC

Averaging Mode Example

For this test, the RS26x was configured with:

Aggregation Mode  = Averaging
Aggregation Count = 2

The device therefore performs two sensor measurements, calculates their average internally, and sends a single temperature value.

The captured payload was:

00 C0 00 1B 1A

Payload Visualization

00 | C0 | 00 | 1B 1A
│    │    │      │
│    │    │      └── Temperature = 27.10 °C
│    │    └───────── Tag 0x00 = Temperature
│    └────────────── Status = Good battery, no status flags
└─────────────────── API Version 0, Sensor Data Message

Payload Breakdown

Byte(s)HexFieldDescriptionDecoded Value
000Message HeaderUpper 4 bits = API Version; lower 4 bits = Message IdentifierAPI Version 0, Sensor Data Message
1C0Status ByteUpper 2 bits = Battery Status; lower 6 bits = Device StatusBattery = Good; no device status flags
200TagNamespace 0, Tag 0x00 = TemperatureTemperature
3-41B 1AValueSigned 16-bit temperature value using Q8 fixed-point representation27.10 °C

Value Conversion

The standard temperature value uses Q8 fixed-point representation:

Temperature = 6938 / 256
            = 27.1015625 °C
            ≈ 27.10 °C

To generate backlog data, normal uplink operation was first confirmed and then connectivity to the LoRaWAN gateway was interrupted. The gateway connection was restored after several minutes, allowing the RS26x to transmit the temperature measurements that had been stored locally while network communication was unavailable.

image-20260901-193155.png

Captured Payload

00 C4 00 1A E7
01 6A 97 21 30 1B 15
01 6A 97 21 4E 1B 15
01 6A 97 21 6C 1B 20
01 6A 97 21 8A 1B 15

Continuous form:

00C4001AE7016A9721301B15016A97214E1B15016A97216C1B20016A97218A1B15

The payload is 33 bytes long.

Payload Visualization

Header  Status    Current Reading         Backlog Record #1
  │       │        Tag     Value           Tag    Timestamp     Value
  │       │         │        │              │        │           │
 00      C4        00      1AE7            01     6A972130     1B15

                           Backlog Record #2
                            01  6A97214E  1B15

                           Backlog Record #3
                            01  6A97216C  1B20

                           Backlog Record #4
                            01  6A97218A  1B15

Payload Breakdown

Byte(s)HexFieldDescriptionDecoded Value
000Message HeaderAPI Version + Message IdentifierAPI Version 0, Sensor Data
1C4Status ByteBattery + device statusGood battery, Backlog Messages Available
200TagCurrent TemperatureTemperature
3–41A E7ValueCurrent temperature, Q826.90 °C
501TagTemperature BacklogBacklog #1
6–96A 97 21 30TimestampUNIX UTC timestamp2026-09-01 19:02:08 UTC
10–111B 15TemperatureQ8 temperature27.08 °C
1201TagTemperature BacklogBacklog #2
13–166A 97 21 4ETimestampUNIX UTC timestamp2026-09-01 19:02:38 UTC
17–181B 15TemperatureQ8 temperature27.08 °C
1901TagTemperature BacklogBacklog #3
20–236A 97 21 6CTimestampUNIX UTC timestamp2026-09-01 19:03:08 UTC
24–251B 20TemperatureQ8 temperature27.13 °C
2601TagTemperature BacklogBacklog #4
27–306A 97 21 8ATimestampUNIX UTC timestamp2026-09-01 19:03:38 UTC
31–321B 15TemperatureQ8 temperature27.08 °C

The protocol defines timestamps as unsigned 32-bit UNIX epoch values, while Temperature Backlog consists of the UTC timestamp followed by the corresponding Temperature value.

Value Conversion

Temperature Backlog #1:

Timestamp:
0x6A972130
= 2026-09-01 19:02:08 UTC

Temperature:
0x1B15 = 6933

6933 / 256
= 27.0820 °C
≈ 27.08 °C
image-20260901-194709.png

Captured Payload

00 C0 00 F8 12

Payload Visualization

00 | C0 | 00 | F8 12
│    │    │      │
│    │    │      └── Temperature = -7.93 °C
│    │    └───────── Tag 0x00 = Temperature
│    └────────────── Status = Good battery, no status flags
└─────────────────── API Version 0, Sensor Data Message

Payload Breakdown

Byte(s)HexFieldDescriptionDecoded Value
000Message HeaderAPI Version + Message IdentifierAPI Version 0, Sensor Data
1C0Status ByteBattery + device statusGood battery, no status flags
200TagStandard Temperature parameterTemperature
3–4F8 12ValueSigned 16-bit Q8 temperature-7.93 °C

The standard RS26x Temperature datatype uses a signed two-byte fixed-point value with a scaling factor of 256 (Q8), allowing both positive and negative temperatures to be represented.

Value Conversion

Because the temperature value is signed, 0xF812 must first be interpreted as a signed 16-bit integer. Using two's complement:
Raw value = 0xF812

Invert bits:
0xF812 → 0x07ED

Add 1:
0x07ED + 1 = 0x07EE

0x07EE = 2030 decimal

Therefore:
Signed value = -2030

-2030 / 256 = -7.93 °C

Configuration Get/Set Overview

The following examples demonstrate how RS26x configuration parameters can be read and modified over LoRaWAN using Configuration Get and Configuration Set downlink messages. The test uses the Aggregation Mode parameter because its effect is easy to verify in subsequent Sensor Data uplinks: normal temperature data uses Tag 0x00, while Aggregation mode produces a longer payload using the Aggregated Temperature Tag 0x02. The examples show the raw downlink payload sent from TTI, the Configuration Data response returned by the RS26x, and the resulting change in the sensor uplink payload format.

Configuration Get

image-20260901-200054.png
00 14

Payload Visualization

00 | 14
│    │
│    └── Tag 0x14 = Aggregation Mode
└─────── API Version 0, Configuration Get

Configuration Data Response

01 C0 14 00

Payload Visualization

01 | C0 | 14 | 00
│    │    │    │
│    │    │    └── Value 0 = None
│    │    └─────── Tag 0x14 = Aggregation Mode
│    └──────────── Status = Good battery, no status flags
└───────────────── API Version 0, Configuration Data

Payload Breakdown

Byte(s)HexFieldDescriptionDecoded Value
001Message HeaderAPI Version + Message IdentifierAPI 0, Configuration Data
1C0Status ByteBattery + device statusGood battery
214TagAggregation ModeTag 20 decimal / 0x14
300ValueAggregation Mode enumerationNone
Tag 0x14 values map to:
0x00 = None
0x01 = Aggregation
0x02 = Averaging

Configuration Set – Enable Aggregation Mode

image-20260901-200828.png
01C013021401

Payload Visualization

01 | 13 | 02 | 14 | 01
│    │    │    │    │
│    │    │    │    └── Aggregation Mode = Aggregation
│    │    │    └─────── Tag 0x14 = Aggregation Mode
│    │    └──────────── Reading Aggregate Count = 2
│    └───────────────── Tag 0x13 = Reading Aggregate Count
└────────────────────── API Version 0, Configuration Set
The protocol defines Reading Aggregate Count as Tag 19 (0x13) and Aggregation Mode as Tag 20 (0x14). Aggregation Mode value 1 represents Aggregation.

Configuration Data Response

The RS26x responded with:

01C013021401

TTI decoded this as:

Reading Aggregate Count: 2
Aggregation Mode: "Aggregation"
Battery Status: "Good"

Response Visualization

01 | C0 | 13 | 02 | 14 | 01
│    │    │    │    │    │
│    │    │    │    │    └── Aggregation
│    │    │    │    └─────── Aggregation Mode
│    │    │    └──────────── Count = 2
│    │    └───────────────── Reading Aggregate Count
│    └────────────────────── Good battery, no status flags
└─────────────────────────── API Version 0, Configuration Data

The device acknowledges the downlink with a Configuration Data response. Configuration Data uplinks are used by the RS26x as responses to Configuration Get and Configuration Set messages.

Captured uplink payload following configuration update:

00C402026A97308814DB14E2
Tag 0x00 (Standard Temperature) is replaced by Tag 0x02 (Aggregated Temperature) in subsequent uplinks, and two readings are now contained in the same payload.

Payload Visualization

00 | C4 | 02 | 02 | 6A973088 | 14DB | 14E2
│    │    │    │        │        │       │
│    │    │    │        │        │       └── Reading #2 = 20.88 °C
│    │    │    │        │        └────────── Reading #1 = 20.86 °C
│    │    │    │        └─────────────────── Timestamp of first reading
│    │    │    └──────────────────────────── Count = 2
│    │    └───────────────────────────────── Tag 0x02 = Aggregated Temperature
│    └────────────────────────────────────── Good battery + Backlog Available
└─────────────────────────────────────────── API Version 0, Sensor Data

Payload Breakdown

Byte(s)HexFieldDescriptionDecoded Value
000Message HeaderAPI Version + Message IdentifierAPI 0, Sensor Data
1C4Status ByteBattery + device statusGood battery + Backlog Available
202TagAggregated TemperatureAggregated temperature data
302Reading CountNumber of readings2
4–76A 97 30 88TimestampTimestamp of first reading2026-09-01 20:07:36 UTC
8–914 DBTemperature #1Signed Q8 temperature20.86 °C
10–1114 E2Temperature #2Signed Q8 temperature20.88 °C

References