From cac8174ad51f8ebb56007cf1cf039b2f055ebb68 Mon Sep 17 00:00:00 2001 From: SodaWithoutSparkles <64138578+SodaWithoutSparkles@users.noreply.github.com> Date: Sun, 5 Apr 2026 21:53:33 +0800 Subject: [PATCH 1/4] feat: support AS923 region Signed-off-by: SodaWithoutSparkles <64138578+SodaWithoutSparkles@users.noreply.github.com> --- src/s2e.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/s2e.c b/src/s2e.c index 6a9c0094..76a6e3ee 100644 --- a/src/s2e.c +++ b/src/s2e.c @@ -1003,6 +1003,13 @@ static int handle_router_config (s2ctx_t* s2ctx, ujdec_t* D) { resetDC(s2ctx, 50); // 2% break; } + // Added AS923 region variants with different naming conventions + // Needed to support "Asia 923-925 (Used by TTN Australia - Secondary Channels)" on TTN + case J_AS923: { // non-std generic naming + region = J_AS923_1; + region_s = "AS923-1"; + // FALL THRU + } case J_AS923JP: { // non-std obsolete naming region = J_AS923_1; region_s = "AS923-1"; From d89298883b04f1e75d807060633b90ad5e62c15a Mon Sep 17 00:00:00 2001 From: SodaWithoutSparkles <64138578+SodaWithoutSparkles@users.noreply.github.com> Date: Sun, 5 Apr 2026 21:54:06 +0800 Subject: [PATCH 2/4] feat: use modern syntax for gpio Signed-off-by: SodaWithoutSparkles <64138578+SodaWithoutSparkles@users.noreply.github.com> --- examples/corecell/reset_lgw.sh | 75 ++++++++++++++-------------------- 1 file changed, 30 insertions(+), 45 deletions(-) diff --git a/examples/corecell/reset_lgw.sh b/examples/corecell/reset_lgw.sh index 0136d72e..af5b312e 100755 --- a/examples/corecell/reset_lgw.sh +++ b/examples/corecell/reset_lgw.sh @@ -1,16 +1,11 @@ #!/bin/sh -# This script is intended to be used on SX1302 CoreCell platform, it performs -# the following actions: -# - export/unpexort GPIO23 and GPIO18 used to reset the SX1302 chip and to enable the LDOs -# -# Usage examples: -# ./reset_lgw.sh stop -# ./reset_lgw.sh start - -# GPIO mapping has to be adapted with HW -# +# This script uses gpioset (libgpiod) to reset SX1302 CoreCell. +# Board profile: SX1302 present, SX1261 not present. +# For raspberry pi, remember to use the GPIO number instead of physical pin number. +# For example, for raspberry pi 4, GPIO23 is physical pin 16 +GPIO_CHIP="gpiochip0" SX1302_RESET_PIN=23 SX1302_POWER_EN_PIN=18 @@ -18,53 +13,43 @@ WAIT_GPIO() { sleep 0.1 } -init() { - # setup GPIOs - echo "$SX1302_RESET_PIN" > /sys/class/gpio/export; WAIT_GPIO - echo "$SX1302_POWER_EN_PIN" > /sys/class/gpio/export; WAIT_GPIO - - # set GPIOs as output - echo "out" > /sys/class/gpio/gpio$SX1302_RESET_PIN/direction; WAIT_GPIO - echo "out" > /sys/class/gpio/gpio$SX1302_POWER_EN_PIN/direction; WAIT_GPIO +require_gpioset() { + if ! command -v gpioset >/dev/null 2>&1; then + echo "ERROR: gpioset not found. Please install libgpiod tools." + exit 1 + fi } -reset() { - echo "CoreCell reset through GPIO$SX1302_RESET_PIN..." +reset_lgw() { + echo "Accessing $GPIO_CHIP..." echo "CoreCell power enable through GPIO$SX1302_POWER_EN_PIN..." + echo "CoreCell reset through GPIO$SX1302_RESET_PIN..." - # write output for SX1302 CoreCell power_enable and reset - echo "1" > /sys/class/gpio/gpio$SX1302_POWER_EN_PIN/value; WAIT_GPIO - - echo "1" > /sys/class/gpio/gpio$SX1302_RESET_PIN/value; WAIT_GPIO - echo "0" > /sys/class/gpio/gpio$SX1302_RESET_PIN/value; WAIT_GPIO + gpioset "$GPIO_CHIP" "$SX1302_POWER_EN_PIN"=1; WAIT_GPIO + gpioset "$GPIO_CHIP" "$SX1302_RESET_PIN"=1; WAIT_GPIO + gpioset "$GPIO_CHIP" "$SX1302_RESET_PIN"=0; WAIT_GPIO } -term() { - # cleanup all GPIOs - if [ -d /sys/class/gpio/gpio$SX1302_RESET_PIN ] - then - echo "$SX1302_RESET_PIN" > /sys/class/gpio/unexport; WAIT_GPIO - fi - if [ -d /sys/class/gpio/gpio$SX1302_POWER_EN_PIN ] - then - echo "$SX1302_POWER_EN_PIN" > /sys/class/gpio/unexport; WAIT_GPIO - fi +power_down() { + echo "Powering down concentrator..." + gpioset "$GPIO_CHIP" "$SX1302_POWER_EN_PIN"=0 + gpioset "$GPIO_CHIP" "$SX1302_RESET_PIN"=1 } case "$1" in start) - term # just in case - init - reset - ;; + require_gpioset + reset_lgw + echo "Concentrator reset sequence complete." + ;; stop) - reset - term - ;; + require_gpioset + power_down + ;; *) - echo "Usage: $0 {start|stop}" - exit 1 - ;; + echo "Usage: $0 {start|stop}" + exit 1 + ;; esac exit 0 \ No newline at end of file From cad841c1ab963c0cf0ed226477b3a3bb355dcf7b Mon Sep 17 00:00:00 2001 From: SodaWithoutSparkles <64138578+SodaWithoutSparkles@users.noreply.github.com> Date: Sun, 5 Apr 2026 21:54:45 +0800 Subject: [PATCH 3/4] feat: add LNS connection setup documentation and example files Signed-off-by: SodaWithoutSparkles <64138578+SodaWithoutSparkles@users.noreply.github.com> --- .gitignore | 6 + README.md | 12 +- examples/corecell/lns-ttn/README.md | 43 ++++++ examples/corecell/lns-ttn/tc.key.example | 1 + examples/corecell/lns-ttn/tc.trust | 154 +++++++++++++++++---- examples/corecell/lns-ttn/tc.trust.example | 4 + examples/corecell/lns-ttn/tc.uri | 2 +- examples/corecell/lns-ttn/tc.uri.example | 1 + 8 files changed, 193 insertions(+), 30 deletions(-) create mode 100644 .gitignore create mode 100644 examples/corecell/lns-ttn/README.md create mode 100644 examples/corecell/lns-ttn/tc.key.example create mode 100644 examples/corecell/lns-ttn/tc.trust.example create mode 100644 examples/corecell/lns-ttn/tc.uri.example diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..bc1ea478 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +# build artifacts +/build-* + +# keys and certificates +*.key +*.crt \ No newline at end of file diff --git a/README.md b/README.md index 4cfc0f28..7b72f46f 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,8 @@ cd examples/live-s2.sm.tc RADIODEV=/dev/spidev0.0 ../../build-rpi-std/bin/station ``` -**Note:** The SPI device for the radio MAY be passed as an environment variable using `RADIODEV`. +> [!NOTE] +> The SPI device for the radio MAY be passed as an environment variable using `RADIODEV`. The example configuration connects to a public test server [s2.sm.tc](wss://s2.sm.tc) through which Station fetches all required credentials and a channel plan matching the region as determined from the IP address of the gateway. Provided there are active LoRa devices in proximity, received LoRa frames are printed in the log output on `stderr`. @@ -87,7 +88,11 @@ cd examples/corecell This example configuration for Corecell connects to [The Things Network](https://www.thethingsnetwork.org/) public LNS. The example [station.conf](station.conf) file holds the required radio configurations and station fetches the channel plan from the configured LNS url ([tc.uri](tc.uri)). -Note: SPI port requires to be activated on Raspberry Pi thanks to [raspi-config](https://www.raspberrypi.org/documentation/configuration/raspi-config.md) tool. +> [!NOTE] +> SPI port requires to be activated on Raspberry Pi thanks to [raspi-config](https://www.raspberrypi.org/documentation/configuration/raspi-config.md) tool. + +> [!NOTE] +> You may want to try `make platform=corecell variant=std CC=gcc AR=ar LD=ld` if you have issues with the default clang compiler. #### PicoCell Gateway (Linux OS as HOST + [SX1308 USB Reference design](https://www.semtech.com/products/wireless-rf/lora-gateways/sx1308p868gw)) @@ -101,7 +106,8 @@ cd examples/live-s2.sm.tc RADIODEV=/dev/ttyACM0 ../../build-linuxpico-std/bin/station ``` -**Note:** The serial device for the PicoCell MAY be passed as an environment variable using `RADIODEV`. +> [!NOTE] +> The serial device for the PicoCell MAY be passed as an environment variable using `RADIODEV`. ## Next Steps diff --git a/examples/corecell/lns-ttn/README.md b/examples/corecell/lns-ttn/README.md new file mode 100644 index 00000000..85f38903 --- /dev/null +++ b/examples/corecell/lns-ttn/README.md @@ -0,0 +1,43 @@ +# Setting up a LNS connection + +To setup a LNS connection, you will need some combination of the following: + +- `tc.key` +- `tc.trust` +- `tc.uri` + +For what these files are, see the [LNS documentation](https://doc.sm.tc/station/authmodes.html) + +## Connecting to The Things Network + +To connect to The Things Network, you should + +1. Create a new gateway in the console, just use any random gateway EUI would work, we would change it later +2. Set a frequency plan. For example, `Asia 923-925`. Prefer those with "Used by TTN" in the description. It has been tested with `Asia 923-925 (Used by TTN Australia - Secondary Channels)`. +3. Obtain the LNS URI, for example `wss://au1.cloud.thethings.network:8887`. See [LNS Server Address](https://www.thethingsindustries.com/docs/hardware/gateways/concepts/lora-basics-station/lns/#lns-server-address). Alternatively look at your console's gateway URL. For example, if the URL is `https://au1.cloud.thethings.network/console/gateways/add`, then the LNS URI would be `wss://au1.cloud.thethings.network:8887` +4. Get the LNS Key by ticking the "Require authenticated connections" box and then clicking "Generate API key for LNS". You will be prompted with a token and a file to download after you register the gateway. Copy its contents into `tc.key` next to `tc.key.example`. +5. Get the CA certificate. See `tc.trust.example` for instructions. +6. Untick "share gateway infomation" if you wish to +7. After registering, start the station with `./start-station.sh -l ./lns-ttn`. Expecxt it to not connect, but you should see `Station EUI` in the logs. Copy the EUI and paste it into the console's gateway EUI field. The EUI might be missing a leading zeros in each of the sections, so make sure to add those if necessary. For example, if the EUI is `ab:cd:ef:12`, then the zero-padded version would be `00 ab 00 cd 00 ef 00 12`. +8. Stop the station and start it again. It should connect to TTN and you should see `connected to LNS` in the logs. + +## Troubleshooting + +### Connection issues + +- "The peer notified us that the connection is going to be closed" + - Normal behaviour. Just wait for it to reconnect. If it doesn't reconnect after a few minutes, then there might be an issue with your configuration. +- Connection hangs + - Check `tc.uri` is correct + - Check your network connection + +### LoraWan issues +- "Unrecognized region: XXXXX - ignored" + - It was tested on `Asia 923-925 (Used by TTN Australia - Secondary Channels)`. A patch has to be applied for it to work in this region. + - If you use another region that also have this issue, see [this discussion](https://forum.chirpstack.io/t/downlink-packets-get-dropped-in-the-gateway/14568/5). +- "Received 'dnmsg' before 'router_config' - dropped" + - If you look carefully, you should see "Unrecognized region: XXXXX - ignored" earlier. Same solution as above. +- "Beaconing suspend - missing GPS data: time" + - This is normal if you don't have a GPS connected. Just ignore it. It will still work without GPS, but it won't be able to beacon or do time synchronization. + - Unless you need to operate in Class B, this doesn't matter. + diff --git a/examples/corecell/lns-ttn/tc.key.example b/examples/corecell/lns-ttn/tc.key.example new file mode 100644 index 00000000..48166255 --- /dev/null +++ b/examples/corecell/lns-ttn/tc.key.example @@ -0,0 +1 @@ +Authorization: Bearer \ No newline at end of file diff --git a/examples/corecell/lns-ttn/tc.trust b/examples/corecell/lns-ttn/tc.trust index 60e3d69d..045cf679 100644 --- a/examples/corecell/lns-ttn/tc.trust +++ b/examples/corecell/lns-ttn/tc.trust @@ -1,28 +1,130 @@ -----BEGIN CERTIFICATE----- -MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/ -MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow -SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT -GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF -q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8 -SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0 -Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA -a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj -/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T -AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG -CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv -bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k -c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw -VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC -ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz -MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu -Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF -AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo -uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/ -wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu -X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG -PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6 -KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg== +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE +BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD +EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG +EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT +DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r +Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 +3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K +b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN +Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ +4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf +1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu +hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH +usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r +OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY +9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV +0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt +hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw +TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx +e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA +JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD +YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n +JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ +m+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 +MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH +FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ +gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t +dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce +VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 +DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM +CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy +8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa +2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 +xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 +MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 +kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp +N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 +AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd +fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx +kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS +btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 +Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN +c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ +3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw +DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA +A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE +YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW +xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ +gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW +aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV +Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 +KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi +JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB +f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr +Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 +rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc +eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN +/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri +83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA +MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 +AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgIQBJv3GxRODKBYlzn8qSP+4zANBgkqhkiG9w0BAQsFADBI +MR4wHAYDVQQKExVUaGUgVGhpbmdzIEluZHVzdHJpZXMxJjAkBgNVBAMTHVRoZSBU +aGluZ3MgSW5kdXN0cmllcyBSb290IENBMB4XDTIxMDEyMDEwMDgwMVoXDTQxMDEx +NTEwMDgwMVowSDEeMBwGA1UEChMVVGhlIFRoaW5ncyBJbmR1c3RyaWVzMSYwJAYD +VQQDEx1UaGUgVGhpbmdzIEluZHVzdHJpZXMgUm9vdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAM9D2p1qz5aDxnad1qvLl2UoOOALSHiM5CA7yI/N +9D9ycOCzA1AbFu/RJCKVoXYPaO994iorDmovCLMioyo6jnSvWBgEM5f65HbXdj7n +J1khY+mBzsd16LLIcSCjaSfX9s3QBKiewrc+rV7tZOpvTmhlozizkeCzOQVq37/2 +NcQ040gOtKaxblX5iJoJSqE4SPECUgV8T6+srBTR8zPd3WOph49STWIcCJ/vYPH6 +qJ+9/siCjfR8uKtSBkMC5YrPuzjGGiPSHDu3f1V/BIgYVoksGL9+uhrLGyVZgCFZ +rp3o+AAKJnjIRKRYfy7KAc7Bn6gHRjCvYl3X3k7TQMGOjT0CAwEAAaNFMEMwDgYD +VR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYEFCor54vV +ktTCK4yUtCe0RS5i+J2NMA0GCSqGSIb3DQEBCwUAA4IBAQBFV6uMLi1YimbR9Gqf +hTz5Ls3RlLiXfsbz4vSyH54lTuyfxaJqsae+jqpwNhlSO0Ixun2GC5pSS4IQAxpc ++p6Q9D4FO4mHVqIeZ+RP0B2dY09tFXmmnZJKDuKbrfLPcGgPezKgsvRjVxzVKZKF +6kZ5i2fe4VzXueWPckw1vG5LXrpzH1qZBVRobAIbaaMUH6R8ZO4sS/a8gS7Kwuw5 +5D1v98ZVjg8tDymkEK5mnhcHFbXoExZCrJdYUfgiL6QWNJhzT+7xDtMmj3xzh0MZ +rMLEKMtJxLoHLbuDmIzUN3HcTl5JyNy/wyuSZHqf6FTc+C+ExiPmSoHJZ19R3x9T +Abja -----END CERTIFICATE----- - diff --git a/examples/corecell/lns-ttn/tc.trust.example b/examples/corecell/lns-ttn/tc.trust.example new file mode 100644 index 00000000..8225226b --- /dev/null +++ b/examples/corecell/lns-ttn/tc.trust.example @@ -0,0 +1,4 @@ +replace the contents of this file with ca.pem +See: https://www.thethingsindustries.com/docs/concepts/advanced/root-certificates/ +For example: https://www.thethingsindustries.com/docs/concepts/advanced/root-certificates/ca.pem +Or: https://curl.haxx.se/ca/cacert.pem \ No newline at end of file diff --git a/examples/corecell/lns-ttn/tc.uri b/examples/corecell/lns-ttn/tc.uri index 48d6f831..fee7dfa5 100644 --- a/examples/corecell/lns-ttn/tc.uri +++ b/examples/corecell/lns-ttn/tc.uri @@ -1 +1 @@ -wss://lns.us.thethings.network:443 +wss://au1.cloud.thethings.network:8887 diff --git a/examples/corecell/lns-ttn/tc.uri.example b/examples/corecell/lns-ttn/tc.uri.example new file mode 100644 index 00000000..fee7dfa5 --- /dev/null +++ b/examples/corecell/lns-ttn/tc.uri.example @@ -0,0 +1 @@ +wss://au1.cloud.thethings.network:8887 From 91cd7af4676672d207ccd59ccaa813cbbcaa0833 Mon Sep 17 00:00:00 2001 From: SodaWithoutSparkles <64138578+SodaWithoutSparkles@users.noreply.github.com> Date: Sun, 5 Apr 2026 22:18:42 +0800 Subject: [PATCH 4/4] chore: readme placeholder and link to source Signed-off-by: SodaWithoutSparkles <64138578+SodaWithoutSparkles@users.noreply.github.com> --- examples/corecell/lns-ttn/README.md | 2 ++ src/s2e.c | 1 + 2 files changed, 3 insertions(+) diff --git a/examples/corecell/lns-ttn/README.md b/examples/corecell/lns-ttn/README.md index 85f38903..9e650db1 100644 --- a/examples/corecell/lns-ttn/README.md +++ b/examples/corecell/lns-ttn/README.md @@ -21,6 +21,8 @@ To connect to The Things Network, you should 7. After registering, start the station with `./start-station.sh -l ./lns-ttn`. Expecxt it to not connect, but you should see `Station EUI` in the logs. Copy the EUI and paste it into the console's gateway EUI field. The EUI might be missing a leading zeros in each of the sections, so make sure to add those if necessary. For example, if the EUI is `ab:cd:ef:12`, then the zero-padded version would be `00 ab 00 cd 00 ef 00 12`. 8. Stop the station and start it again. It should connect to TTN and you should see `connected to LNS` in the logs. + + ## Troubleshooting ### Connection issues diff --git a/src/s2e.c b/src/s2e.c index 76a6e3ee..af576cc4 100644 --- a/src/s2e.c +++ b/src/s2e.c @@ -1005,6 +1005,7 @@ static int handle_router_config (s2ctx_t* s2ctx, ujdec_t* D) { } // Added AS923 region variants with different naming conventions // Needed to support "Asia 923-925 (Used by TTN Australia - Secondary Channels)" on TTN + // See: https://forum.chirpstack.io/t/downlink-packets-get-dropped-in-the-gateway/14568/5 case J_AS923: { // non-std generic naming region = J_AS923_1; region_s = "AS923-1";