diff --git a/CHANGELOG.md b/CHANGELOG.md index eb9aecadac..fd8d0ef401 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,9 @@ For details about compatibility between different releases, see the **Commitment ### Added +- Add HSTS response headers. +- Draft band definition for Uzbekistan 923Mhz band. + ### Changed ### Deprecated @@ -21,7 +24,7 @@ For details about compatibility between different releases, see the **Commitment ### Security -## [3.35.1] - unreleased +## [3.35.1] - 2025-12-19 ## [3.35.0] - 2025-11-19 diff --git a/data/lorawan-devices b/data/lorawan-devices index 13f274a1eb..2857b28165 160000 --- a/data/lorawan-devices +++ b/data/lorawan-devices @@ -1 +1 @@ -Subproject commit 13f274a1eb59abfe6d198d1a0d19a7b452edd9cc +Subproject commit 2857b28165e74bcae928e2b3b05dd61eba3dd123 diff --git a/data/lorawan-frequency-plans b/data/lorawan-frequency-plans index 2d3697dc60..503a9774d8 160000 --- a/data/lorawan-frequency-plans +++ b/data/lorawan-frequency-plans @@ -1 +1 @@ -Subproject commit 2d3697dc60472e55d079b86deb639a204706a46a +Subproject commit 503a9774d84140e7e177a6b3a025b9f25412681d diff --git a/data/lorawan-webhook-templates b/data/lorawan-webhook-templates index 7f68f89256..509f33d2e4 160000 --- a/data/lorawan-webhook-templates +++ b/data/lorawan-webhook-templates @@ -1 +1 @@ -Subproject commit 7f68f8925644916a2e4bbdf1919d621648412a88 +Subproject commit 509f33d2e4dc5baa5b88a4e2b48deebcaf412b90 diff --git a/package.json b/package.json index 42fff6cab5..bb4bc525a0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ttn-stack", - "version": "3.35.0", + "version": "3.35.1", "description": "The Things Stack", "main": "index.js", "repository": "https://github.com/TheThingsNetwork/lorawan-stack.git", diff --git a/pkg/band/all.go b/pkg/band/all.go index 895f5005d9..b8adc67414 100644 --- a/pkg/band/all.go +++ b/pkg/band/all.go @@ -214,6 +214,20 @@ var ( ttnpb.PHYVersion_RP002_V1_0_3: US_902_928_RP2_V1_0_3, ttnpb.PHYVersion_RP002_V1_0_4: US_902_928_RP2_V1_0_4, }, + UZ_923_DRAFT: { + ttnpb.PHYVersion_TS001_V1_0: UZ_923_Draft_Universal, + ttnpb.PHYVersion_TS001_V1_0_1: UZ_923_Draft_Universal, + ttnpb.PHYVersion_RP001_V1_0_2: UZ_923_Draft_Universal, + ttnpb.PHYVersion_RP001_V1_0_2_REV_B: UZ_923_Draft_Universal, + ttnpb.PHYVersion_RP001_V1_0_3_REV_A: UZ_923_Draft_Universal, + ttnpb.PHYVersion_RP001_V1_1_REV_A: UZ_923_Draft_Universal, + ttnpb.PHYVersion_RP001_V1_1_REV_B: UZ_923_Draft_Universal, + ttnpb.PHYVersion_RP002_V1_0_0: UZ_923_Draft_Universal, + ttnpb.PHYVersion_RP002_V1_0_1: UZ_923_Draft_Universal, + ttnpb.PHYVersion_RP002_V1_0_2: UZ_923_Draft_Universal, + ttnpb.PHYVersion_RP002_V1_0_3: UZ_923_Draft_Universal, + ttnpb.PHYVersion_RP002_V1_0_4: UZ_923_Draft_Universal, + }, } // LatestVersion contains the latest version of each band. @@ -237,6 +251,7 @@ var ( MA_869_870_DRAFT: ttnpb.PHYVersion_RP002_V1_0_4, RU_864_870: ttnpb.PHYVersion_RP002_V1_0_4, US_902_928: ttnpb.PHYVersion_RP002_V1_0_4, + UZ_923_DRAFT: ttnpb.PHYVersion_RP002_V1_0_4, } ) diff --git a/pkg/band/band_test.go b/pkg/band/band_test.go index d553953eb3..0e0ef5198b 100644 --- a/pkg/band/band_test.go +++ b/pkg/band/band_test.go @@ -1807,7 +1807,8 @@ func TestStrictCodingRateSanityCheck(t *testing.T) { t.Parallel() if version >= ttnpb.PHYVersion_RP002_V1_0_0 || strings.HasPrefix(bandID, "MA") || - strings.HasPrefix(bandID, "ISM") { + strings.HasPrefix(bandID, "ISM") || + strings.HasPrefix(bandID, "UZ") { if !b.StrictCodingRate { t.Errorf("Strict coding rate doesn't match expected. Want true, got %v.", b.StrictCodingRate) } diff --git a/pkg/band/rpc_test.go b/pkg/band/rpc_test.go index 1d20ea90d8..cc4bdd3bdb 100644 --- a/pkg/band/rpc_test.go +++ b/pkg/band/rpc_test.go @@ -372,6 +372,23 @@ func TestGetPhyVersions(t *testing.T) { ttnpb.PHYVersion_TS001_V1_0, }, }, + { + BandId: "UZ_923_DRAFT", + PhyVersions: []ttnpb.PHYVersion{ + ttnpb.PHYVersion_RP002_V1_0_4, + ttnpb.PHYVersion_RP002_V1_0_3, + ttnpb.PHYVersion_RP002_V1_0_2, + ttnpb.PHYVersion_RP002_V1_0_1, + ttnpb.PHYVersion_RP002_V1_0_0, + ttnpb.PHYVersion_RP001_V1_0_3_REV_A, + ttnpb.PHYVersion_RP001_V1_1_REV_B, + ttnpb.PHYVersion_RP001_V1_1_REV_A, + ttnpb.PHYVersion_RP001_V1_0_2_REV_B, + ttnpb.PHYVersion_RP001_V1_0_2, + ttnpb.PHYVersion_TS001_V1_0_1, + ttnpb.PHYVersion_TS001_V1_0, + }, + }, }, }, }, @@ -868,6 +885,9 @@ func TestListBands(t *testing.T) { MA_869_870_DRAFT: { ttnpb.PHYVersion_TS001_V1_0_1: All[MA_869_870_DRAFT][ttnpb.PHYVersion_TS001_V1_0_1], }, + UZ_923_DRAFT: { + ttnpb.PHYVersion_TS001_V1_0_1: All[UZ_923_DRAFT][ttnpb.PHYVersion_TS001_V1_0_1], + }, }), }, }, diff --git a/pkg/band/shared_test.go b/pkg/band/shared_test.go index 1959d77776..162d983078 100644 --- a/pkg/band/shared_test.go +++ b/pkg/band/shared_test.go @@ -36,7 +36,8 @@ func TestRelaySharedParameters(t *testing.T) { switch { case version == ttnpb.PHYVersion_RP002_V1_0_4, name == band.ISM_2400, - name == band.MA_869_870_DRAFT: + name == band.MA_869_870_DRAFT, + name == band.UZ_923_DRAFT: expectedForwardDelay, expectedReceiveDelay = 50*time.Millisecond, 18*time.Second } a.So(phy.RelayForwardDelay, should.Equal, expectedForwardDelay) diff --git a/pkg/band/testdata/UZ_923_DRAFT_PHY_V1_0.json b/pkg/band/testdata/UZ_923_DRAFT_PHY_V1_0.json new file mode 100644 index 0000000000..5f1fe7f280 --- /dev/null +++ b/pkg/band/testdata/UZ_923_DRAFT_PHY_V1_0.json @@ -0,0 +1,512 @@ +{ + "ID": "UZ_923_DRAFT", + "Beacon": { + "DataRateIndex": 3, + "CodingRate": "4/5", + "Frequencies": [ + 926600000 + ] + }, + "PingSlotFrequencies": [ + 926600000 + ], + "MaxUplinkChannels": 16, + "UplinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "MaxDownlinkChannels": 16, + "DownlinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "SubBands": [ + { + "MinFrequency": 926200000, + "MaxFrequency": 926800000, + "DutyCycle": 0.01, + "MaxEIRP": 16 + } + ], + "DataRates": { + "0": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 12, + "coding_rate": "4/5" + } + } + }, + "1": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 11, + "coding_rate": "4/5" + } + } + }, + "2": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 10, + "coding_rate": "4/5" + } + } + }, + "3": { + "MaxMACPayloadSize": { + "false": 123, + "true": 123 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 9, + "coding_rate": "4/5" + } + } + }, + "4": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 8, + "coding_rate": "4/5" + } + } + }, + "5": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 7, + "coding_rate": "4/5" + } + } + } + }, + "StrictCodingRate": true, + "FreqMultiplier": 100, + "ImplementsCFList": true, + "CFListType": "FREQUENCIES", + "SupportsDynamicADR": true, + "TxOffset": [ + 0, + -2, + -4, + -6, + -8, + -10, + -12, + -14 + ], + "MaxADRDataRateIndex": 5, + "TxParamSetupReqSupport": false, + "DefaultMaxEIRP": 16, + "Rx1Channel": { + "0": 0, + "1": 1, + "10": 10, + "100": 100, + "101": 101, + "102": 102, + "103": 103, + "104": 104, + "105": 105, + "106": 106, + "107": 107, + "108": 108, + "109": 109, + "11": 11, + "110": 110, + "111": 111, + "112": 112, + "113": 113, + "114": 114, + "115": 115, + "116": 116, + "117": 117, + "118": 118, + "119": 119, + "12": 12, + "120": 120, + "121": 121, + "122": 122, + "123": 123, + "124": 124, + "125": 125, + "126": 126, + "127": 127, + "128": 128, + "129": 129, + "13": 13, + "130": 130, + "131": 131, + "132": 132, + "133": 133, + "134": 134, + "135": 135, + "136": 136, + "137": 137, + "138": 138, + "139": 139, + "14": 14, + "140": 140, + "141": 141, + "142": 142, + "143": 143, + "144": 144, + "145": 145, + "146": 146, + "147": 147, + "148": 148, + "149": 149, + "15": 15, + "150": 150, + "151": 151, + "152": 152, + "153": 153, + "154": 154, + "155": 155, + "156": 156, + "157": 157, + "158": 158, + "159": 159, + "16": 16, + "160": 160, + "161": 161, + "162": 162, + "163": 163, + "164": 164, + "165": 165, + "166": 166, + "167": 167, + "168": 168, + "169": 169, + "17": 17, + "170": 170, + "171": 171, + "172": 172, + "173": 173, + "174": 174, + "175": 175, + "176": 176, + "177": 177, + "178": 178, + "179": 179, + "18": 18, + "180": 180, + "181": 181, + "182": 182, + "183": 183, + "184": 184, + "185": 185, + "186": 186, + "187": 187, + "188": 188, + "189": 189, + "19": 19, + "190": 190, + "191": 191, + "192": 192, + "193": 193, + "194": 194, + "195": 195, + "196": 196, + "197": 197, + "198": 198, + "199": 199, + "2": 2, + "20": 20, + "200": 200, + "201": 201, + "202": 202, + "203": 203, + "204": 204, + "205": 205, + "206": 206, + "207": 207, + "208": 208, + "209": 209, + "21": 21, + "210": 210, + "211": 211, + "212": 212, + "213": 213, + "214": 214, + "215": 215, + "216": 216, + "217": 217, + "218": 218, + "219": 219, + "22": 22, + "220": 220, + "221": 221, + "222": 222, + "223": 223, + "224": 224, + "225": 225, + "226": 226, + "227": 227, + "228": 228, + "229": 229, + "23": 23, + "230": 230, + "231": 231, + "232": 232, + "233": 233, + "234": 234, + "235": 235, + "236": 236, + "237": 237, + "238": 238, + "239": 239, + "24": 24, + "240": 240, + "241": 241, + "242": 242, + "243": 243, + "244": 244, + "245": 245, + "246": 246, + "247": 247, + "248": 248, + "249": 249, + "25": 25, + "250": 250, + "251": 251, + "252": 252, + "253": 253, + "254": 254, + "255": 255, + "26": 26, + "27": 27, + "28": 28, + "29": 29, + "3": 3, + "30": 30, + "31": 31, + "32": 32, + "33": 33, + "34": 34, + "35": 35, + "36": 36, + "37": 37, + "38": 38, + "39": 39, + "4": 4, + "40": 40, + "41": 41, + "42": 42, + "43": 43, + "44": 44, + "45": 45, + "46": 46, + "47": 47, + "48": 48, + "49": 49, + "5": 5, + "50": 50, + "51": 51, + "52": 52, + "53": 53, + "54": 54, + "55": 55, + "56": 56, + "57": 57, + "58": 58, + "59": 59, + "6": 6, + "60": 60, + "61": 61, + "62": 62, + "63": 63, + "64": 64, + "65": 65, + "66": 66, + "67": 67, + "68": 68, + "69": 69, + "7": 7, + "70": 70, + "71": 71, + "72": 72, + "73": 73, + "74": 74, + "75": 75, + "76": 76, + "77": 77, + "78": 78, + "79": 79, + "8": 8, + "80": 80, + "81": 81, + "82": 82, + "83": 83, + "84": 84, + "85": 85, + "86": 86, + "87": 87, + "88": 88, + "89": 89, + "9": 9, + "90": 90, + "91": 91, + "92": 92, + "93": 93, + "94": 94, + "95": 95, + "96": 96, + "97": 97, + "98": 98, + "99": 99 + }, + "Rx1DataRate": { + "0_0_false": 0, + "0_0_true": 0, + "0_1_false": 0, + "0_1_true": 0, + "0_2_false": 0, + "0_2_true": 0, + "0_3_false": 0, + "0_3_true": 0, + "0_4_false": 0, + "0_4_true": 0, + "0_5_false": 0, + "0_5_true": 0, + "1_0_false": 1, + "1_0_true": 1, + "1_1_false": 0, + "1_1_true": 0, + "1_2_false": 0, + "1_2_true": 0, + "1_3_false": 0, + "1_3_true": 0, + "1_4_false": 0, + "1_4_true": 0, + "1_5_false": 0, + "1_5_true": 0, + "2_0_false": 2, + "2_0_true": 2, + "2_1_false": 1, + "2_1_true": 1, + "2_2_false": 0, + "2_2_true": 0, + "2_3_false": 0, + "2_3_true": 0, + "2_4_false": 0, + "2_4_true": 0, + "2_5_false": 0, + "2_5_true": 0, + "3_0_false": 3, + "3_0_true": 3, + "3_1_false": 2, + "3_1_true": 2, + "3_2_false": 1, + "3_2_true": 1, + "3_3_false": 0, + "3_3_true": 0, + "3_4_false": 0, + "3_4_true": 0, + "3_5_false": 0, + "3_5_true": 0, + "4_0_false": 4, + "4_0_true": 4, + "4_1_false": 3, + "4_1_true": 3, + "4_2_false": 2, + "4_2_true": 2, + "4_3_false": 1, + "4_3_true": 1, + "4_4_false": 0, + "4_4_true": 0, + "4_5_false": 0, + "4_5_true": 0, + "5_0_false": 5, + "5_0_true": 5, + "5_1_false": 4, + "5_1_true": 4, + "5_2_false": 3, + "5_2_true": 3, + "5_3_false": 2, + "5_3_true": 2, + "5_4_false": 1, + "5_4_true": 1, + "5_5_false": 0, + "5_5_true": 0 + }, + "DefaultRx2Parameters": { + "DataRateIndex": 2, + "Frequency": 926200000 + }, + "BootDwellTime": { + "Uplinks": null, + "Downlinks": null + }, + "Relay": { + "WORChannels": null + }, + "SharedParameters": { + "ReceiveDelay1": 1000000000, + "ReceiveDelay2": 2000000000, + "JoinAcceptDelay1": 5000000000, + "JoinAcceptDelay2": 6000000000, + "MaxFCntGap": 16384, + "ADRAckLimit": "ADR_ACK_LIMIT_64", + "ADRAckDelay": "ADR_ACK_DELAY_32", + "MinRetransmitTimeout": 1000000000, + "MaxRetransmitTimeout": 3000000000, + "RelayForwardDelay": 50000000, + "RelayReceiveDelay": 18000000000, + "ServedRelayBackoff": 8 + } +} \ No newline at end of file diff --git a/pkg/band/testdata/UZ_923_DRAFT_PHY_V1_0_1.json b/pkg/band/testdata/UZ_923_DRAFT_PHY_V1_0_1.json new file mode 100644 index 0000000000..5f1fe7f280 --- /dev/null +++ b/pkg/band/testdata/UZ_923_DRAFT_PHY_V1_0_1.json @@ -0,0 +1,512 @@ +{ + "ID": "UZ_923_DRAFT", + "Beacon": { + "DataRateIndex": 3, + "CodingRate": "4/5", + "Frequencies": [ + 926600000 + ] + }, + "PingSlotFrequencies": [ + 926600000 + ], + "MaxUplinkChannels": 16, + "UplinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "MaxDownlinkChannels": 16, + "DownlinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "SubBands": [ + { + "MinFrequency": 926200000, + "MaxFrequency": 926800000, + "DutyCycle": 0.01, + "MaxEIRP": 16 + } + ], + "DataRates": { + "0": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 12, + "coding_rate": "4/5" + } + } + }, + "1": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 11, + "coding_rate": "4/5" + } + } + }, + "2": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 10, + "coding_rate": "4/5" + } + } + }, + "3": { + "MaxMACPayloadSize": { + "false": 123, + "true": 123 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 9, + "coding_rate": "4/5" + } + } + }, + "4": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 8, + "coding_rate": "4/5" + } + } + }, + "5": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 7, + "coding_rate": "4/5" + } + } + } + }, + "StrictCodingRate": true, + "FreqMultiplier": 100, + "ImplementsCFList": true, + "CFListType": "FREQUENCIES", + "SupportsDynamicADR": true, + "TxOffset": [ + 0, + -2, + -4, + -6, + -8, + -10, + -12, + -14 + ], + "MaxADRDataRateIndex": 5, + "TxParamSetupReqSupport": false, + "DefaultMaxEIRP": 16, + "Rx1Channel": { + "0": 0, + "1": 1, + "10": 10, + "100": 100, + "101": 101, + "102": 102, + "103": 103, + "104": 104, + "105": 105, + "106": 106, + "107": 107, + "108": 108, + "109": 109, + "11": 11, + "110": 110, + "111": 111, + "112": 112, + "113": 113, + "114": 114, + "115": 115, + "116": 116, + "117": 117, + "118": 118, + "119": 119, + "12": 12, + "120": 120, + "121": 121, + "122": 122, + "123": 123, + "124": 124, + "125": 125, + "126": 126, + "127": 127, + "128": 128, + "129": 129, + "13": 13, + "130": 130, + "131": 131, + "132": 132, + "133": 133, + "134": 134, + "135": 135, + "136": 136, + "137": 137, + "138": 138, + "139": 139, + "14": 14, + "140": 140, + "141": 141, + "142": 142, + "143": 143, + "144": 144, + "145": 145, + "146": 146, + "147": 147, + "148": 148, + "149": 149, + "15": 15, + "150": 150, + "151": 151, + "152": 152, + "153": 153, + "154": 154, + "155": 155, + "156": 156, + "157": 157, + "158": 158, + "159": 159, + "16": 16, + "160": 160, + "161": 161, + "162": 162, + "163": 163, + "164": 164, + "165": 165, + "166": 166, + "167": 167, + "168": 168, + "169": 169, + "17": 17, + "170": 170, + "171": 171, + "172": 172, + "173": 173, + "174": 174, + "175": 175, + "176": 176, + "177": 177, + "178": 178, + "179": 179, + "18": 18, + "180": 180, + "181": 181, + "182": 182, + "183": 183, + "184": 184, + "185": 185, + "186": 186, + "187": 187, + "188": 188, + "189": 189, + "19": 19, + "190": 190, + "191": 191, + "192": 192, + "193": 193, + "194": 194, + "195": 195, + "196": 196, + "197": 197, + "198": 198, + "199": 199, + "2": 2, + "20": 20, + "200": 200, + "201": 201, + "202": 202, + "203": 203, + "204": 204, + "205": 205, + "206": 206, + "207": 207, + "208": 208, + "209": 209, + "21": 21, + "210": 210, + "211": 211, + "212": 212, + "213": 213, + "214": 214, + "215": 215, + "216": 216, + "217": 217, + "218": 218, + "219": 219, + "22": 22, + "220": 220, + "221": 221, + "222": 222, + "223": 223, + "224": 224, + "225": 225, + "226": 226, + "227": 227, + "228": 228, + "229": 229, + "23": 23, + "230": 230, + "231": 231, + "232": 232, + "233": 233, + "234": 234, + "235": 235, + "236": 236, + "237": 237, + "238": 238, + "239": 239, + "24": 24, + "240": 240, + "241": 241, + "242": 242, + "243": 243, + "244": 244, + "245": 245, + "246": 246, + "247": 247, + "248": 248, + "249": 249, + "25": 25, + "250": 250, + "251": 251, + "252": 252, + "253": 253, + "254": 254, + "255": 255, + "26": 26, + "27": 27, + "28": 28, + "29": 29, + "3": 3, + "30": 30, + "31": 31, + "32": 32, + "33": 33, + "34": 34, + "35": 35, + "36": 36, + "37": 37, + "38": 38, + "39": 39, + "4": 4, + "40": 40, + "41": 41, + "42": 42, + "43": 43, + "44": 44, + "45": 45, + "46": 46, + "47": 47, + "48": 48, + "49": 49, + "5": 5, + "50": 50, + "51": 51, + "52": 52, + "53": 53, + "54": 54, + "55": 55, + "56": 56, + "57": 57, + "58": 58, + "59": 59, + "6": 6, + "60": 60, + "61": 61, + "62": 62, + "63": 63, + "64": 64, + "65": 65, + "66": 66, + "67": 67, + "68": 68, + "69": 69, + "7": 7, + "70": 70, + "71": 71, + "72": 72, + "73": 73, + "74": 74, + "75": 75, + "76": 76, + "77": 77, + "78": 78, + "79": 79, + "8": 8, + "80": 80, + "81": 81, + "82": 82, + "83": 83, + "84": 84, + "85": 85, + "86": 86, + "87": 87, + "88": 88, + "89": 89, + "9": 9, + "90": 90, + "91": 91, + "92": 92, + "93": 93, + "94": 94, + "95": 95, + "96": 96, + "97": 97, + "98": 98, + "99": 99 + }, + "Rx1DataRate": { + "0_0_false": 0, + "0_0_true": 0, + "0_1_false": 0, + "0_1_true": 0, + "0_2_false": 0, + "0_2_true": 0, + "0_3_false": 0, + "0_3_true": 0, + "0_4_false": 0, + "0_4_true": 0, + "0_5_false": 0, + "0_5_true": 0, + "1_0_false": 1, + "1_0_true": 1, + "1_1_false": 0, + "1_1_true": 0, + "1_2_false": 0, + "1_2_true": 0, + "1_3_false": 0, + "1_3_true": 0, + "1_4_false": 0, + "1_4_true": 0, + "1_5_false": 0, + "1_5_true": 0, + "2_0_false": 2, + "2_0_true": 2, + "2_1_false": 1, + "2_1_true": 1, + "2_2_false": 0, + "2_2_true": 0, + "2_3_false": 0, + "2_3_true": 0, + "2_4_false": 0, + "2_4_true": 0, + "2_5_false": 0, + "2_5_true": 0, + "3_0_false": 3, + "3_0_true": 3, + "3_1_false": 2, + "3_1_true": 2, + "3_2_false": 1, + "3_2_true": 1, + "3_3_false": 0, + "3_3_true": 0, + "3_4_false": 0, + "3_4_true": 0, + "3_5_false": 0, + "3_5_true": 0, + "4_0_false": 4, + "4_0_true": 4, + "4_1_false": 3, + "4_1_true": 3, + "4_2_false": 2, + "4_2_true": 2, + "4_3_false": 1, + "4_3_true": 1, + "4_4_false": 0, + "4_4_true": 0, + "4_5_false": 0, + "4_5_true": 0, + "5_0_false": 5, + "5_0_true": 5, + "5_1_false": 4, + "5_1_true": 4, + "5_2_false": 3, + "5_2_true": 3, + "5_3_false": 2, + "5_3_true": 2, + "5_4_false": 1, + "5_4_true": 1, + "5_5_false": 0, + "5_5_true": 0 + }, + "DefaultRx2Parameters": { + "DataRateIndex": 2, + "Frequency": 926200000 + }, + "BootDwellTime": { + "Uplinks": null, + "Downlinks": null + }, + "Relay": { + "WORChannels": null + }, + "SharedParameters": { + "ReceiveDelay1": 1000000000, + "ReceiveDelay2": 2000000000, + "JoinAcceptDelay1": 5000000000, + "JoinAcceptDelay2": 6000000000, + "MaxFCntGap": 16384, + "ADRAckLimit": "ADR_ACK_LIMIT_64", + "ADRAckDelay": "ADR_ACK_DELAY_32", + "MinRetransmitTimeout": 1000000000, + "MaxRetransmitTimeout": 3000000000, + "RelayForwardDelay": 50000000, + "RelayReceiveDelay": 18000000000, + "ServedRelayBackoff": 8 + } +} \ No newline at end of file diff --git a/pkg/band/testdata/UZ_923_DRAFT_PHY_V1_0_2_REV_A.json b/pkg/band/testdata/UZ_923_DRAFT_PHY_V1_0_2_REV_A.json new file mode 100644 index 0000000000..5f1fe7f280 --- /dev/null +++ b/pkg/band/testdata/UZ_923_DRAFT_PHY_V1_0_2_REV_A.json @@ -0,0 +1,512 @@ +{ + "ID": "UZ_923_DRAFT", + "Beacon": { + "DataRateIndex": 3, + "CodingRate": "4/5", + "Frequencies": [ + 926600000 + ] + }, + "PingSlotFrequencies": [ + 926600000 + ], + "MaxUplinkChannels": 16, + "UplinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "MaxDownlinkChannels": 16, + "DownlinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "SubBands": [ + { + "MinFrequency": 926200000, + "MaxFrequency": 926800000, + "DutyCycle": 0.01, + "MaxEIRP": 16 + } + ], + "DataRates": { + "0": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 12, + "coding_rate": "4/5" + } + } + }, + "1": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 11, + "coding_rate": "4/5" + } + } + }, + "2": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 10, + "coding_rate": "4/5" + } + } + }, + "3": { + "MaxMACPayloadSize": { + "false": 123, + "true": 123 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 9, + "coding_rate": "4/5" + } + } + }, + "4": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 8, + "coding_rate": "4/5" + } + } + }, + "5": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 7, + "coding_rate": "4/5" + } + } + } + }, + "StrictCodingRate": true, + "FreqMultiplier": 100, + "ImplementsCFList": true, + "CFListType": "FREQUENCIES", + "SupportsDynamicADR": true, + "TxOffset": [ + 0, + -2, + -4, + -6, + -8, + -10, + -12, + -14 + ], + "MaxADRDataRateIndex": 5, + "TxParamSetupReqSupport": false, + "DefaultMaxEIRP": 16, + "Rx1Channel": { + "0": 0, + "1": 1, + "10": 10, + "100": 100, + "101": 101, + "102": 102, + "103": 103, + "104": 104, + "105": 105, + "106": 106, + "107": 107, + "108": 108, + "109": 109, + "11": 11, + "110": 110, + "111": 111, + "112": 112, + "113": 113, + "114": 114, + "115": 115, + "116": 116, + "117": 117, + "118": 118, + "119": 119, + "12": 12, + "120": 120, + "121": 121, + "122": 122, + "123": 123, + "124": 124, + "125": 125, + "126": 126, + "127": 127, + "128": 128, + "129": 129, + "13": 13, + "130": 130, + "131": 131, + "132": 132, + "133": 133, + "134": 134, + "135": 135, + "136": 136, + "137": 137, + "138": 138, + "139": 139, + "14": 14, + "140": 140, + "141": 141, + "142": 142, + "143": 143, + "144": 144, + "145": 145, + "146": 146, + "147": 147, + "148": 148, + "149": 149, + "15": 15, + "150": 150, + "151": 151, + "152": 152, + "153": 153, + "154": 154, + "155": 155, + "156": 156, + "157": 157, + "158": 158, + "159": 159, + "16": 16, + "160": 160, + "161": 161, + "162": 162, + "163": 163, + "164": 164, + "165": 165, + "166": 166, + "167": 167, + "168": 168, + "169": 169, + "17": 17, + "170": 170, + "171": 171, + "172": 172, + "173": 173, + "174": 174, + "175": 175, + "176": 176, + "177": 177, + "178": 178, + "179": 179, + "18": 18, + "180": 180, + "181": 181, + "182": 182, + "183": 183, + "184": 184, + "185": 185, + "186": 186, + "187": 187, + "188": 188, + "189": 189, + "19": 19, + "190": 190, + "191": 191, + "192": 192, + "193": 193, + "194": 194, + "195": 195, + "196": 196, + "197": 197, + "198": 198, + "199": 199, + "2": 2, + "20": 20, + "200": 200, + "201": 201, + "202": 202, + "203": 203, + "204": 204, + "205": 205, + "206": 206, + "207": 207, + "208": 208, + "209": 209, + "21": 21, + "210": 210, + "211": 211, + "212": 212, + "213": 213, + "214": 214, + "215": 215, + "216": 216, + "217": 217, + "218": 218, + "219": 219, + "22": 22, + "220": 220, + "221": 221, + "222": 222, + "223": 223, + "224": 224, + "225": 225, + "226": 226, + "227": 227, + "228": 228, + "229": 229, + "23": 23, + "230": 230, + "231": 231, + "232": 232, + "233": 233, + "234": 234, + "235": 235, + "236": 236, + "237": 237, + "238": 238, + "239": 239, + "24": 24, + "240": 240, + "241": 241, + "242": 242, + "243": 243, + "244": 244, + "245": 245, + "246": 246, + "247": 247, + "248": 248, + "249": 249, + "25": 25, + "250": 250, + "251": 251, + "252": 252, + "253": 253, + "254": 254, + "255": 255, + "26": 26, + "27": 27, + "28": 28, + "29": 29, + "3": 3, + "30": 30, + "31": 31, + "32": 32, + "33": 33, + "34": 34, + "35": 35, + "36": 36, + "37": 37, + "38": 38, + "39": 39, + "4": 4, + "40": 40, + "41": 41, + "42": 42, + "43": 43, + "44": 44, + "45": 45, + "46": 46, + "47": 47, + "48": 48, + "49": 49, + "5": 5, + "50": 50, + "51": 51, + "52": 52, + "53": 53, + "54": 54, + "55": 55, + "56": 56, + "57": 57, + "58": 58, + "59": 59, + "6": 6, + "60": 60, + "61": 61, + "62": 62, + "63": 63, + "64": 64, + "65": 65, + "66": 66, + "67": 67, + "68": 68, + "69": 69, + "7": 7, + "70": 70, + "71": 71, + "72": 72, + "73": 73, + "74": 74, + "75": 75, + "76": 76, + "77": 77, + "78": 78, + "79": 79, + "8": 8, + "80": 80, + "81": 81, + "82": 82, + "83": 83, + "84": 84, + "85": 85, + "86": 86, + "87": 87, + "88": 88, + "89": 89, + "9": 9, + "90": 90, + "91": 91, + "92": 92, + "93": 93, + "94": 94, + "95": 95, + "96": 96, + "97": 97, + "98": 98, + "99": 99 + }, + "Rx1DataRate": { + "0_0_false": 0, + "0_0_true": 0, + "0_1_false": 0, + "0_1_true": 0, + "0_2_false": 0, + "0_2_true": 0, + "0_3_false": 0, + "0_3_true": 0, + "0_4_false": 0, + "0_4_true": 0, + "0_5_false": 0, + "0_5_true": 0, + "1_0_false": 1, + "1_0_true": 1, + "1_1_false": 0, + "1_1_true": 0, + "1_2_false": 0, + "1_2_true": 0, + "1_3_false": 0, + "1_3_true": 0, + "1_4_false": 0, + "1_4_true": 0, + "1_5_false": 0, + "1_5_true": 0, + "2_0_false": 2, + "2_0_true": 2, + "2_1_false": 1, + "2_1_true": 1, + "2_2_false": 0, + "2_2_true": 0, + "2_3_false": 0, + "2_3_true": 0, + "2_4_false": 0, + "2_4_true": 0, + "2_5_false": 0, + "2_5_true": 0, + "3_0_false": 3, + "3_0_true": 3, + "3_1_false": 2, + "3_1_true": 2, + "3_2_false": 1, + "3_2_true": 1, + "3_3_false": 0, + "3_3_true": 0, + "3_4_false": 0, + "3_4_true": 0, + "3_5_false": 0, + "3_5_true": 0, + "4_0_false": 4, + "4_0_true": 4, + "4_1_false": 3, + "4_1_true": 3, + "4_2_false": 2, + "4_2_true": 2, + "4_3_false": 1, + "4_3_true": 1, + "4_4_false": 0, + "4_4_true": 0, + "4_5_false": 0, + "4_5_true": 0, + "5_0_false": 5, + "5_0_true": 5, + "5_1_false": 4, + "5_1_true": 4, + "5_2_false": 3, + "5_2_true": 3, + "5_3_false": 2, + "5_3_true": 2, + "5_4_false": 1, + "5_4_true": 1, + "5_5_false": 0, + "5_5_true": 0 + }, + "DefaultRx2Parameters": { + "DataRateIndex": 2, + "Frequency": 926200000 + }, + "BootDwellTime": { + "Uplinks": null, + "Downlinks": null + }, + "Relay": { + "WORChannels": null + }, + "SharedParameters": { + "ReceiveDelay1": 1000000000, + "ReceiveDelay2": 2000000000, + "JoinAcceptDelay1": 5000000000, + "JoinAcceptDelay2": 6000000000, + "MaxFCntGap": 16384, + "ADRAckLimit": "ADR_ACK_LIMIT_64", + "ADRAckDelay": "ADR_ACK_DELAY_32", + "MinRetransmitTimeout": 1000000000, + "MaxRetransmitTimeout": 3000000000, + "RelayForwardDelay": 50000000, + "RelayReceiveDelay": 18000000000, + "ServedRelayBackoff": 8 + } +} \ No newline at end of file diff --git a/pkg/band/testdata/UZ_923_DRAFT_PHY_V1_0_2_REV_B.json b/pkg/band/testdata/UZ_923_DRAFT_PHY_V1_0_2_REV_B.json new file mode 100644 index 0000000000..5f1fe7f280 --- /dev/null +++ b/pkg/band/testdata/UZ_923_DRAFT_PHY_V1_0_2_REV_B.json @@ -0,0 +1,512 @@ +{ + "ID": "UZ_923_DRAFT", + "Beacon": { + "DataRateIndex": 3, + "CodingRate": "4/5", + "Frequencies": [ + 926600000 + ] + }, + "PingSlotFrequencies": [ + 926600000 + ], + "MaxUplinkChannels": 16, + "UplinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "MaxDownlinkChannels": 16, + "DownlinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "SubBands": [ + { + "MinFrequency": 926200000, + "MaxFrequency": 926800000, + "DutyCycle": 0.01, + "MaxEIRP": 16 + } + ], + "DataRates": { + "0": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 12, + "coding_rate": "4/5" + } + } + }, + "1": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 11, + "coding_rate": "4/5" + } + } + }, + "2": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 10, + "coding_rate": "4/5" + } + } + }, + "3": { + "MaxMACPayloadSize": { + "false": 123, + "true": 123 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 9, + "coding_rate": "4/5" + } + } + }, + "4": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 8, + "coding_rate": "4/5" + } + } + }, + "5": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 7, + "coding_rate": "4/5" + } + } + } + }, + "StrictCodingRate": true, + "FreqMultiplier": 100, + "ImplementsCFList": true, + "CFListType": "FREQUENCIES", + "SupportsDynamicADR": true, + "TxOffset": [ + 0, + -2, + -4, + -6, + -8, + -10, + -12, + -14 + ], + "MaxADRDataRateIndex": 5, + "TxParamSetupReqSupport": false, + "DefaultMaxEIRP": 16, + "Rx1Channel": { + "0": 0, + "1": 1, + "10": 10, + "100": 100, + "101": 101, + "102": 102, + "103": 103, + "104": 104, + "105": 105, + "106": 106, + "107": 107, + "108": 108, + "109": 109, + "11": 11, + "110": 110, + "111": 111, + "112": 112, + "113": 113, + "114": 114, + "115": 115, + "116": 116, + "117": 117, + "118": 118, + "119": 119, + "12": 12, + "120": 120, + "121": 121, + "122": 122, + "123": 123, + "124": 124, + "125": 125, + "126": 126, + "127": 127, + "128": 128, + "129": 129, + "13": 13, + "130": 130, + "131": 131, + "132": 132, + "133": 133, + "134": 134, + "135": 135, + "136": 136, + "137": 137, + "138": 138, + "139": 139, + "14": 14, + "140": 140, + "141": 141, + "142": 142, + "143": 143, + "144": 144, + "145": 145, + "146": 146, + "147": 147, + "148": 148, + "149": 149, + "15": 15, + "150": 150, + "151": 151, + "152": 152, + "153": 153, + "154": 154, + "155": 155, + "156": 156, + "157": 157, + "158": 158, + "159": 159, + "16": 16, + "160": 160, + "161": 161, + "162": 162, + "163": 163, + "164": 164, + "165": 165, + "166": 166, + "167": 167, + "168": 168, + "169": 169, + "17": 17, + "170": 170, + "171": 171, + "172": 172, + "173": 173, + "174": 174, + "175": 175, + "176": 176, + "177": 177, + "178": 178, + "179": 179, + "18": 18, + "180": 180, + "181": 181, + "182": 182, + "183": 183, + "184": 184, + "185": 185, + "186": 186, + "187": 187, + "188": 188, + "189": 189, + "19": 19, + "190": 190, + "191": 191, + "192": 192, + "193": 193, + "194": 194, + "195": 195, + "196": 196, + "197": 197, + "198": 198, + "199": 199, + "2": 2, + "20": 20, + "200": 200, + "201": 201, + "202": 202, + "203": 203, + "204": 204, + "205": 205, + "206": 206, + "207": 207, + "208": 208, + "209": 209, + "21": 21, + "210": 210, + "211": 211, + "212": 212, + "213": 213, + "214": 214, + "215": 215, + "216": 216, + "217": 217, + "218": 218, + "219": 219, + "22": 22, + "220": 220, + "221": 221, + "222": 222, + "223": 223, + "224": 224, + "225": 225, + "226": 226, + "227": 227, + "228": 228, + "229": 229, + "23": 23, + "230": 230, + "231": 231, + "232": 232, + "233": 233, + "234": 234, + "235": 235, + "236": 236, + "237": 237, + "238": 238, + "239": 239, + "24": 24, + "240": 240, + "241": 241, + "242": 242, + "243": 243, + "244": 244, + "245": 245, + "246": 246, + "247": 247, + "248": 248, + "249": 249, + "25": 25, + "250": 250, + "251": 251, + "252": 252, + "253": 253, + "254": 254, + "255": 255, + "26": 26, + "27": 27, + "28": 28, + "29": 29, + "3": 3, + "30": 30, + "31": 31, + "32": 32, + "33": 33, + "34": 34, + "35": 35, + "36": 36, + "37": 37, + "38": 38, + "39": 39, + "4": 4, + "40": 40, + "41": 41, + "42": 42, + "43": 43, + "44": 44, + "45": 45, + "46": 46, + "47": 47, + "48": 48, + "49": 49, + "5": 5, + "50": 50, + "51": 51, + "52": 52, + "53": 53, + "54": 54, + "55": 55, + "56": 56, + "57": 57, + "58": 58, + "59": 59, + "6": 6, + "60": 60, + "61": 61, + "62": 62, + "63": 63, + "64": 64, + "65": 65, + "66": 66, + "67": 67, + "68": 68, + "69": 69, + "7": 7, + "70": 70, + "71": 71, + "72": 72, + "73": 73, + "74": 74, + "75": 75, + "76": 76, + "77": 77, + "78": 78, + "79": 79, + "8": 8, + "80": 80, + "81": 81, + "82": 82, + "83": 83, + "84": 84, + "85": 85, + "86": 86, + "87": 87, + "88": 88, + "89": 89, + "9": 9, + "90": 90, + "91": 91, + "92": 92, + "93": 93, + "94": 94, + "95": 95, + "96": 96, + "97": 97, + "98": 98, + "99": 99 + }, + "Rx1DataRate": { + "0_0_false": 0, + "0_0_true": 0, + "0_1_false": 0, + "0_1_true": 0, + "0_2_false": 0, + "0_2_true": 0, + "0_3_false": 0, + "0_3_true": 0, + "0_4_false": 0, + "0_4_true": 0, + "0_5_false": 0, + "0_5_true": 0, + "1_0_false": 1, + "1_0_true": 1, + "1_1_false": 0, + "1_1_true": 0, + "1_2_false": 0, + "1_2_true": 0, + "1_3_false": 0, + "1_3_true": 0, + "1_4_false": 0, + "1_4_true": 0, + "1_5_false": 0, + "1_5_true": 0, + "2_0_false": 2, + "2_0_true": 2, + "2_1_false": 1, + "2_1_true": 1, + "2_2_false": 0, + "2_2_true": 0, + "2_3_false": 0, + "2_3_true": 0, + "2_4_false": 0, + "2_4_true": 0, + "2_5_false": 0, + "2_5_true": 0, + "3_0_false": 3, + "3_0_true": 3, + "3_1_false": 2, + "3_1_true": 2, + "3_2_false": 1, + "3_2_true": 1, + "3_3_false": 0, + "3_3_true": 0, + "3_4_false": 0, + "3_4_true": 0, + "3_5_false": 0, + "3_5_true": 0, + "4_0_false": 4, + "4_0_true": 4, + "4_1_false": 3, + "4_1_true": 3, + "4_2_false": 2, + "4_2_true": 2, + "4_3_false": 1, + "4_3_true": 1, + "4_4_false": 0, + "4_4_true": 0, + "4_5_false": 0, + "4_5_true": 0, + "5_0_false": 5, + "5_0_true": 5, + "5_1_false": 4, + "5_1_true": 4, + "5_2_false": 3, + "5_2_true": 3, + "5_3_false": 2, + "5_3_true": 2, + "5_4_false": 1, + "5_4_true": 1, + "5_5_false": 0, + "5_5_true": 0 + }, + "DefaultRx2Parameters": { + "DataRateIndex": 2, + "Frequency": 926200000 + }, + "BootDwellTime": { + "Uplinks": null, + "Downlinks": null + }, + "Relay": { + "WORChannels": null + }, + "SharedParameters": { + "ReceiveDelay1": 1000000000, + "ReceiveDelay2": 2000000000, + "JoinAcceptDelay1": 5000000000, + "JoinAcceptDelay2": 6000000000, + "MaxFCntGap": 16384, + "ADRAckLimit": "ADR_ACK_LIMIT_64", + "ADRAckDelay": "ADR_ACK_DELAY_32", + "MinRetransmitTimeout": 1000000000, + "MaxRetransmitTimeout": 3000000000, + "RelayForwardDelay": 50000000, + "RelayReceiveDelay": 18000000000, + "ServedRelayBackoff": 8 + } +} \ No newline at end of file diff --git a/pkg/band/testdata/UZ_923_DRAFT_PHY_V1_0_3_REV_A.json b/pkg/band/testdata/UZ_923_DRAFT_PHY_V1_0_3_REV_A.json new file mode 100644 index 0000000000..5f1fe7f280 --- /dev/null +++ b/pkg/band/testdata/UZ_923_DRAFT_PHY_V1_0_3_REV_A.json @@ -0,0 +1,512 @@ +{ + "ID": "UZ_923_DRAFT", + "Beacon": { + "DataRateIndex": 3, + "CodingRate": "4/5", + "Frequencies": [ + 926600000 + ] + }, + "PingSlotFrequencies": [ + 926600000 + ], + "MaxUplinkChannels": 16, + "UplinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "MaxDownlinkChannels": 16, + "DownlinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "SubBands": [ + { + "MinFrequency": 926200000, + "MaxFrequency": 926800000, + "DutyCycle": 0.01, + "MaxEIRP": 16 + } + ], + "DataRates": { + "0": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 12, + "coding_rate": "4/5" + } + } + }, + "1": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 11, + "coding_rate": "4/5" + } + } + }, + "2": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 10, + "coding_rate": "4/5" + } + } + }, + "3": { + "MaxMACPayloadSize": { + "false": 123, + "true": 123 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 9, + "coding_rate": "4/5" + } + } + }, + "4": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 8, + "coding_rate": "4/5" + } + } + }, + "5": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 7, + "coding_rate": "4/5" + } + } + } + }, + "StrictCodingRate": true, + "FreqMultiplier": 100, + "ImplementsCFList": true, + "CFListType": "FREQUENCIES", + "SupportsDynamicADR": true, + "TxOffset": [ + 0, + -2, + -4, + -6, + -8, + -10, + -12, + -14 + ], + "MaxADRDataRateIndex": 5, + "TxParamSetupReqSupport": false, + "DefaultMaxEIRP": 16, + "Rx1Channel": { + "0": 0, + "1": 1, + "10": 10, + "100": 100, + "101": 101, + "102": 102, + "103": 103, + "104": 104, + "105": 105, + "106": 106, + "107": 107, + "108": 108, + "109": 109, + "11": 11, + "110": 110, + "111": 111, + "112": 112, + "113": 113, + "114": 114, + "115": 115, + "116": 116, + "117": 117, + "118": 118, + "119": 119, + "12": 12, + "120": 120, + "121": 121, + "122": 122, + "123": 123, + "124": 124, + "125": 125, + "126": 126, + "127": 127, + "128": 128, + "129": 129, + "13": 13, + "130": 130, + "131": 131, + "132": 132, + "133": 133, + "134": 134, + "135": 135, + "136": 136, + "137": 137, + "138": 138, + "139": 139, + "14": 14, + "140": 140, + "141": 141, + "142": 142, + "143": 143, + "144": 144, + "145": 145, + "146": 146, + "147": 147, + "148": 148, + "149": 149, + "15": 15, + "150": 150, + "151": 151, + "152": 152, + "153": 153, + "154": 154, + "155": 155, + "156": 156, + "157": 157, + "158": 158, + "159": 159, + "16": 16, + "160": 160, + "161": 161, + "162": 162, + "163": 163, + "164": 164, + "165": 165, + "166": 166, + "167": 167, + "168": 168, + "169": 169, + "17": 17, + "170": 170, + "171": 171, + "172": 172, + "173": 173, + "174": 174, + "175": 175, + "176": 176, + "177": 177, + "178": 178, + "179": 179, + "18": 18, + "180": 180, + "181": 181, + "182": 182, + "183": 183, + "184": 184, + "185": 185, + "186": 186, + "187": 187, + "188": 188, + "189": 189, + "19": 19, + "190": 190, + "191": 191, + "192": 192, + "193": 193, + "194": 194, + "195": 195, + "196": 196, + "197": 197, + "198": 198, + "199": 199, + "2": 2, + "20": 20, + "200": 200, + "201": 201, + "202": 202, + "203": 203, + "204": 204, + "205": 205, + "206": 206, + "207": 207, + "208": 208, + "209": 209, + "21": 21, + "210": 210, + "211": 211, + "212": 212, + "213": 213, + "214": 214, + "215": 215, + "216": 216, + "217": 217, + "218": 218, + "219": 219, + "22": 22, + "220": 220, + "221": 221, + "222": 222, + "223": 223, + "224": 224, + "225": 225, + "226": 226, + "227": 227, + "228": 228, + "229": 229, + "23": 23, + "230": 230, + "231": 231, + "232": 232, + "233": 233, + "234": 234, + "235": 235, + "236": 236, + "237": 237, + "238": 238, + "239": 239, + "24": 24, + "240": 240, + "241": 241, + "242": 242, + "243": 243, + "244": 244, + "245": 245, + "246": 246, + "247": 247, + "248": 248, + "249": 249, + "25": 25, + "250": 250, + "251": 251, + "252": 252, + "253": 253, + "254": 254, + "255": 255, + "26": 26, + "27": 27, + "28": 28, + "29": 29, + "3": 3, + "30": 30, + "31": 31, + "32": 32, + "33": 33, + "34": 34, + "35": 35, + "36": 36, + "37": 37, + "38": 38, + "39": 39, + "4": 4, + "40": 40, + "41": 41, + "42": 42, + "43": 43, + "44": 44, + "45": 45, + "46": 46, + "47": 47, + "48": 48, + "49": 49, + "5": 5, + "50": 50, + "51": 51, + "52": 52, + "53": 53, + "54": 54, + "55": 55, + "56": 56, + "57": 57, + "58": 58, + "59": 59, + "6": 6, + "60": 60, + "61": 61, + "62": 62, + "63": 63, + "64": 64, + "65": 65, + "66": 66, + "67": 67, + "68": 68, + "69": 69, + "7": 7, + "70": 70, + "71": 71, + "72": 72, + "73": 73, + "74": 74, + "75": 75, + "76": 76, + "77": 77, + "78": 78, + "79": 79, + "8": 8, + "80": 80, + "81": 81, + "82": 82, + "83": 83, + "84": 84, + "85": 85, + "86": 86, + "87": 87, + "88": 88, + "89": 89, + "9": 9, + "90": 90, + "91": 91, + "92": 92, + "93": 93, + "94": 94, + "95": 95, + "96": 96, + "97": 97, + "98": 98, + "99": 99 + }, + "Rx1DataRate": { + "0_0_false": 0, + "0_0_true": 0, + "0_1_false": 0, + "0_1_true": 0, + "0_2_false": 0, + "0_2_true": 0, + "0_3_false": 0, + "0_3_true": 0, + "0_4_false": 0, + "0_4_true": 0, + "0_5_false": 0, + "0_5_true": 0, + "1_0_false": 1, + "1_0_true": 1, + "1_1_false": 0, + "1_1_true": 0, + "1_2_false": 0, + "1_2_true": 0, + "1_3_false": 0, + "1_3_true": 0, + "1_4_false": 0, + "1_4_true": 0, + "1_5_false": 0, + "1_5_true": 0, + "2_0_false": 2, + "2_0_true": 2, + "2_1_false": 1, + "2_1_true": 1, + "2_2_false": 0, + "2_2_true": 0, + "2_3_false": 0, + "2_3_true": 0, + "2_4_false": 0, + "2_4_true": 0, + "2_5_false": 0, + "2_5_true": 0, + "3_0_false": 3, + "3_0_true": 3, + "3_1_false": 2, + "3_1_true": 2, + "3_2_false": 1, + "3_2_true": 1, + "3_3_false": 0, + "3_3_true": 0, + "3_4_false": 0, + "3_4_true": 0, + "3_5_false": 0, + "3_5_true": 0, + "4_0_false": 4, + "4_0_true": 4, + "4_1_false": 3, + "4_1_true": 3, + "4_2_false": 2, + "4_2_true": 2, + "4_3_false": 1, + "4_3_true": 1, + "4_4_false": 0, + "4_4_true": 0, + "4_5_false": 0, + "4_5_true": 0, + "5_0_false": 5, + "5_0_true": 5, + "5_1_false": 4, + "5_1_true": 4, + "5_2_false": 3, + "5_2_true": 3, + "5_3_false": 2, + "5_3_true": 2, + "5_4_false": 1, + "5_4_true": 1, + "5_5_false": 0, + "5_5_true": 0 + }, + "DefaultRx2Parameters": { + "DataRateIndex": 2, + "Frequency": 926200000 + }, + "BootDwellTime": { + "Uplinks": null, + "Downlinks": null + }, + "Relay": { + "WORChannels": null + }, + "SharedParameters": { + "ReceiveDelay1": 1000000000, + "ReceiveDelay2": 2000000000, + "JoinAcceptDelay1": 5000000000, + "JoinAcceptDelay2": 6000000000, + "MaxFCntGap": 16384, + "ADRAckLimit": "ADR_ACK_LIMIT_64", + "ADRAckDelay": "ADR_ACK_DELAY_32", + "MinRetransmitTimeout": 1000000000, + "MaxRetransmitTimeout": 3000000000, + "RelayForwardDelay": 50000000, + "RelayReceiveDelay": 18000000000, + "ServedRelayBackoff": 8 + } +} \ No newline at end of file diff --git a/pkg/band/testdata/UZ_923_DRAFT_PHY_V1_1_REV_A.json b/pkg/band/testdata/UZ_923_DRAFT_PHY_V1_1_REV_A.json new file mode 100644 index 0000000000..5f1fe7f280 --- /dev/null +++ b/pkg/band/testdata/UZ_923_DRAFT_PHY_V1_1_REV_A.json @@ -0,0 +1,512 @@ +{ + "ID": "UZ_923_DRAFT", + "Beacon": { + "DataRateIndex": 3, + "CodingRate": "4/5", + "Frequencies": [ + 926600000 + ] + }, + "PingSlotFrequencies": [ + 926600000 + ], + "MaxUplinkChannels": 16, + "UplinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "MaxDownlinkChannels": 16, + "DownlinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "SubBands": [ + { + "MinFrequency": 926200000, + "MaxFrequency": 926800000, + "DutyCycle": 0.01, + "MaxEIRP": 16 + } + ], + "DataRates": { + "0": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 12, + "coding_rate": "4/5" + } + } + }, + "1": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 11, + "coding_rate": "4/5" + } + } + }, + "2": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 10, + "coding_rate": "4/5" + } + } + }, + "3": { + "MaxMACPayloadSize": { + "false": 123, + "true": 123 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 9, + "coding_rate": "4/5" + } + } + }, + "4": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 8, + "coding_rate": "4/5" + } + } + }, + "5": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 7, + "coding_rate": "4/5" + } + } + } + }, + "StrictCodingRate": true, + "FreqMultiplier": 100, + "ImplementsCFList": true, + "CFListType": "FREQUENCIES", + "SupportsDynamicADR": true, + "TxOffset": [ + 0, + -2, + -4, + -6, + -8, + -10, + -12, + -14 + ], + "MaxADRDataRateIndex": 5, + "TxParamSetupReqSupport": false, + "DefaultMaxEIRP": 16, + "Rx1Channel": { + "0": 0, + "1": 1, + "10": 10, + "100": 100, + "101": 101, + "102": 102, + "103": 103, + "104": 104, + "105": 105, + "106": 106, + "107": 107, + "108": 108, + "109": 109, + "11": 11, + "110": 110, + "111": 111, + "112": 112, + "113": 113, + "114": 114, + "115": 115, + "116": 116, + "117": 117, + "118": 118, + "119": 119, + "12": 12, + "120": 120, + "121": 121, + "122": 122, + "123": 123, + "124": 124, + "125": 125, + "126": 126, + "127": 127, + "128": 128, + "129": 129, + "13": 13, + "130": 130, + "131": 131, + "132": 132, + "133": 133, + "134": 134, + "135": 135, + "136": 136, + "137": 137, + "138": 138, + "139": 139, + "14": 14, + "140": 140, + "141": 141, + "142": 142, + "143": 143, + "144": 144, + "145": 145, + "146": 146, + "147": 147, + "148": 148, + "149": 149, + "15": 15, + "150": 150, + "151": 151, + "152": 152, + "153": 153, + "154": 154, + "155": 155, + "156": 156, + "157": 157, + "158": 158, + "159": 159, + "16": 16, + "160": 160, + "161": 161, + "162": 162, + "163": 163, + "164": 164, + "165": 165, + "166": 166, + "167": 167, + "168": 168, + "169": 169, + "17": 17, + "170": 170, + "171": 171, + "172": 172, + "173": 173, + "174": 174, + "175": 175, + "176": 176, + "177": 177, + "178": 178, + "179": 179, + "18": 18, + "180": 180, + "181": 181, + "182": 182, + "183": 183, + "184": 184, + "185": 185, + "186": 186, + "187": 187, + "188": 188, + "189": 189, + "19": 19, + "190": 190, + "191": 191, + "192": 192, + "193": 193, + "194": 194, + "195": 195, + "196": 196, + "197": 197, + "198": 198, + "199": 199, + "2": 2, + "20": 20, + "200": 200, + "201": 201, + "202": 202, + "203": 203, + "204": 204, + "205": 205, + "206": 206, + "207": 207, + "208": 208, + "209": 209, + "21": 21, + "210": 210, + "211": 211, + "212": 212, + "213": 213, + "214": 214, + "215": 215, + "216": 216, + "217": 217, + "218": 218, + "219": 219, + "22": 22, + "220": 220, + "221": 221, + "222": 222, + "223": 223, + "224": 224, + "225": 225, + "226": 226, + "227": 227, + "228": 228, + "229": 229, + "23": 23, + "230": 230, + "231": 231, + "232": 232, + "233": 233, + "234": 234, + "235": 235, + "236": 236, + "237": 237, + "238": 238, + "239": 239, + "24": 24, + "240": 240, + "241": 241, + "242": 242, + "243": 243, + "244": 244, + "245": 245, + "246": 246, + "247": 247, + "248": 248, + "249": 249, + "25": 25, + "250": 250, + "251": 251, + "252": 252, + "253": 253, + "254": 254, + "255": 255, + "26": 26, + "27": 27, + "28": 28, + "29": 29, + "3": 3, + "30": 30, + "31": 31, + "32": 32, + "33": 33, + "34": 34, + "35": 35, + "36": 36, + "37": 37, + "38": 38, + "39": 39, + "4": 4, + "40": 40, + "41": 41, + "42": 42, + "43": 43, + "44": 44, + "45": 45, + "46": 46, + "47": 47, + "48": 48, + "49": 49, + "5": 5, + "50": 50, + "51": 51, + "52": 52, + "53": 53, + "54": 54, + "55": 55, + "56": 56, + "57": 57, + "58": 58, + "59": 59, + "6": 6, + "60": 60, + "61": 61, + "62": 62, + "63": 63, + "64": 64, + "65": 65, + "66": 66, + "67": 67, + "68": 68, + "69": 69, + "7": 7, + "70": 70, + "71": 71, + "72": 72, + "73": 73, + "74": 74, + "75": 75, + "76": 76, + "77": 77, + "78": 78, + "79": 79, + "8": 8, + "80": 80, + "81": 81, + "82": 82, + "83": 83, + "84": 84, + "85": 85, + "86": 86, + "87": 87, + "88": 88, + "89": 89, + "9": 9, + "90": 90, + "91": 91, + "92": 92, + "93": 93, + "94": 94, + "95": 95, + "96": 96, + "97": 97, + "98": 98, + "99": 99 + }, + "Rx1DataRate": { + "0_0_false": 0, + "0_0_true": 0, + "0_1_false": 0, + "0_1_true": 0, + "0_2_false": 0, + "0_2_true": 0, + "0_3_false": 0, + "0_3_true": 0, + "0_4_false": 0, + "0_4_true": 0, + "0_5_false": 0, + "0_5_true": 0, + "1_0_false": 1, + "1_0_true": 1, + "1_1_false": 0, + "1_1_true": 0, + "1_2_false": 0, + "1_2_true": 0, + "1_3_false": 0, + "1_3_true": 0, + "1_4_false": 0, + "1_4_true": 0, + "1_5_false": 0, + "1_5_true": 0, + "2_0_false": 2, + "2_0_true": 2, + "2_1_false": 1, + "2_1_true": 1, + "2_2_false": 0, + "2_2_true": 0, + "2_3_false": 0, + "2_3_true": 0, + "2_4_false": 0, + "2_4_true": 0, + "2_5_false": 0, + "2_5_true": 0, + "3_0_false": 3, + "3_0_true": 3, + "3_1_false": 2, + "3_1_true": 2, + "3_2_false": 1, + "3_2_true": 1, + "3_3_false": 0, + "3_3_true": 0, + "3_4_false": 0, + "3_4_true": 0, + "3_5_false": 0, + "3_5_true": 0, + "4_0_false": 4, + "4_0_true": 4, + "4_1_false": 3, + "4_1_true": 3, + "4_2_false": 2, + "4_2_true": 2, + "4_3_false": 1, + "4_3_true": 1, + "4_4_false": 0, + "4_4_true": 0, + "4_5_false": 0, + "4_5_true": 0, + "5_0_false": 5, + "5_0_true": 5, + "5_1_false": 4, + "5_1_true": 4, + "5_2_false": 3, + "5_2_true": 3, + "5_3_false": 2, + "5_3_true": 2, + "5_4_false": 1, + "5_4_true": 1, + "5_5_false": 0, + "5_5_true": 0 + }, + "DefaultRx2Parameters": { + "DataRateIndex": 2, + "Frequency": 926200000 + }, + "BootDwellTime": { + "Uplinks": null, + "Downlinks": null + }, + "Relay": { + "WORChannels": null + }, + "SharedParameters": { + "ReceiveDelay1": 1000000000, + "ReceiveDelay2": 2000000000, + "JoinAcceptDelay1": 5000000000, + "JoinAcceptDelay2": 6000000000, + "MaxFCntGap": 16384, + "ADRAckLimit": "ADR_ACK_LIMIT_64", + "ADRAckDelay": "ADR_ACK_DELAY_32", + "MinRetransmitTimeout": 1000000000, + "MaxRetransmitTimeout": 3000000000, + "RelayForwardDelay": 50000000, + "RelayReceiveDelay": 18000000000, + "ServedRelayBackoff": 8 + } +} \ No newline at end of file diff --git a/pkg/band/testdata/UZ_923_DRAFT_PHY_V1_1_REV_B.json b/pkg/band/testdata/UZ_923_DRAFT_PHY_V1_1_REV_B.json new file mode 100644 index 0000000000..5f1fe7f280 --- /dev/null +++ b/pkg/band/testdata/UZ_923_DRAFT_PHY_V1_1_REV_B.json @@ -0,0 +1,512 @@ +{ + "ID": "UZ_923_DRAFT", + "Beacon": { + "DataRateIndex": 3, + "CodingRate": "4/5", + "Frequencies": [ + 926600000 + ] + }, + "PingSlotFrequencies": [ + 926600000 + ], + "MaxUplinkChannels": 16, + "UplinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "MaxDownlinkChannels": 16, + "DownlinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "SubBands": [ + { + "MinFrequency": 926200000, + "MaxFrequency": 926800000, + "DutyCycle": 0.01, + "MaxEIRP": 16 + } + ], + "DataRates": { + "0": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 12, + "coding_rate": "4/5" + } + } + }, + "1": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 11, + "coding_rate": "4/5" + } + } + }, + "2": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 10, + "coding_rate": "4/5" + } + } + }, + "3": { + "MaxMACPayloadSize": { + "false": 123, + "true": 123 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 9, + "coding_rate": "4/5" + } + } + }, + "4": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 8, + "coding_rate": "4/5" + } + } + }, + "5": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 7, + "coding_rate": "4/5" + } + } + } + }, + "StrictCodingRate": true, + "FreqMultiplier": 100, + "ImplementsCFList": true, + "CFListType": "FREQUENCIES", + "SupportsDynamicADR": true, + "TxOffset": [ + 0, + -2, + -4, + -6, + -8, + -10, + -12, + -14 + ], + "MaxADRDataRateIndex": 5, + "TxParamSetupReqSupport": false, + "DefaultMaxEIRP": 16, + "Rx1Channel": { + "0": 0, + "1": 1, + "10": 10, + "100": 100, + "101": 101, + "102": 102, + "103": 103, + "104": 104, + "105": 105, + "106": 106, + "107": 107, + "108": 108, + "109": 109, + "11": 11, + "110": 110, + "111": 111, + "112": 112, + "113": 113, + "114": 114, + "115": 115, + "116": 116, + "117": 117, + "118": 118, + "119": 119, + "12": 12, + "120": 120, + "121": 121, + "122": 122, + "123": 123, + "124": 124, + "125": 125, + "126": 126, + "127": 127, + "128": 128, + "129": 129, + "13": 13, + "130": 130, + "131": 131, + "132": 132, + "133": 133, + "134": 134, + "135": 135, + "136": 136, + "137": 137, + "138": 138, + "139": 139, + "14": 14, + "140": 140, + "141": 141, + "142": 142, + "143": 143, + "144": 144, + "145": 145, + "146": 146, + "147": 147, + "148": 148, + "149": 149, + "15": 15, + "150": 150, + "151": 151, + "152": 152, + "153": 153, + "154": 154, + "155": 155, + "156": 156, + "157": 157, + "158": 158, + "159": 159, + "16": 16, + "160": 160, + "161": 161, + "162": 162, + "163": 163, + "164": 164, + "165": 165, + "166": 166, + "167": 167, + "168": 168, + "169": 169, + "17": 17, + "170": 170, + "171": 171, + "172": 172, + "173": 173, + "174": 174, + "175": 175, + "176": 176, + "177": 177, + "178": 178, + "179": 179, + "18": 18, + "180": 180, + "181": 181, + "182": 182, + "183": 183, + "184": 184, + "185": 185, + "186": 186, + "187": 187, + "188": 188, + "189": 189, + "19": 19, + "190": 190, + "191": 191, + "192": 192, + "193": 193, + "194": 194, + "195": 195, + "196": 196, + "197": 197, + "198": 198, + "199": 199, + "2": 2, + "20": 20, + "200": 200, + "201": 201, + "202": 202, + "203": 203, + "204": 204, + "205": 205, + "206": 206, + "207": 207, + "208": 208, + "209": 209, + "21": 21, + "210": 210, + "211": 211, + "212": 212, + "213": 213, + "214": 214, + "215": 215, + "216": 216, + "217": 217, + "218": 218, + "219": 219, + "22": 22, + "220": 220, + "221": 221, + "222": 222, + "223": 223, + "224": 224, + "225": 225, + "226": 226, + "227": 227, + "228": 228, + "229": 229, + "23": 23, + "230": 230, + "231": 231, + "232": 232, + "233": 233, + "234": 234, + "235": 235, + "236": 236, + "237": 237, + "238": 238, + "239": 239, + "24": 24, + "240": 240, + "241": 241, + "242": 242, + "243": 243, + "244": 244, + "245": 245, + "246": 246, + "247": 247, + "248": 248, + "249": 249, + "25": 25, + "250": 250, + "251": 251, + "252": 252, + "253": 253, + "254": 254, + "255": 255, + "26": 26, + "27": 27, + "28": 28, + "29": 29, + "3": 3, + "30": 30, + "31": 31, + "32": 32, + "33": 33, + "34": 34, + "35": 35, + "36": 36, + "37": 37, + "38": 38, + "39": 39, + "4": 4, + "40": 40, + "41": 41, + "42": 42, + "43": 43, + "44": 44, + "45": 45, + "46": 46, + "47": 47, + "48": 48, + "49": 49, + "5": 5, + "50": 50, + "51": 51, + "52": 52, + "53": 53, + "54": 54, + "55": 55, + "56": 56, + "57": 57, + "58": 58, + "59": 59, + "6": 6, + "60": 60, + "61": 61, + "62": 62, + "63": 63, + "64": 64, + "65": 65, + "66": 66, + "67": 67, + "68": 68, + "69": 69, + "7": 7, + "70": 70, + "71": 71, + "72": 72, + "73": 73, + "74": 74, + "75": 75, + "76": 76, + "77": 77, + "78": 78, + "79": 79, + "8": 8, + "80": 80, + "81": 81, + "82": 82, + "83": 83, + "84": 84, + "85": 85, + "86": 86, + "87": 87, + "88": 88, + "89": 89, + "9": 9, + "90": 90, + "91": 91, + "92": 92, + "93": 93, + "94": 94, + "95": 95, + "96": 96, + "97": 97, + "98": 98, + "99": 99 + }, + "Rx1DataRate": { + "0_0_false": 0, + "0_0_true": 0, + "0_1_false": 0, + "0_1_true": 0, + "0_2_false": 0, + "0_2_true": 0, + "0_3_false": 0, + "0_3_true": 0, + "0_4_false": 0, + "0_4_true": 0, + "0_5_false": 0, + "0_5_true": 0, + "1_0_false": 1, + "1_0_true": 1, + "1_1_false": 0, + "1_1_true": 0, + "1_2_false": 0, + "1_2_true": 0, + "1_3_false": 0, + "1_3_true": 0, + "1_4_false": 0, + "1_4_true": 0, + "1_5_false": 0, + "1_5_true": 0, + "2_0_false": 2, + "2_0_true": 2, + "2_1_false": 1, + "2_1_true": 1, + "2_2_false": 0, + "2_2_true": 0, + "2_3_false": 0, + "2_3_true": 0, + "2_4_false": 0, + "2_4_true": 0, + "2_5_false": 0, + "2_5_true": 0, + "3_0_false": 3, + "3_0_true": 3, + "3_1_false": 2, + "3_1_true": 2, + "3_2_false": 1, + "3_2_true": 1, + "3_3_false": 0, + "3_3_true": 0, + "3_4_false": 0, + "3_4_true": 0, + "3_5_false": 0, + "3_5_true": 0, + "4_0_false": 4, + "4_0_true": 4, + "4_1_false": 3, + "4_1_true": 3, + "4_2_false": 2, + "4_2_true": 2, + "4_3_false": 1, + "4_3_true": 1, + "4_4_false": 0, + "4_4_true": 0, + "4_5_false": 0, + "4_5_true": 0, + "5_0_false": 5, + "5_0_true": 5, + "5_1_false": 4, + "5_1_true": 4, + "5_2_false": 3, + "5_2_true": 3, + "5_3_false": 2, + "5_3_true": 2, + "5_4_false": 1, + "5_4_true": 1, + "5_5_false": 0, + "5_5_true": 0 + }, + "DefaultRx2Parameters": { + "DataRateIndex": 2, + "Frequency": 926200000 + }, + "BootDwellTime": { + "Uplinks": null, + "Downlinks": null + }, + "Relay": { + "WORChannels": null + }, + "SharedParameters": { + "ReceiveDelay1": 1000000000, + "ReceiveDelay2": 2000000000, + "JoinAcceptDelay1": 5000000000, + "JoinAcceptDelay2": 6000000000, + "MaxFCntGap": 16384, + "ADRAckLimit": "ADR_ACK_LIMIT_64", + "ADRAckDelay": "ADR_ACK_DELAY_32", + "MinRetransmitTimeout": 1000000000, + "MaxRetransmitTimeout": 3000000000, + "RelayForwardDelay": 50000000, + "RelayReceiveDelay": 18000000000, + "ServedRelayBackoff": 8 + } +} \ No newline at end of file diff --git a/pkg/band/testdata/UZ_923_DRAFT_RP002_V1_0_0.json b/pkg/band/testdata/UZ_923_DRAFT_RP002_V1_0_0.json new file mode 100644 index 0000000000..5f1fe7f280 --- /dev/null +++ b/pkg/band/testdata/UZ_923_DRAFT_RP002_V1_0_0.json @@ -0,0 +1,512 @@ +{ + "ID": "UZ_923_DRAFT", + "Beacon": { + "DataRateIndex": 3, + "CodingRate": "4/5", + "Frequencies": [ + 926600000 + ] + }, + "PingSlotFrequencies": [ + 926600000 + ], + "MaxUplinkChannels": 16, + "UplinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "MaxDownlinkChannels": 16, + "DownlinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "SubBands": [ + { + "MinFrequency": 926200000, + "MaxFrequency": 926800000, + "DutyCycle": 0.01, + "MaxEIRP": 16 + } + ], + "DataRates": { + "0": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 12, + "coding_rate": "4/5" + } + } + }, + "1": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 11, + "coding_rate": "4/5" + } + } + }, + "2": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 10, + "coding_rate": "4/5" + } + } + }, + "3": { + "MaxMACPayloadSize": { + "false": 123, + "true": 123 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 9, + "coding_rate": "4/5" + } + } + }, + "4": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 8, + "coding_rate": "4/5" + } + } + }, + "5": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 7, + "coding_rate": "4/5" + } + } + } + }, + "StrictCodingRate": true, + "FreqMultiplier": 100, + "ImplementsCFList": true, + "CFListType": "FREQUENCIES", + "SupportsDynamicADR": true, + "TxOffset": [ + 0, + -2, + -4, + -6, + -8, + -10, + -12, + -14 + ], + "MaxADRDataRateIndex": 5, + "TxParamSetupReqSupport": false, + "DefaultMaxEIRP": 16, + "Rx1Channel": { + "0": 0, + "1": 1, + "10": 10, + "100": 100, + "101": 101, + "102": 102, + "103": 103, + "104": 104, + "105": 105, + "106": 106, + "107": 107, + "108": 108, + "109": 109, + "11": 11, + "110": 110, + "111": 111, + "112": 112, + "113": 113, + "114": 114, + "115": 115, + "116": 116, + "117": 117, + "118": 118, + "119": 119, + "12": 12, + "120": 120, + "121": 121, + "122": 122, + "123": 123, + "124": 124, + "125": 125, + "126": 126, + "127": 127, + "128": 128, + "129": 129, + "13": 13, + "130": 130, + "131": 131, + "132": 132, + "133": 133, + "134": 134, + "135": 135, + "136": 136, + "137": 137, + "138": 138, + "139": 139, + "14": 14, + "140": 140, + "141": 141, + "142": 142, + "143": 143, + "144": 144, + "145": 145, + "146": 146, + "147": 147, + "148": 148, + "149": 149, + "15": 15, + "150": 150, + "151": 151, + "152": 152, + "153": 153, + "154": 154, + "155": 155, + "156": 156, + "157": 157, + "158": 158, + "159": 159, + "16": 16, + "160": 160, + "161": 161, + "162": 162, + "163": 163, + "164": 164, + "165": 165, + "166": 166, + "167": 167, + "168": 168, + "169": 169, + "17": 17, + "170": 170, + "171": 171, + "172": 172, + "173": 173, + "174": 174, + "175": 175, + "176": 176, + "177": 177, + "178": 178, + "179": 179, + "18": 18, + "180": 180, + "181": 181, + "182": 182, + "183": 183, + "184": 184, + "185": 185, + "186": 186, + "187": 187, + "188": 188, + "189": 189, + "19": 19, + "190": 190, + "191": 191, + "192": 192, + "193": 193, + "194": 194, + "195": 195, + "196": 196, + "197": 197, + "198": 198, + "199": 199, + "2": 2, + "20": 20, + "200": 200, + "201": 201, + "202": 202, + "203": 203, + "204": 204, + "205": 205, + "206": 206, + "207": 207, + "208": 208, + "209": 209, + "21": 21, + "210": 210, + "211": 211, + "212": 212, + "213": 213, + "214": 214, + "215": 215, + "216": 216, + "217": 217, + "218": 218, + "219": 219, + "22": 22, + "220": 220, + "221": 221, + "222": 222, + "223": 223, + "224": 224, + "225": 225, + "226": 226, + "227": 227, + "228": 228, + "229": 229, + "23": 23, + "230": 230, + "231": 231, + "232": 232, + "233": 233, + "234": 234, + "235": 235, + "236": 236, + "237": 237, + "238": 238, + "239": 239, + "24": 24, + "240": 240, + "241": 241, + "242": 242, + "243": 243, + "244": 244, + "245": 245, + "246": 246, + "247": 247, + "248": 248, + "249": 249, + "25": 25, + "250": 250, + "251": 251, + "252": 252, + "253": 253, + "254": 254, + "255": 255, + "26": 26, + "27": 27, + "28": 28, + "29": 29, + "3": 3, + "30": 30, + "31": 31, + "32": 32, + "33": 33, + "34": 34, + "35": 35, + "36": 36, + "37": 37, + "38": 38, + "39": 39, + "4": 4, + "40": 40, + "41": 41, + "42": 42, + "43": 43, + "44": 44, + "45": 45, + "46": 46, + "47": 47, + "48": 48, + "49": 49, + "5": 5, + "50": 50, + "51": 51, + "52": 52, + "53": 53, + "54": 54, + "55": 55, + "56": 56, + "57": 57, + "58": 58, + "59": 59, + "6": 6, + "60": 60, + "61": 61, + "62": 62, + "63": 63, + "64": 64, + "65": 65, + "66": 66, + "67": 67, + "68": 68, + "69": 69, + "7": 7, + "70": 70, + "71": 71, + "72": 72, + "73": 73, + "74": 74, + "75": 75, + "76": 76, + "77": 77, + "78": 78, + "79": 79, + "8": 8, + "80": 80, + "81": 81, + "82": 82, + "83": 83, + "84": 84, + "85": 85, + "86": 86, + "87": 87, + "88": 88, + "89": 89, + "9": 9, + "90": 90, + "91": 91, + "92": 92, + "93": 93, + "94": 94, + "95": 95, + "96": 96, + "97": 97, + "98": 98, + "99": 99 + }, + "Rx1DataRate": { + "0_0_false": 0, + "0_0_true": 0, + "0_1_false": 0, + "0_1_true": 0, + "0_2_false": 0, + "0_2_true": 0, + "0_3_false": 0, + "0_3_true": 0, + "0_4_false": 0, + "0_4_true": 0, + "0_5_false": 0, + "0_5_true": 0, + "1_0_false": 1, + "1_0_true": 1, + "1_1_false": 0, + "1_1_true": 0, + "1_2_false": 0, + "1_2_true": 0, + "1_3_false": 0, + "1_3_true": 0, + "1_4_false": 0, + "1_4_true": 0, + "1_5_false": 0, + "1_5_true": 0, + "2_0_false": 2, + "2_0_true": 2, + "2_1_false": 1, + "2_1_true": 1, + "2_2_false": 0, + "2_2_true": 0, + "2_3_false": 0, + "2_3_true": 0, + "2_4_false": 0, + "2_4_true": 0, + "2_5_false": 0, + "2_5_true": 0, + "3_0_false": 3, + "3_0_true": 3, + "3_1_false": 2, + "3_1_true": 2, + "3_2_false": 1, + "3_2_true": 1, + "3_3_false": 0, + "3_3_true": 0, + "3_4_false": 0, + "3_4_true": 0, + "3_5_false": 0, + "3_5_true": 0, + "4_0_false": 4, + "4_0_true": 4, + "4_1_false": 3, + "4_1_true": 3, + "4_2_false": 2, + "4_2_true": 2, + "4_3_false": 1, + "4_3_true": 1, + "4_4_false": 0, + "4_4_true": 0, + "4_5_false": 0, + "4_5_true": 0, + "5_0_false": 5, + "5_0_true": 5, + "5_1_false": 4, + "5_1_true": 4, + "5_2_false": 3, + "5_2_true": 3, + "5_3_false": 2, + "5_3_true": 2, + "5_4_false": 1, + "5_4_true": 1, + "5_5_false": 0, + "5_5_true": 0 + }, + "DefaultRx2Parameters": { + "DataRateIndex": 2, + "Frequency": 926200000 + }, + "BootDwellTime": { + "Uplinks": null, + "Downlinks": null + }, + "Relay": { + "WORChannels": null + }, + "SharedParameters": { + "ReceiveDelay1": 1000000000, + "ReceiveDelay2": 2000000000, + "JoinAcceptDelay1": 5000000000, + "JoinAcceptDelay2": 6000000000, + "MaxFCntGap": 16384, + "ADRAckLimit": "ADR_ACK_LIMIT_64", + "ADRAckDelay": "ADR_ACK_DELAY_32", + "MinRetransmitTimeout": 1000000000, + "MaxRetransmitTimeout": 3000000000, + "RelayForwardDelay": 50000000, + "RelayReceiveDelay": 18000000000, + "ServedRelayBackoff": 8 + } +} \ No newline at end of file diff --git a/pkg/band/testdata/UZ_923_DRAFT_RP002_V1_0_1.json b/pkg/band/testdata/UZ_923_DRAFT_RP002_V1_0_1.json new file mode 100644 index 0000000000..5f1fe7f280 --- /dev/null +++ b/pkg/band/testdata/UZ_923_DRAFT_RP002_V1_0_1.json @@ -0,0 +1,512 @@ +{ + "ID": "UZ_923_DRAFT", + "Beacon": { + "DataRateIndex": 3, + "CodingRate": "4/5", + "Frequencies": [ + 926600000 + ] + }, + "PingSlotFrequencies": [ + 926600000 + ], + "MaxUplinkChannels": 16, + "UplinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "MaxDownlinkChannels": 16, + "DownlinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "SubBands": [ + { + "MinFrequency": 926200000, + "MaxFrequency": 926800000, + "DutyCycle": 0.01, + "MaxEIRP": 16 + } + ], + "DataRates": { + "0": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 12, + "coding_rate": "4/5" + } + } + }, + "1": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 11, + "coding_rate": "4/5" + } + } + }, + "2": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 10, + "coding_rate": "4/5" + } + } + }, + "3": { + "MaxMACPayloadSize": { + "false": 123, + "true": 123 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 9, + "coding_rate": "4/5" + } + } + }, + "4": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 8, + "coding_rate": "4/5" + } + } + }, + "5": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 7, + "coding_rate": "4/5" + } + } + } + }, + "StrictCodingRate": true, + "FreqMultiplier": 100, + "ImplementsCFList": true, + "CFListType": "FREQUENCIES", + "SupportsDynamicADR": true, + "TxOffset": [ + 0, + -2, + -4, + -6, + -8, + -10, + -12, + -14 + ], + "MaxADRDataRateIndex": 5, + "TxParamSetupReqSupport": false, + "DefaultMaxEIRP": 16, + "Rx1Channel": { + "0": 0, + "1": 1, + "10": 10, + "100": 100, + "101": 101, + "102": 102, + "103": 103, + "104": 104, + "105": 105, + "106": 106, + "107": 107, + "108": 108, + "109": 109, + "11": 11, + "110": 110, + "111": 111, + "112": 112, + "113": 113, + "114": 114, + "115": 115, + "116": 116, + "117": 117, + "118": 118, + "119": 119, + "12": 12, + "120": 120, + "121": 121, + "122": 122, + "123": 123, + "124": 124, + "125": 125, + "126": 126, + "127": 127, + "128": 128, + "129": 129, + "13": 13, + "130": 130, + "131": 131, + "132": 132, + "133": 133, + "134": 134, + "135": 135, + "136": 136, + "137": 137, + "138": 138, + "139": 139, + "14": 14, + "140": 140, + "141": 141, + "142": 142, + "143": 143, + "144": 144, + "145": 145, + "146": 146, + "147": 147, + "148": 148, + "149": 149, + "15": 15, + "150": 150, + "151": 151, + "152": 152, + "153": 153, + "154": 154, + "155": 155, + "156": 156, + "157": 157, + "158": 158, + "159": 159, + "16": 16, + "160": 160, + "161": 161, + "162": 162, + "163": 163, + "164": 164, + "165": 165, + "166": 166, + "167": 167, + "168": 168, + "169": 169, + "17": 17, + "170": 170, + "171": 171, + "172": 172, + "173": 173, + "174": 174, + "175": 175, + "176": 176, + "177": 177, + "178": 178, + "179": 179, + "18": 18, + "180": 180, + "181": 181, + "182": 182, + "183": 183, + "184": 184, + "185": 185, + "186": 186, + "187": 187, + "188": 188, + "189": 189, + "19": 19, + "190": 190, + "191": 191, + "192": 192, + "193": 193, + "194": 194, + "195": 195, + "196": 196, + "197": 197, + "198": 198, + "199": 199, + "2": 2, + "20": 20, + "200": 200, + "201": 201, + "202": 202, + "203": 203, + "204": 204, + "205": 205, + "206": 206, + "207": 207, + "208": 208, + "209": 209, + "21": 21, + "210": 210, + "211": 211, + "212": 212, + "213": 213, + "214": 214, + "215": 215, + "216": 216, + "217": 217, + "218": 218, + "219": 219, + "22": 22, + "220": 220, + "221": 221, + "222": 222, + "223": 223, + "224": 224, + "225": 225, + "226": 226, + "227": 227, + "228": 228, + "229": 229, + "23": 23, + "230": 230, + "231": 231, + "232": 232, + "233": 233, + "234": 234, + "235": 235, + "236": 236, + "237": 237, + "238": 238, + "239": 239, + "24": 24, + "240": 240, + "241": 241, + "242": 242, + "243": 243, + "244": 244, + "245": 245, + "246": 246, + "247": 247, + "248": 248, + "249": 249, + "25": 25, + "250": 250, + "251": 251, + "252": 252, + "253": 253, + "254": 254, + "255": 255, + "26": 26, + "27": 27, + "28": 28, + "29": 29, + "3": 3, + "30": 30, + "31": 31, + "32": 32, + "33": 33, + "34": 34, + "35": 35, + "36": 36, + "37": 37, + "38": 38, + "39": 39, + "4": 4, + "40": 40, + "41": 41, + "42": 42, + "43": 43, + "44": 44, + "45": 45, + "46": 46, + "47": 47, + "48": 48, + "49": 49, + "5": 5, + "50": 50, + "51": 51, + "52": 52, + "53": 53, + "54": 54, + "55": 55, + "56": 56, + "57": 57, + "58": 58, + "59": 59, + "6": 6, + "60": 60, + "61": 61, + "62": 62, + "63": 63, + "64": 64, + "65": 65, + "66": 66, + "67": 67, + "68": 68, + "69": 69, + "7": 7, + "70": 70, + "71": 71, + "72": 72, + "73": 73, + "74": 74, + "75": 75, + "76": 76, + "77": 77, + "78": 78, + "79": 79, + "8": 8, + "80": 80, + "81": 81, + "82": 82, + "83": 83, + "84": 84, + "85": 85, + "86": 86, + "87": 87, + "88": 88, + "89": 89, + "9": 9, + "90": 90, + "91": 91, + "92": 92, + "93": 93, + "94": 94, + "95": 95, + "96": 96, + "97": 97, + "98": 98, + "99": 99 + }, + "Rx1DataRate": { + "0_0_false": 0, + "0_0_true": 0, + "0_1_false": 0, + "0_1_true": 0, + "0_2_false": 0, + "0_2_true": 0, + "0_3_false": 0, + "0_3_true": 0, + "0_4_false": 0, + "0_4_true": 0, + "0_5_false": 0, + "0_5_true": 0, + "1_0_false": 1, + "1_0_true": 1, + "1_1_false": 0, + "1_1_true": 0, + "1_2_false": 0, + "1_2_true": 0, + "1_3_false": 0, + "1_3_true": 0, + "1_4_false": 0, + "1_4_true": 0, + "1_5_false": 0, + "1_5_true": 0, + "2_0_false": 2, + "2_0_true": 2, + "2_1_false": 1, + "2_1_true": 1, + "2_2_false": 0, + "2_2_true": 0, + "2_3_false": 0, + "2_3_true": 0, + "2_4_false": 0, + "2_4_true": 0, + "2_5_false": 0, + "2_5_true": 0, + "3_0_false": 3, + "3_0_true": 3, + "3_1_false": 2, + "3_1_true": 2, + "3_2_false": 1, + "3_2_true": 1, + "3_3_false": 0, + "3_3_true": 0, + "3_4_false": 0, + "3_4_true": 0, + "3_5_false": 0, + "3_5_true": 0, + "4_0_false": 4, + "4_0_true": 4, + "4_1_false": 3, + "4_1_true": 3, + "4_2_false": 2, + "4_2_true": 2, + "4_3_false": 1, + "4_3_true": 1, + "4_4_false": 0, + "4_4_true": 0, + "4_5_false": 0, + "4_5_true": 0, + "5_0_false": 5, + "5_0_true": 5, + "5_1_false": 4, + "5_1_true": 4, + "5_2_false": 3, + "5_2_true": 3, + "5_3_false": 2, + "5_3_true": 2, + "5_4_false": 1, + "5_4_true": 1, + "5_5_false": 0, + "5_5_true": 0 + }, + "DefaultRx2Parameters": { + "DataRateIndex": 2, + "Frequency": 926200000 + }, + "BootDwellTime": { + "Uplinks": null, + "Downlinks": null + }, + "Relay": { + "WORChannels": null + }, + "SharedParameters": { + "ReceiveDelay1": 1000000000, + "ReceiveDelay2": 2000000000, + "JoinAcceptDelay1": 5000000000, + "JoinAcceptDelay2": 6000000000, + "MaxFCntGap": 16384, + "ADRAckLimit": "ADR_ACK_LIMIT_64", + "ADRAckDelay": "ADR_ACK_DELAY_32", + "MinRetransmitTimeout": 1000000000, + "MaxRetransmitTimeout": 3000000000, + "RelayForwardDelay": 50000000, + "RelayReceiveDelay": 18000000000, + "ServedRelayBackoff": 8 + } +} \ No newline at end of file diff --git a/pkg/band/testdata/UZ_923_DRAFT_RP002_V1_0_2.json b/pkg/band/testdata/UZ_923_DRAFT_RP002_V1_0_2.json new file mode 100644 index 0000000000..5f1fe7f280 --- /dev/null +++ b/pkg/band/testdata/UZ_923_DRAFT_RP002_V1_0_2.json @@ -0,0 +1,512 @@ +{ + "ID": "UZ_923_DRAFT", + "Beacon": { + "DataRateIndex": 3, + "CodingRate": "4/5", + "Frequencies": [ + 926600000 + ] + }, + "PingSlotFrequencies": [ + 926600000 + ], + "MaxUplinkChannels": 16, + "UplinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "MaxDownlinkChannels": 16, + "DownlinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "SubBands": [ + { + "MinFrequency": 926200000, + "MaxFrequency": 926800000, + "DutyCycle": 0.01, + "MaxEIRP": 16 + } + ], + "DataRates": { + "0": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 12, + "coding_rate": "4/5" + } + } + }, + "1": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 11, + "coding_rate": "4/5" + } + } + }, + "2": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 10, + "coding_rate": "4/5" + } + } + }, + "3": { + "MaxMACPayloadSize": { + "false": 123, + "true": 123 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 9, + "coding_rate": "4/5" + } + } + }, + "4": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 8, + "coding_rate": "4/5" + } + } + }, + "5": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 7, + "coding_rate": "4/5" + } + } + } + }, + "StrictCodingRate": true, + "FreqMultiplier": 100, + "ImplementsCFList": true, + "CFListType": "FREQUENCIES", + "SupportsDynamicADR": true, + "TxOffset": [ + 0, + -2, + -4, + -6, + -8, + -10, + -12, + -14 + ], + "MaxADRDataRateIndex": 5, + "TxParamSetupReqSupport": false, + "DefaultMaxEIRP": 16, + "Rx1Channel": { + "0": 0, + "1": 1, + "10": 10, + "100": 100, + "101": 101, + "102": 102, + "103": 103, + "104": 104, + "105": 105, + "106": 106, + "107": 107, + "108": 108, + "109": 109, + "11": 11, + "110": 110, + "111": 111, + "112": 112, + "113": 113, + "114": 114, + "115": 115, + "116": 116, + "117": 117, + "118": 118, + "119": 119, + "12": 12, + "120": 120, + "121": 121, + "122": 122, + "123": 123, + "124": 124, + "125": 125, + "126": 126, + "127": 127, + "128": 128, + "129": 129, + "13": 13, + "130": 130, + "131": 131, + "132": 132, + "133": 133, + "134": 134, + "135": 135, + "136": 136, + "137": 137, + "138": 138, + "139": 139, + "14": 14, + "140": 140, + "141": 141, + "142": 142, + "143": 143, + "144": 144, + "145": 145, + "146": 146, + "147": 147, + "148": 148, + "149": 149, + "15": 15, + "150": 150, + "151": 151, + "152": 152, + "153": 153, + "154": 154, + "155": 155, + "156": 156, + "157": 157, + "158": 158, + "159": 159, + "16": 16, + "160": 160, + "161": 161, + "162": 162, + "163": 163, + "164": 164, + "165": 165, + "166": 166, + "167": 167, + "168": 168, + "169": 169, + "17": 17, + "170": 170, + "171": 171, + "172": 172, + "173": 173, + "174": 174, + "175": 175, + "176": 176, + "177": 177, + "178": 178, + "179": 179, + "18": 18, + "180": 180, + "181": 181, + "182": 182, + "183": 183, + "184": 184, + "185": 185, + "186": 186, + "187": 187, + "188": 188, + "189": 189, + "19": 19, + "190": 190, + "191": 191, + "192": 192, + "193": 193, + "194": 194, + "195": 195, + "196": 196, + "197": 197, + "198": 198, + "199": 199, + "2": 2, + "20": 20, + "200": 200, + "201": 201, + "202": 202, + "203": 203, + "204": 204, + "205": 205, + "206": 206, + "207": 207, + "208": 208, + "209": 209, + "21": 21, + "210": 210, + "211": 211, + "212": 212, + "213": 213, + "214": 214, + "215": 215, + "216": 216, + "217": 217, + "218": 218, + "219": 219, + "22": 22, + "220": 220, + "221": 221, + "222": 222, + "223": 223, + "224": 224, + "225": 225, + "226": 226, + "227": 227, + "228": 228, + "229": 229, + "23": 23, + "230": 230, + "231": 231, + "232": 232, + "233": 233, + "234": 234, + "235": 235, + "236": 236, + "237": 237, + "238": 238, + "239": 239, + "24": 24, + "240": 240, + "241": 241, + "242": 242, + "243": 243, + "244": 244, + "245": 245, + "246": 246, + "247": 247, + "248": 248, + "249": 249, + "25": 25, + "250": 250, + "251": 251, + "252": 252, + "253": 253, + "254": 254, + "255": 255, + "26": 26, + "27": 27, + "28": 28, + "29": 29, + "3": 3, + "30": 30, + "31": 31, + "32": 32, + "33": 33, + "34": 34, + "35": 35, + "36": 36, + "37": 37, + "38": 38, + "39": 39, + "4": 4, + "40": 40, + "41": 41, + "42": 42, + "43": 43, + "44": 44, + "45": 45, + "46": 46, + "47": 47, + "48": 48, + "49": 49, + "5": 5, + "50": 50, + "51": 51, + "52": 52, + "53": 53, + "54": 54, + "55": 55, + "56": 56, + "57": 57, + "58": 58, + "59": 59, + "6": 6, + "60": 60, + "61": 61, + "62": 62, + "63": 63, + "64": 64, + "65": 65, + "66": 66, + "67": 67, + "68": 68, + "69": 69, + "7": 7, + "70": 70, + "71": 71, + "72": 72, + "73": 73, + "74": 74, + "75": 75, + "76": 76, + "77": 77, + "78": 78, + "79": 79, + "8": 8, + "80": 80, + "81": 81, + "82": 82, + "83": 83, + "84": 84, + "85": 85, + "86": 86, + "87": 87, + "88": 88, + "89": 89, + "9": 9, + "90": 90, + "91": 91, + "92": 92, + "93": 93, + "94": 94, + "95": 95, + "96": 96, + "97": 97, + "98": 98, + "99": 99 + }, + "Rx1DataRate": { + "0_0_false": 0, + "0_0_true": 0, + "0_1_false": 0, + "0_1_true": 0, + "0_2_false": 0, + "0_2_true": 0, + "0_3_false": 0, + "0_3_true": 0, + "0_4_false": 0, + "0_4_true": 0, + "0_5_false": 0, + "0_5_true": 0, + "1_0_false": 1, + "1_0_true": 1, + "1_1_false": 0, + "1_1_true": 0, + "1_2_false": 0, + "1_2_true": 0, + "1_3_false": 0, + "1_3_true": 0, + "1_4_false": 0, + "1_4_true": 0, + "1_5_false": 0, + "1_5_true": 0, + "2_0_false": 2, + "2_0_true": 2, + "2_1_false": 1, + "2_1_true": 1, + "2_2_false": 0, + "2_2_true": 0, + "2_3_false": 0, + "2_3_true": 0, + "2_4_false": 0, + "2_4_true": 0, + "2_5_false": 0, + "2_5_true": 0, + "3_0_false": 3, + "3_0_true": 3, + "3_1_false": 2, + "3_1_true": 2, + "3_2_false": 1, + "3_2_true": 1, + "3_3_false": 0, + "3_3_true": 0, + "3_4_false": 0, + "3_4_true": 0, + "3_5_false": 0, + "3_5_true": 0, + "4_0_false": 4, + "4_0_true": 4, + "4_1_false": 3, + "4_1_true": 3, + "4_2_false": 2, + "4_2_true": 2, + "4_3_false": 1, + "4_3_true": 1, + "4_4_false": 0, + "4_4_true": 0, + "4_5_false": 0, + "4_5_true": 0, + "5_0_false": 5, + "5_0_true": 5, + "5_1_false": 4, + "5_1_true": 4, + "5_2_false": 3, + "5_2_true": 3, + "5_3_false": 2, + "5_3_true": 2, + "5_4_false": 1, + "5_4_true": 1, + "5_5_false": 0, + "5_5_true": 0 + }, + "DefaultRx2Parameters": { + "DataRateIndex": 2, + "Frequency": 926200000 + }, + "BootDwellTime": { + "Uplinks": null, + "Downlinks": null + }, + "Relay": { + "WORChannels": null + }, + "SharedParameters": { + "ReceiveDelay1": 1000000000, + "ReceiveDelay2": 2000000000, + "JoinAcceptDelay1": 5000000000, + "JoinAcceptDelay2": 6000000000, + "MaxFCntGap": 16384, + "ADRAckLimit": "ADR_ACK_LIMIT_64", + "ADRAckDelay": "ADR_ACK_DELAY_32", + "MinRetransmitTimeout": 1000000000, + "MaxRetransmitTimeout": 3000000000, + "RelayForwardDelay": 50000000, + "RelayReceiveDelay": 18000000000, + "ServedRelayBackoff": 8 + } +} \ No newline at end of file diff --git a/pkg/band/testdata/UZ_923_DRAFT_RP002_V1_0_3.json b/pkg/band/testdata/UZ_923_DRAFT_RP002_V1_0_3.json new file mode 100644 index 0000000000..5f1fe7f280 --- /dev/null +++ b/pkg/band/testdata/UZ_923_DRAFT_RP002_V1_0_3.json @@ -0,0 +1,512 @@ +{ + "ID": "UZ_923_DRAFT", + "Beacon": { + "DataRateIndex": 3, + "CodingRate": "4/5", + "Frequencies": [ + 926600000 + ] + }, + "PingSlotFrequencies": [ + 926600000 + ], + "MaxUplinkChannels": 16, + "UplinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "MaxDownlinkChannels": 16, + "DownlinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "SubBands": [ + { + "MinFrequency": 926200000, + "MaxFrequency": 926800000, + "DutyCycle": 0.01, + "MaxEIRP": 16 + } + ], + "DataRates": { + "0": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 12, + "coding_rate": "4/5" + } + } + }, + "1": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 11, + "coding_rate": "4/5" + } + } + }, + "2": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 10, + "coding_rate": "4/5" + } + } + }, + "3": { + "MaxMACPayloadSize": { + "false": 123, + "true": 123 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 9, + "coding_rate": "4/5" + } + } + }, + "4": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 8, + "coding_rate": "4/5" + } + } + }, + "5": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 7, + "coding_rate": "4/5" + } + } + } + }, + "StrictCodingRate": true, + "FreqMultiplier": 100, + "ImplementsCFList": true, + "CFListType": "FREQUENCIES", + "SupportsDynamicADR": true, + "TxOffset": [ + 0, + -2, + -4, + -6, + -8, + -10, + -12, + -14 + ], + "MaxADRDataRateIndex": 5, + "TxParamSetupReqSupport": false, + "DefaultMaxEIRP": 16, + "Rx1Channel": { + "0": 0, + "1": 1, + "10": 10, + "100": 100, + "101": 101, + "102": 102, + "103": 103, + "104": 104, + "105": 105, + "106": 106, + "107": 107, + "108": 108, + "109": 109, + "11": 11, + "110": 110, + "111": 111, + "112": 112, + "113": 113, + "114": 114, + "115": 115, + "116": 116, + "117": 117, + "118": 118, + "119": 119, + "12": 12, + "120": 120, + "121": 121, + "122": 122, + "123": 123, + "124": 124, + "125": 125, + "126": 126, + "127": 127, + "128": 128, + "129": 129, + "13": 13, + "130": 130, + "131": 131, + "132": 132, + "133": 133, + "134": 134, + "135": 135, + "136": 136, + "137": 137, + "138": 138, + "139": 139, + "14": 14, + "140": 140, + "141": 141, + "142": 142, + "143": 143, + "144": 144, + "145": 145, + "146": 146, + "147": 147, + "148": 148, + "149": 149, + "15": 15, + "150": 150, + "151": 151, + "152": 152, + "153": 153, + "154": 154, + "155": 155, + "156": 156, + "157": 157, + "158": 158, + "159": 159, + "16": 16, + "160": 160, + "161": 161, + "162": 162, + "163": 163, + "164": 164, + "165": 165, + "166": 166, + "167": 167, + "168": 168, + "169": 169, + "17": 17, + "170": 170, + "171": 171, + "172": 172, + "173": 173, + "174": 174, + "175": 175, + "176": 176, + "177": 177, + "178": 178, + "179": 179, + "18": 18, + "180": 180, + "181": 181, + "182": 182, + "183": 183, + "184": 184, + "185": 185, + "186": 186, + "187": 187, + "188": 188, + "189": 189, + "19": 19, + "190": 190, + "191": 191, + "192": 192, + "193": 193, + "194": 194, + "195": 195, + "196": 196, + "197": 197, + "198": 198, + "199": 199, + "2": 2, + "20": 20, + "200": 200, + "201": 201, + "202": 202, + "203": 203, + "204": 204, + "205": 205, + "206": 206, + "207": 207, + "208": 208, + "209": 209, + "21": 21, + "210": 210, + "211": 211, + "212": 212, + "213": 213, + "214": 214, + "215": 215, + "216": 216, + "217": 217, + "218": 218, + "219": 219, + "22": 22, + "220": 220, + "221": 221, + "222": 222, + "223": 223, + "224": 224, + "225": 225, + "226": 226, + "227": 227, + "228": 228, + "229": 229, + "23": 23, + "230": 230, + "231": 231, + "232": 232, + "233": 233, + "234": 234, + "235": 235, + "236": 236, + "237": 237, + "238": 238, + "239": 239, + "24": 24, + "240": 240, + "241": 241, + "242": 242, + "243": 243, + "244": 244, + "245": 245, + "246": 246, + "247": 247, + "248": 248, + "249": 249, + "25": 25, + "250": 250, + "251": 251, + "252": 252, + "253": 253, + "254": 254, + "255": 255, + "26": 26, + "27": 27, + "28": 28, + "29": 29, + "3": 3, + "30": 30, + "31": 31, + "32": 32, + "33": 33, + "34": 34, + "35": 35, + "36": 36, + "37": 37, + "38": 38, + "39": 39, + "4": 4, + "40": 40, + "41": 41, + "42": 42, + "43": 43, + "44": 44, + "45": 45, + "46": 46, + "47": 47, + "48": 48, + "49": 49, + "5": 5, + "50": 50, + "51": 51, + "52": 52, + "53": 53, + "54": 54, + "55": 55, + "56": 56, + "57": 57, + "58": 58, + "59": 59, + "6": 6, + "60": 60, + "61": 61, + "62": 62, + "63": 63, + "64": 64, + "65": 65, + "66": 66, + "67": 67, + "68": 68, + "69": 69, + "7": 7, + "70": 70, + "71": 71, + "72": 72, + "73": 73, + "74": 74, + "75": 75, + "76": 76, + "77": 77, + "78": 78, + "79": 79, + "8": 8, + "80": 80, + "81": 81, + "82": 82, + "83": 83, + "84": 84, + "85": 85, + "86": 86, + "87": 87, + "88": 88, + "89": 89, + "9": 9, + "90": 90, + "91": 91, + "92": 92, + "93": 93, + "94": 94, + "95": 95, + "96": 96, + "97": 97, + "98": 98, + "99": 99 + }, + "Rx1DataRate": { + "0_0_false": 0, + "0_0_true": 0, + "0_1_false": 0, + "0_1_true": 0, + "0_2_false": 0, + "0_2_true": 0, + "0_3_false": 0, + "0_3_true": 0, + "0_4_false": 0, + "0_4_true": 0, + "0_5_false": 0, + "0_5_true": 0, + "1_0_false": 1, + "1_0_true": 1, + "1_1_false": 0, + "1_1_true": 0, + "1_2_false": 0, + "1_2_true": 0, + "1_3_false": 0, + "1_3_true": 0, + "1_4_false": 0, + "1_4_true": 0, + "1_5_false": 0, + "1_5_true": 0, + "2_0_false": 2, + "2_0_true": 2, + "2_1_false": 1, + "2_1_true": 1, + "2_2_false": 0, + "2_2_true": 0, + "2_3_false": 0, + "2_3_true": 0, + "2_4_false": 0, + "2_4_true": 0, + "2_5_false": 0, + "2_5_true": 0, + "3_0_false": 3, + "3_0_true": 3, + "3_1_false": 2, + "3_1_true": 2, + "3_2_false": 1, + "3_2_true": 1, + "3_3_false": 0, + "3_3_true": 0, + "3_4_false": 0, + "3_4_true": 0, + "3_5_false": 0, + "3_5_true": 0, + "4_0_false": 4, + "4_0_true": 4, + "4_1_false": 3, + "4_1_true": 3, + "4_2_false": 2, + "4_2_true": 2, + "4_3_false": 1, + "4_3_true": 1, + "4_4_false": 0, + "4_4_true": 0, + "4_5_false": 0, + "4_5_true": 0, + "5_0_false": 5, + "5_0_true": 5, + "5_1_false": 4, + "5_1_true": 4, + "5_2_false": 3, + "5_2_true": 3, + "5_3_false": 2, + "5_3_true": 2, + "5_4_false": 1, + "5_4_true": 1, + "5_5_false": 0, + "5_5_true": 0 + }, + "DefaultRx2Parameters": { + "DataRateIndex": 2, + "Frequency": 926200000 + }, + "BootDwellTime": { + "Uplinks": null, + "Downlinks": null + }, + "Relay": { + "WORChannels": null + }, + "SharedParameters": { + "ReceiveDelay1": 1000000000, + "ReceiveDelay2": 2000000000, + "JoinAcceptDelay1": 5000000000, + "JoinAcceptDelay2": 6000000000, + "MaxFCntGap": 16384, + "ADRAckLimit": "ADR_ACK_LIMIT_64", + "ADRAckDelay": "ADR_ACK_DELAY_32", + "MinRetransmitTimeout": 1000000000, + "MaxRetransmitTimeout": 3000000000, + "RelayForwardDelay": 50000000, + "RelayReceiveDelay": 18000000000, + "ServedRelayBackoff": 8 + } +} \ No newline at end of file diff --git a/pkg/band/testdata/UZ_923_DRAFT_RP002_V1_0_4.json b/pkg/band/testdata/UZ_923_DRAFT_RP002_V1_0_4.json new file mode 100644 index 0000000000..5f1fe7f280 --- /dev/null +++ b/pkg/band/testdata/UZ_923_DRAFT_RP002_V1_0_4.json @@ -0,0 +1,512 @@ +{ + "ID": "UZ_923_DRAFT", + "Beacon": { + "DataRateIndex": 3, + "CodingRate": "4/5", + "Frequencies": [ + 926600000 + ] + }, + "PingSlotFrequencies": [ + 926600000 + ], + "MaxUplinkChannels": 16, + "UplinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "MaxDownlinkChannels": 16, + "DownlinkChannels": [ + { + "Frequency": 926400000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926600000, + "MinDataRate": 0, + "MaxDataRate": 5 + }, + { + "Frequency": 926800000, + "MinDataRate": 0, + "MaxDataRate": 5 + } + ], + "SubBands": [ + { + "MinFrequency": 926200000, + "MaxFrequency": 926800000, + "DutyCycle": 0.01, + "MaxEIRP": 16 + } + ], + "DataRates": { + "0": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 12, + "coding_rate": "4/5" + } + } + }, + "1": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 11, + "coding_rate": "4/5" + } + } + }, + "2": { + "MaxMACPayloadSize": { + "false": 59, + "true": 59 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 10, + "coding_rate": "4/5" + } + } + }, + "3": { + "MaxMACPayloadSize": { + "false": 123, + "true": 123 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 9, + "coding_rate": "4/5" + } + } + }, + "4": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 8, + "coding_rate": "4/5" + } + } + }, + "5": { + "MaxMACPayloadSize": { + "false": 250, + "true": 250 + }, + "Rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 7, + "coding_rate": "4/5" + } + } + } + }, + "StrictCodingRate": true, + "FreqMultiplier": 100, + "ImplementsCFList": true, + "CFListType": "FREQUENCIES", + "SupportsDynamicADR": true, + "TxOffset": [ + 0, + -2, + -4, + -6, + -8, + -10, + -12, + -14 + ], + "MaxADRDataRateIndex": 5, + "TxParamSetupReqSupport": false, + "DefaultMaxEIRP": 16, + "Rx1Channel": { + "0": 0, + "1": 1, + "10": 10, + "100": 100, + "101": 101, + "102": 102, + "103": 103, + "104": 104, + "105": 105, + "106": 106, + "107": 107, + "108": 108, + "109": 109, + "11": 11, + "110": 110, + "111": 111, + "112": 112, + "113": 113, + "114": 114, + "115": 115, + "116": 116, + "117": 117, + "118": 118, + "119": 119, + "12": 12, + "120": 120, + "121": 121, + "122": 122, + "123": 123, + "124": 124, + "125": 125, + "126": 126, + "127": 127, + "128": 128, + "129": 129, + "13": 13, + "130": 130, + "131": 131, + "132": 132, + "133": 133, + "134": 134, + "135": 135, + "136": 136, + "137": 137, + "138": 138, + "139": 139, + "14": 14, + "140": 140, + "141": 141, + "142": 142, + "143": 143, + "144": 144, + "145": 145, + "146": 146, + "147": 147, + "148": 148, + "149": 149, + "15": 15, + "150": 150, + "151": 151, + "152": 152, + "153": 153, + "154": 154, + "155": 155, + "156": 156, + "157": 157, + "158": 158, + "159": 159, + "16": 16, + "160": 160, + "161": 161, + "162": 162, + "163": 163, + "164": 164, + "165": 165, + "166": 166, + "167": 167, + "168": 168, + "169": 169, + "17": 17, + "170": 170, + "171": 171, + "172": 172, + "173": 173, + "174": 174, + "175": 175, + "176": 176, + "177": 177, + "178": 178, + "179": 179, + "18": 18, + "180": 180, + "181": 181, + "182": 182, + "183": 183, + "184": 184, + "185": 185, + "186": 186, + "187": 187, + "188": 188, + "189": 189, + "19": 19, + "190": 190, + "191": 191, + "192": 192, + "193": 193, + "194": 194, + "195": 195, + "196": 196, + "197": 197, + "198": 198, + "199": 199, + "2": 2, + "20": 20, + "200": 200, + "201": 201, + "202": 202, + "203": 203, + "204": 204, + "205": 205, + "206": 206, + "207": 207, + "208": 208, + "209": 209, + "21": 21, + "210": 210, + "211": 211, + "212": 212, + "213": 213, + "214": 214, + "215": 215, + "216": 216, + "217": 217, + "218": 218, + "219": 219, + "22": 22, + "220": 220, + "221": 221, + "222": 222, + "223": 223, + "224": 224, + "225": 225, + "226": 226, + "227": 227, + "228": 228, + "229": 229, + "23": 23, + "230": 230, + "231": 231, + "232": 232, + "233": 233, + "234": 234, + "235": 235, + "236": 236, + "237": 237, + "238": 238, + "239": 239, + "24": 24, + "240": 240, + "241": 241, + "242": 242, + "243": 243, + "244": 244, + "245": 245, + "246": 246, + "247": 247, + "248": 248, + "249": 249, + "25": 25, + "250": 250, + "251": 251, + "252": 252, + "253": 253, + "254": 254, + "255": 255, + "26": 26, + "27": 27, + "28": 28, + "29": 29, + "3": 3, + "30": 30, + "31": 31, + "32": 32, + "33": 33, + "34": 34, + "35": 35, + "36": 36, + "37": 37, + "38": 38, + "39": 39, + "4": 4, + "40": 40, + "41": 41, + "42": 42, + "43": 43, + "44": 44, + "45": 45, + "46": 46, + "47": 47, + "48": 48, + "49": 49, + "5": 5, + "50": 50, + "51": 51, + "52": 52, + "53": 53, + "54": 54, + "55": 55, + "56": 56, + "57": 57, + "58": 58, + "59": 59, + "6": 6, + "60": 60, + "61": 61, + "62": 62, + "63": 63, + "64": 64, + "65": 65, + "66": 66, + "67": 67, + "68": 68, + "69": 69, + "7": 7, + "70": 70, + "71": 71, + "72": 72, + "73": 73, + "74": 74, + "75": 75, + "76": 76, + "77": 77, + "78": 78, + "79": 79, + "8": 8, + "80": 80, + "81": 81, + "82": 82, + "83": 83, + "84": 84, + "85": 85, + "86": 86, + "87": 87, + "88": 88, + "89": 89, + "9": 9, + "90": 90, + "91": 91, + "92": 92, + "93": 93, + "94": 94, + "95": 95, + "96": 96, + "97": 97, + "98": 98, + "99": 99 + }, + "Rx1DataRate": { + "0_0_false": 0, + "0_0_true": 0, + "0_1_false": 0, + "0_1_true": 0, + "0_2_false": 0, + "0_2_true": 0, + "0_3_false": 0, + "0_3_true": 0, + "0_4_false": 0, + "0_4_true": 0, + "0_5_false": 0, + "0_5_true": 0, + "1_0_false": 1, + "1_0_true": 1, + "1_1_false": 0, + "1_1_true": 0, + "1_2_false": 0, + "1_2_true": 0, + "1_3_false": 0, + "1_3_true": 0, + "1_4_false": 0, + "1_4_true": 0, + "1_5_false": 0, + "1_5_true": 0, + "2_0_false": 2, + "2_0_true": 2, + "2_1_false": 1, + "2_1_true": 1, + "2_2_false": 0, + "2_2_true": 0, + "2_3_false": 0, + "2_3_true": 0, + "2_4_false": 0, + "2_4_true": 0, + "2_5_false": 0, + "2_5_true": 0, + "3_0_false": 3, + "3_0_true": 3, + "3_1_false": 2, + "3_1_true": 2, + "3_2_false": 1, + "3_2_true": 1, + "3_3_false": 0, + "3_3_true": 0, + "3_4_false": 0, + "3_4_true": 0, + "3_5_false": 0, + "3_5_true": 0, + "4_0_false": 4, + "4_0_true": 4, + "4_1_false": 3, + "4_1_true": 3, + "4_2_false": 2, + "4_2_true": 2, + "4_3_false": 1, + "4_3_true": 1, + "4_4_false": 0, + "4_4_true": 0, + "4_5_false": 0, + "4_5_true": 0, + "5_0_false": 5, + "5_0_true": 5, + "5_1_false": 4, + "5_1_true": 4, + "5_2_false": 3, + "5_2_true": 3, + "5_3_false": 2, + "5_3_true": 2, + "5_4_false": 1, + "5_4_true": 1, + "5_5_false": 0, + "5_5_true": 0 + }, + "DefaultRx2Parameters": { + "DataRateIndex": 2, + "Frequency": 926200000 + }, + "BootDwellTime": { + "Uplinks": null, + "Downlinks": null + }, + "Relay": { + "WORChannels": null + }, + "SharedParameters": { + "ReceiveDelay1": 1000000000, + "ReceiveDelay2": 2000000000, + "JoinAcceptDelay1": 5000000000, + "JoinAcceptDelay2": 6000000000, + "MaxFCntGap": 16384, + "ADRAckLimit": "ADR_ACK_LIMIT_64", + "ADRAckDelay": "ADR_ACK_DELAY_32", + "MinRetransmitTimeout": 1000000000, + "MaxRetransmitTimeout": 3000000000, + "RelayForwardDelay": 50000000, + "RelayReceiveDelay": 18000000000, + "ServedRelayBackoff": 8 + } +} \ No newline at end of file diff --git a/pkg/band/uz_923_draft.go b/pkg/band/uz_923_draft.go new file mode 100644 index 0000000000..8d96b91a13 --- /dev/null +++ b/pkg/band/uz_923_draft.go @@ -0,0 +1,50 @@ +// Copyright © 2025 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package band implements LoRaWAN frequency band definitions. +package band + +import "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" + +const ( + // UZ_923_DRAFT is the ID of the draft Uzbekistan 923Mhz band. + UZ_923_DRAFT = "UZ_923_DRAFT" // nolint: revive,staticcheck +) + +var ( + uz923DraftBeaconFrequencies = []uint64{926600000} + uz923DraftDefaultChannels = []Channel{ + { + Frequency: 926400000, + MaxDataRate: ttnpb.DataRateIndex_DATA_RATE_5, + }, + { + Frequency: 926600000, + MaxDataRate: ttnpb.DataRateIndex_DATA_RATE_5, + }, + { + Frequency: 926800000, + MaxDataRate: ttnpb.DataRateIndex_DATA_RATE_5, + }, + } + + uz923DraftDownlinkDRTable = [6][6]ttnpb.DataRateIndex{ + {0, 0, 0, 0, 0, 0}, + {1, 0, 0, 0, 0, 0}, + {2, 1, 0, 0, 0, 0}, + {3, 2, 1, 0, 0, 0}, + {4, 3, 2, 1, 0, 0}, + {5, 4, 3, 2, 1, 0}, + } +) diff --git a/pkg/band/uz_923_draft_universal.go b/pkg/band/uz_923_draft_universal.go new file mode 100644 index 0000000000..0990723361 --- /dev/null +++ b/pkg/band/uz_923_draft_universal.go @@ -0,0 +1,95 @@ +// Copyright © 2025 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package band implements LoRaWAN frequency band definitions. +package band + +import "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" + +// UZ_923_Draft_Universal is the band definition for UZ923. +var UZ_923_Draft_Universal = Band{ // nolint: revive,staticcheck + ID: UZ_923_DRAFT, + + SupportsDynamicADR: true, + + MaxUplinkChannels: 16, + UplinkChannels: uz923DraftDefaultChannels, + + MaxDownlinkChannels: 16, + DownlinkChannels: uz923DraftDefaultChannels, + + SubBands: []SubBandParameters{ + { + MinFrequency: 926200000, + MaxFrequency: 926800000, + DutyCycle: 0.01, + MaxEIRP: 16.0, + }, + }, + + DataRates: map[ttnpb.DataRateIndex]DataRate{ + ttnpb.DataRateIndex_DATA_RATE_0: makeLoRaDataRate(12, 125000, Cr4_5, makeConstMaxMACPayloadSizeFunc(59)), + ttnpb.DataRateIndex_DATA_RATE_1: makeLoRaDataRate(11, 125000, Cr4_5, makeConstMaxMACPayloadSizeFunc(59)), + ttnpb.DataRateIndex_DATA_RATE_2: makeLoRaDataRate(10, 125000, Cr4_5, makeConstMaxMACPayloadSizeFunc(59)), + ttnpb.DataRateIndex_DATA_RATE_3: makeLoRaDataRate(9, 125000, Cr4_5, makeConstMaxMACPayloadSizeFunc(123)), + ttnpb.DataRateIndex_DATA_RATE_4: makeLoRaDataRate(8, 125000, Cr4_5, makeConstMaxMACPayloadSizeFunc(250)), + ttnpb.DataRateIndex_DATA_RATE_5: makeLoRaDataRate(7, 125000, Cr4_5, makeConstMaxMACPayloadSizeFunc(250)), + }, + MaxADRDataRateIndex: ttnpb.DataRateIndex_DATA_RATE_5, + StrictCodingRate: true, + + DefaultMaxEIRP: 16, + TxOffset: []float32{ + 0, + -2, + -4, + -6, + -8, + -10, + -12, + -14, + }, + + Rx1Channel: channelIndexIdentity, + Rx1DataRate: func(idx ttnpb.DataRateIndex, offset ttnpb.DataRateOffset, _ bool) (ttnpb.DataRateIndex, error) { + if idx > ttnpb.DataRateIndex_DATA_RATE_5 { + return 0, errDataRateIndexTooHigh.WithAttributes("max", 5) + } + if offset > 5 { + return 0, errDataRateOffsetTooHigh.WithAttributes("max", 5) + } + return uz923DraftDownlinkDRTable[idx][offset], nil + }, + + GenerateChMasks: generateChMask16, + ParseChMask: parseChMask16, + + FreqMultiplier: 100, + ImplementsCFList: true, + CFListType: ttnpb.CFListType_FREQUENCIES, + + DefaultRx2Parameters: Rx2Parameters{ + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_2, + Frequency: 926200000, + }, + + Beacon: Beacon{ + DataRateIndex: ttnpb.DataRateIndex_DATA_RATE_3, + CodingRate: Cr4_5, + Frequencies: uz923DraftBeaconFrequencies, + }, + PingSlotFrequencies: uz923DraftBeaconFrequencies, + + SharedParameters: relayAwareSharedParameters, +} diff --git a/pkg/version/ttn.go b/pkg/version/ttn.go index c6c8c6173d..234525f141 100644 --- a/pkg/version/ttn.go +++ b/pkg/version/ttn.go @@ -3,4 +3,4 @@ package version // TTN Version -var TTN = "3.35.0-dev" +var TTN = "3.35.1-dev" diff --git a/pkg/web/web.go b/pkg/web/web.go index 1d32d9c675..3bc0b0b756 100644 --- a/pkg/web/web.go +++ b/pkg/web/web.go @@ -196,6 +196,7 @@ func New(ctx context.Context, opts ...Option) (*Server, error) { mux.MiddlewareFunc(webmiddleware.Metadata("X-Forwarded-For", "User-Agent")), mux.MiddlewareFunc(webmiddleware.MaxBody(1024*1024*16)), mux.MiddlewareFunc(webmiddleware.SecurityHeaders()), + mux.MiddlewareFunc(webmiddleware.HSTSHeaders()), mux.MiddlewareFunc(webmiddleware.Log(logger, options.logIgnorePaths)), mux.MiddlewareFunc(webmiddleware.Cookies(hashKey, blockKey)), mux.MiddlewareFunc(webmiddleware.NoCache), diff --git a/pkg/webmiddleware/hsts_headers.go b/pkg/webmiddleware/hsts_headers.go new file mode 100644 index 0000000000..248e2a5b8b --- /dev/null +++ b/pkg/webmiddleware/hsts_headers.go @@ -0,0 +1,33 @@ +// Copyright © 2025 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package webmiddleware + +import ( + "net/http" +) + +// HSTSHeaders returns a middleware that adds HTTP Strict Transport Security (HSTS) headers. +// See https://datatracker.ietf.org/doc/html/rfc6797 and https://hstspreload.org/. +func HSTSHeaders() MiddlewareFunc { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Only add HSTS when the request is served over HTTPS. + if r.TLS != nil { + w.Header().Set("Strict-Transport-Security", "max-age=63072000; includeSubDomains; preload") + } + next.ServeHTTP(w, r) + }) + } +} diff --git a/pkg/webmiddleware/hsts_headers_test.go b/pkg/webmiddleware/hsts_headers_test.go new file mode 100644 index 0000000000..25481e0d60 --- /dev/null +++ b/pkg/webmiddleware/hsts_headers_test.go @@ -0,0 +1,64 @@ +// Copyright © 2025 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package webmiddleware_test + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/smarty/assertions" + "go.thethings.network/lorawan-stack/v3/pkg/webmiddleware" +) + +func TestHSTSHeaders(t *testing.T) { + t.Parallel() + + a := assertions.New(t) + + m := webmiddleware.HSTSHeaders() + a.So(m, assertions.ShouldNotBeNil) + + t.Run("HTTPS request should add HSTS headers", func(t *testing.T) { + t.Parallel() + a := assertions.New(t) + + req := httptest.NewRequest("GET", "https://example.com", nil) + rec := httptest.NewRecorder() + + handler := m(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusOK) + })) + + handler.ServeHTTP(rec, req) + + a.So(rec.Header().Get("Strict-Transport-Security"), assertions.ShouldNotBeEmpty) + }) + + t.Run("HTTP request should NOT add HSTS headers", func(t *testing.T) { + t.Parallel() + a := assertions.New(t) + + req := httptest.NewRequest("GET", "http://example.com", nil) + rec := httptest.NewRecorder() + + handler := m(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusOK) + })) + handler.ServeHTTP(rec, req) + + a.So(rec.Header().Get("Strict-Transport-Security"), assertions.ShouldBeEmpty) + }) +} diff --git a/pkg/webui/console/containers/gateway-connection/index.js b/pkg/webui/console/containers/gateway-connection/index.js index 7b5c52b82c..0e4389af64 100644 --- a/pkg/webui/console/containers/gateway-connection/index.js +++ b/pkg/webui/console/containers/gateway-connection/index.js @@ -12,10 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -import React, { useEffect, useMemo } from 'react' +import React, { useMemo } from 'react' import classnames from 'classnames' import { FormattedNumber, defineMessages } from 'react-intl' -import { useDispatch, useSelector } from 'react-redux' +import { useSelector } from 'react-redux' import Icon, { IconArrowsSort, IconBroadcast } from '@ttn-lw/components/icon' import Status from '@ttn-lw/components/status' @@ -35,8 +35,6 @@ import { isNotFoundError, isTranslated } from '@ttn-lw/lib/errors/utils' import { selectGsConfig } from '@ttn-lw/lib/selectors/env' import getHostFromUrl from '@ttn-lw/lib/host-from-url' -import { startGatewayStatistics, stopGatewayStatistics } from '@console/store/actions/gateways' - import { selectGatewayById, selectGatewayStatistics, @@ -73,17 +71,8 @@ const GatewayConnection = props => { const lastSeen = useSelector(selectGatewayLastSeen) const isOtherCluster = consoleGsAddress !== gatewayServerAddress - const dispatch = useDispatch() - useConnectionReactor(gtwId) - useEffect(() => { - dispatch(startGatewayStatistics(gtwId)) - return () => { - dispatch(stopGatewayStatistics()) - } - }, [dispatch, gtwId]) - const status = useMemo(() => { const statsNotFound = Boolean(error) && isNotFoundError(error) const isDisconnected = Boolean(statistics) && Boolean(statistics.disconnected_at) diff --git a/pkg/webui/console/containers/gateway-status-panel/index.js b/pkg/webui/console/containers/gateway-status-panel/index.js index 9350c3277e..c6737010d4 100644 --- a/pkg/webui/console/containers/gateway-status-panel/index.js +++ b/pkg/webui/console/containers/gateway-status-panel/index.js @@ -108,13 +108,13 @@ const GatewayStatusPanel = () => { const error = useSelector(selectGatewayStatisticsError) const fetching = useSelector(selectGatewayStatisticsIsFetching) const isDisconnected = Boolean(gatewayStats?.disconnected_at) - const isConnected = Boolean(gatewayStats?.connected_at) && !isDisconnected const isFetching = !Boolean(gatewayStats) && fetching - const hasStatistics = Boolean(gatewayStats) const noConnectionYet = useMemo( () => isBackend(error) && getBackendErrorName(error).includes('not_connected'), [error], ) + const hasStatistics = Boolean(gatewayStats) + const isConnected = Boolean(gatewayStats?.connected_at) && !isDisconnected && !noConnectionYet const hasError = Boolean(error) && Boolean(error.message) const isUnavailable = hasError && error.message === 'Unavailable' @@ -190,15 +190,7 @@ const GatewayStatusPanel = () => { )} - {isUnavailable && ( -