ChirpStack does not receive gateway data

Viewed 31

System Overview

Hardware:

  • Raspberry Pi 5 (Debian Trixie)
  • SenseCAP M2 LoRaWAN Gateway (Model: M2-AU915)
  • Dragino LA66 LoRaWAN device (DEV EUI: A84041D111896C86)

Software Versions:

  • ChirpStack: v4.9.0
  • ChirpStack Gateway Bridge: v4.1.1 (upgraded from v4.0.11)
  • PostgreSQL: 16
  • Redis: 7
  • Mosquitto MQTT: Latest

Region: AU915

Problem Statement

Gateway is successfully receiving LoRaWAN packets and Gateway Bridge is publishing them to MQTT, but ChirpStack is not processing the uplink messages. The gateway and device never complete OTAA join.

What's Working ✅

  1. Gateway to Gateway Bridge communication: Gateway receives packets perfectly

    INFO: [up] Join-Request from A84041D111896C86
    INFO: [up] PUSH_ACK received in 1 ms
    Signal: RSSI -44 dBm, SNR 13.2 dB
    
  2. Gateway Bridge publishing to MQTT: Messages are being published

    gateway/2cf7f1177440004b/event/up
    gateway/2cf7f1177440004b/event/stats
    
  3. MQTT messages visible: Using mosquitto_sub, we can see Join Requests:

    gateway/2cf7f1177440004b/event/up {
      "phyPayload":"AAEBAAAAQUCohmyJEdFBQKhh5ZnXWwQ=",
      "rxInfo":{"gatewayId":"2cf7f1177440004b", "rssi":-36, "snr":9}
    }
    
  4. ChirpStack services running: All services healthy

    • PostgreSQL ✓
    • Redis ✓
    • Mosquitto ✓
    • ChirpStack ✓
    • Gateway Bridge ✓

What's NOT Working ❌

ChirpStack is not receiving or processing gateway uplink messages.

ChirpStack logs show:

  • ✅ MQTT integration initialized
  • ✅ "Setting up gateway backends for the different regions"
  • ✅ Subscribes to: application/+/device/+/command/+
  • ❌ Does NOT subscribe to: gateway/+/event/+
  • ❌ No uplink processing messages
  • ❌ Device never joins network

Configuration Files

ChirpStack Configuration (/etc/chirpstack/chirpstack.toml)

[logging]
level = "debug"

[postgresql]
dsn = "postgres://chirpstack:chirpstack@localhost/chirpstack?sslmode=disable"

[redis]
servers = ["redis://localhost/"]

[gateway]
allow_unknown_gateways = false

[network]
net_id = "000000"
enabled_regions = ["au915"]

[api]
bind = "0.0.0.0:8080"
secret = "you-must-replace-this-secret"

[integration]
enabled = ["mqtt"]

  [integration.mqtt]
  server = "tcp://localhost:1883/"
  json = true

[gateway.backend.mqtt]
server = "tcp://localhost:1883/"
username = ""
password = ""
json = true

  [gateway.backend.mqtt.auth]
  type = "generic"

    [gateway.backend.mqtt.auth.generic]
    servers = ["tcp://localhost:1883/"]

Gateway Bridge Configuration (/etc/chirpstack-gateway-bridge/chirpstack-gateway-bridge.toml)

[general]
log_level=4

[backend]
type="semtech_udp"

[backend.semtech_udp]
udp_bind="0.0.0.0:1700"

[integration]
marshaler="json"

  [integration.mqtt]
  event_topic_template="gateway/{{ .GatewayID }}/event/{{ .EventType }}"
  state_topic_template="gateway/{{ .GatewayID }}/state/{{ .StateType }}"
  command_topic_template="gateway/{{ .GatewayID }}/command/#"

    [integration.mqtt.auth]
    type="generic"

      [integration.mqtt.auth.generic]
      servers=["tcp://127.0.0.1:1883"]
      qos=0
      clean_session=true

ChirpStack Startup Logs

INFO chirpstack::storage: Setting up Redis client
INFO chirpstack::region: Setting up regions
INFO chirpstack::integration::mqtt: Initializing MQTT integration
INFO chirpstack::integration::mqtt: Connecting to MQTT broker
INFO chirpstack::gateway::backend: Setting up gateway backends for the different regions
INFO chirpstack::integration::mqtt: Subscribing to command topic command_topic=application/+/device/+/command/+
INFO chirpstack::api::backend: Backend interfaces API interface is disabled

Note: No subscription to gateway event topics!

Gateway Bridge Startup Logs

