Skip to content

P1A LoRaWAN formát paketu

Pre zariadenia P1AP a P1AT od spoločnosti Moire Labs

Paket merania FPort == 1

Príklad celého paketu (HEX) (17 bajtov): 0x03 E5B8B441 0000C741 E5B8A441 0000C841
číslo bajtupríklad (HEX)popis
003Merná jednotka (megapascal - pozri tabulku nižšie)
1-4E5B8B441MIN hodnota: float - little endian (~22.590)
5-80000C741MAX hodnota: float - little endian (24.875)
9-12E5B8A441Priemerná hodnota: float - little endian (~20.590)
13-160000C841Posledná hodnota: float - little endian (25)

Merné jednotky

#define UNIT_TYPE_C   0     /**< C = stupeň Celzia */
#define UNIT_TYPE_PA  1     /**< Pa = pascal */
#define UNIT_TYPE_KPA 2     /**< kPa = kilopascal */
#define UNIT_TYPE_MPA 3     /**< MPa = megapascal */

Zavádzací paket FPort == 2

Príklad zavádzacieho paketu (HEX) (5 bajtov): 0x43 c8 41 2f ce
Zavádzací paket začína bajtom s hodnotou 0x43. Nasledujú ďalšie 4 bajty, ktoré nemajú definovanú hodnotu (môže to byť čokoľvek a je možné ich ignorovať). Tento paket je odoslaný iba raz zakaždým, keď sa zariadenie pripojí a zaregistruje do siete LoRaWAN, aby ho bolo možné použiť ako indikátor spustenia zariadenia.

Paket stavu batérie FPort == 3

Príklad paketu stavu batérie
číslo bajtupríklad (HEX)popis
00aúroveň batérie (0-255 nelineárne)

Príklady analyzátorov

Python3

#!/usr/bin/env python3

import struct
import argparse
from pprint import pprint


def parse(packet, fport):
    out = {"packet": "".join("{:02X}".format(x) for x in packet)}

    out["fport"] = fport
    if fport == 1:
        out["info"] = "This is a standard measurement packet."
    elif fport == 2:
        out["info"] = "This is a boot / test packet."
        return out
    elif fport == 3:
        out["info"] = "This is a BATTERY STATUS packet."
        out["battery_level_adc"] = int(packet[0])
        return out
    elif fport == 0x43:
        out[
            "info"
        ] = "This is a START packet. This packet is only sent once after device boots!"
        return out
    else:
        out["info"] = "Packet FPort unknown type -> 0x{:02x}! Aborting parsing.".format(
            fport
        )
        return out

    out["unit of measure"] = packet[0]

    out["MIN (float)"] = struct.unpack("<f", packet[1:5])[0]
    out["MAX (float)"] = struct.unpack("<f", packet[5:9])[0]
    out["AVG (float)"] = struct.unpack("<f", packet[9:13])[0]
    out["LAST (float)"] = struct.unpack("<f", packet[13:17])[0]

    return out


if __name__ == "__main__":

    parser = argparse.ArgumentParser(description="LoRaWAN packet parser")
    parser.add_argument(
        "--pl",
        default="03E5B8B4410000C741E5B8A4410000C841",
        action="store",
        help="Payload in hex",
    )
    parser.add_argument(
        "--fport",
        default=1,
        action="store",
        type=int,
        help="LoRaWAN FPort",
    )
    args = parser.parse_args()

    packet = bytes.fromhex(args.pl)

    print("Packet in HEX: 0x", end="")
    for p in packet:
        print("{:02X} ".format(p), end="")
    print()
    print("Packet in DEC: ", end="")
    for p in packet:
        print("{} ".format(int(p)), end="")
    print()

    data = parse(packet, args.fport)
    pprint(data)

ChirpStack / JavaScript

var units = ['C', 'Pa', 'kPa', 'MPa'];

function bytesToFloat(bytes) {
    "use strict";
    var bits = bytes[3]<<24 | bytes[2]<<16 | bytes[1]<<8 | bytes[0];
    var sign = (bits>>>31 === 0) ? 1.0 : -1.0;
    var e = bits>>>23 & 0xff;
    var m = (e === 0) ? (bits & 0x7fffff)<<1 : (bits & 0x7fffff) | 0x800000;
    var f = sign * m * Math.pow(2, e - 150);
    return f;
}

function Decode(fPort, bytes, variables) {
    "use strict";
    switch (input.fPort) {
        case 1:
            return {
                    unit: units[input.bytes[0]],
                    min_value: bytesToFloat(input.bytes.slice(1, 5)),
                    max_value: bytesToFloat(input.bytes.slice(5, 9)),
                    average_value: bytesToFloat(input.bytes.slice(9, 13)),
                    last_value: bytesToFloat(input.bytes.slice(13, 17))
            };
        default:
            return {
                errors: ['Unknown FPort - see device manual!'],
            };
    }
}

Podpora

Ak potrebujete podporu, kontaktujte priamo svojho distribútora alebo výrobcu prostredníctvom www.moirelabs.com