INFO starting ChirpStack Gateway Bridge version=4.1.1
INFO backend/semtechudp: starting gateway udp listener addr="0.0.0.0:1700"
INFO integration/mqtt: connected to mqtt broker
INFO integration/mqtt: publishing event event=up topic=gateway/2cf7f1177440004b/event/up

Note: Only MQTT integration, no Redis Streams

Troubleshooting Steps Attempted

  1. ✅ Verified device credentials in ChirpStack database match LA66
  2. ✅ Changed Gateway Bridge marshaler from protobuf to JSON
  3. ✅ Upgraded Gateway Bridge from v4.0.11 to v4.1.1
  4. ✅ Removed EU868 frequency configuration conflicts
  5. ✅ Added explicit [gateway.backend.mqtt] configuration
  6. ✅ Verified MQTT broker connectivity
  7. ✅ Checked PostgreSQL device/keys configuration
  8. ❌ Attempted to add Redis integration to Gateway Bridge (not supported in v4.1.1)

Questions

  1. Does ChirpStack v4.9.0 require Redis Streams for gateway communication?

    • If yes, which Gateway Bridge version supports this?
  2. Why is ChirpStack not subscribing to gateway/+/event/+ MQTT topics?

    • Is there a missing configuration parameter?
  3. Is there a compatibility matrix for ChirpStack and Gateway Bridge versions?

  4. Should ChirpStack v4.9.0 work with MQTT-only Gateway Bridge?

    • Or does it require a different communication method?

Expected Behavior

ChirpStack should:

  1. Subscribe to gateway/+/event/+ MQTT topic
  2. Receive and process Join Request from gateway
  3. Send Join Accept back to device via gateway
  4. Show uplink processing in logs

Additional Information

  • Gateway Bridge configfile template does NOT include [integration.redis] section
  • ChirpStack logs say "Setting up gateway backends" but never subscribes to gateway topics
  • "Backend interfaces API interface is disabled" message appears in ChirpStack logs
  • Device is properly registered with correct DEV EUI and APP KEY
  • All services restart cleanly with no errors

Request

Could someone please advise on:

  1. The correct Gateway Bridge version for ChirpStack v4.9.0
  2. The proper configuration for gateway-to-ChirpStack communication
  3. Whether Redis Streams or MQTT should be used
  4. Any missing configuration parameters

Thank you!


System Details:

  • OS: Debian GNU/Linux trixie/sid (Raspberry Pi 5)
  • Architecture: arm64
  • Installation: Native (not Docker)
2 Answers

A few suggestions:

  • I would suggest using a region-based topic prefix, e.g. au915, or au915_0. By default, ChirpStack uses au915_0 for channels 0 - 7, au915_1 for channels 8 - 15, ... You must configure this in ChirpStack and the ChirpStack Gateway Bridge, such that they are using the same MQTT topics.
  • I would suggest using the Protobuf marshaler in the ChirpStack Gateway Bridge. JSON can be used for debugging, but for production Protobuf is recommended.
  • In your enabled_regions, you have ["au915"] but do you have a region configuration with the same identifier? ChirpStack ships with a couple of examples, e.g. https://github.com/chirpstack/chirpstack/blob/master/chirpstack/configuration/region_au915_0.toml. Most likely there is no config for au915, and thus ChirpStack does not subscribe. See also the topic_prefix config in this example.

Thank you Orne. Your suggestions fixed my problem.

Feb 09 20:53:33 rubberduck chirpstack[1562689]: 2026-02-09T09:53:33.146665Z INFO chirpstack::gateway::backend::mqtt: Message received from gateway region_id="au915_0" topic=au915_0/gateway/2cf7f1177440004b/event/stats qos=AtMostOnce json=false
Feb 09 20:53:33 rubberduck chirpstack[1562689]: 2026-02-09T09:53:33.155829Z INFO stats{gateway_id=2cf7f1177440004b}: chirpstack::storage::gateway: Gateway partially updated gateway_id=2cf7f1177440004b
Feb 09 20:53:33 rubberduck chirpstack[1562689]: 2026-02-09T09:53:33.155925Z INFO stats{gateway_id=2cf7f1177440004b}: chirpstack::storage::metrics: Metrics saved name=gw:2cf7f1177440004b aggregation=HOUR
Feb 09 20:53:33 rubberduck chirpstack[1562689]: 2026-02-09T09:53:33.155952Z INFO stats{gateway_id=2cf7f1177440004b}: chirpstack::storage::metrics: Metrics saved name=gw:2cf7f1177440004b aggregation=DAY
Feb 09 20:53:33 rubberduck chirpstack[1562689]: 2026-02-09T09:53:33.155975Z INFO stats{gateway_id=2cf7f1177440004b}: chirpstack::storage::metrics: Metrics saved name=gw:2cf7f1177440004b aggregation=MONTH